65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 GdiDrawStream 函数的 WowButtons

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.19/5 (27投票s)

2006年6月23日

CPOL

1分钟阅读

viewsIcon

105286

downloadIcon

2206

一个使用 GdiDrawStream 函数的非常简单的自定义绘制按钮。

Sample Image

引言

ThemeButton 是一个从 CButton 派生的类。它是一个非常简单的图形按钮,具有代表五种按钮状态的特殊位图:正常、悬停、按下、禁用和默认。按钮的绘制方式与 Windows 绘制其主题可变按钮的方式相同。每个主题位图都有一个背景颜色并且是透明的。

为了绘制按钮,我使用函数 GdiDrawStream;这是一个私有函数。我将解释这个函数是如何工作的以及它有哪些参数。在该函数中要使用的主要内容是 GdiDrawStreamStruct 结构体。我认为该函数具有如下参数:GetObject、设备对象的句柄、结构体 GdiDrawStreamStruct 的大小以及指向该结构体的指针。

使用代码

ThemeButton 类有一个公共函数,即 InitControl。此函数为 Macintosh、Vista、XP 和 Luna Longhorn 样式提供了默认参数。

函数的参数如下

  1. 位图资源标识符。
  2. 位图列表方向:垂直或水平。
  3. 位图列表中每个图像的像素宽度。
  4. 位图列表中每个图像的像素高度。
  5. 位图的透明颜色。
  6. 按钮文本的字体名称。
  7. 按钮绘制样式: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 样式。
© . All rights reserved.