使用 GdiDrawStream 函数的 WowButtons






3.19/5 (27投票s)
一个使用 GdiDrawStream 函数的非常简单的自定义绘制按钮。
引言
ThemeButton
是一个从 CButton
派生的类。它是一个非常简单的图形按钮,具有代表五种按钮状态的特殊位图:正常、悬停、按下、禁用和默认。按钮的绘制方式与 Windows 绘制其主题可变按钮的方式相同。每个主题位图都有一个背景颜色并且是透明的。
为了绘制按钮,我使用函数 GdiDrawStream
;这是一个私有函数。我将解释这个函数是如何工作的以及它有哪些参数。在该函数中要使用的主要内容是 GdiDrawStreamStruct
结构体。我认为该函数具有如下参数:GetObject
、设备对象的句柄、结构体 GdiDrawStreamStruct
的大小以及指向该结构体的指针。
使用代码
ThemeButton
类有一个公共函数,即 InitControl
。此函数为 Macintosh、Vista、XP 和 Luna Longhorn 样式提供了默认参数。
函数的参数如下
- 位图资源标识符。
- 位图列表方向:垂直或水平。
- 位图列表中每个图像的像素宽度。
- 位图列表中每个图像的像素高度。
- 位图的透明颜色。
- 按钮文本的字体名称。
- 按钮绘制样式:Mac、Vista、XP 或 Luna Longhorn 样式。
BOOL CWowButtonsDlg::OnInitDialog() { CDialog::OnInitDialog(); // Set the icon for this dialog. // The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon m_vista_but1.InitControl(IDB_VISTA_PUSHBUTTON_BMP,TRUE,21,23,RGB(0,0,0), _T("Tahoma"),ThemeButton::VISTA_STYLE); m_vista_but2.InitControl(IDB_VISTA_PUSHBUTTON_BMP,TRUE,21,23,RGB(0,0,0), _T("Tahoma"),ThemeButton::VISTA_STYLE); m_vista_but3.InitControl(IDB_VISTA_PUSHBUTTON_BMP,TRUE,21,23,RGB(0,0,0), _T("Tahoma"),ThemeButton::VISTA_STYLE); m_vista_but4.InitControl(IDB_VISTA_PUSHBUTTON_BMP,TRUE,21,23,RGB(0,0,0), _T("Tahoma"),ThemeButton::VISTA_STYLE); m_mac_but1 .InitControl(IDB_MAC_PUSHBUTTON_BMP, TRUE,34,23,RGB(0,0,0),_T("Tahoma"),ThemeButton::MAC_STYLE); m_mac_but2 .InitControl(IDB_MAC_PUSHBUTTON_BMP, TRUE,34,23,RGB(0,0,0),_T("Tahoma"),ThemeButton::MAC_STYLE); m_mac_but3 .InitControl(IDB_MAC_PUSHBUTTON_BMP, TRUE,34,23,RGB(0,0,0),_T("Tahoma"),ThemeButton::MAC_STYLE); m_mac_but4 .InitControl(IDB_MAC_PUSHBUTTON_BMP, TRUE,34,23,RGB(0,0,0),_T("Tahoma"),ThemeButton::MAC_STYLE); m_xp_but1 .InitControl(IDB_XP_PUSHBUTTON_BMP, TRUE,20,23,RGB(0,0,0),_T("Tahoma"),ThemeButton::XP_STYLE); m_xp_but2 .InitControl(IDB_XP_PUSHBUTTON_BMP, TRUE,20,23,RGB(0,0,0),_T("Tahoma"),ThemeButton::XP_STYLE); m_xp_but3 .InitControl(IDB_XP_PUSHBUTTON_BMP, TRUE,20,23,RGB(0,0,0),_T("Tahoma"),ThemeButton::XP_STYLE); m_xp_but4 .InitControl(IDB_XP_PUSHBUTTON_BMP, TRUE,20,23,RGB(0,0,0),_T("Tahoma"),ThemeButton::XP_STYLE); m_luna_but1 .InitControl(IDB_LONGHORN_PUSHBUTTON, TRUE,28,23,RGB(0,0,0),_T("Tahoma"),ThemeButton::LUNA_LONGHORN); m_luna_but2 .InitControl(IDB_LONGHORN_PUSHBUTTON, TRUE,28,23,RGB(0,0,0),_T("Tahoma"),ThemeButton::LUNA_LONGHORN); m_luna_but3 .InitControl(IDB_LONGHORN_PUSHBUTTON, TRUE,28,23,RGB(0,0,0),_T("Tahoma"),ThemeButton::LUNA_LONGHORN); m_luna_but4 .InitControl(IDB_LONGHORN_PUSHBUTTON, TRUE,28,23,RGB(0,0,0),_T("Tahoma"),ThemeButton::LUNA_LONGHORN); return TRUE; // return TRUE unless you set the focus to a control }
更新 (2006年7月3日)
- 现在,函数
LoadImage
使用LR_CREATEDIBSECTION
标志被调用。
更新 (2007年3月7日)
- 我将类名更改为 ThameButton。创建新的头文件
GdiDrawStream.h
用于绘制函数、标志和结构体声明。我添加了按钮的 XP 和 Luna Longhorn 样式。