类CButton提供了对Windows按钮控件的操作。按钮控件是一个小的矩形子窗口,可以通过单击选中(按下)或不选中。按钮可以单独使用,也可以成组使用,它还可以具有文本标题。在用户单击它的时候,按钮通常要改变显示外观。
继承体系
CObject
└CCmdTarget
└CWnd
└CButton
详细资料
典型的按钮控件有:复选框、单选钮和下压式按钮(push button)。一个CButton对象可以是它们中的一种,这由它的按钮风格和成员函数Create的初始化决定。
此外,类CButtonBitmap是从类CButton继承而来的,不过它支持按钮的图像标签。一个CButtonBitmap对象可以分别为它的四种状态(未按下、按下、获得焦点和禁止存取)设置不同的位图。
既可以从对话框模板中创建一个按钮控件,也可以直接在代码中创建。
无论哪种情况,都要先调用构造函数CButton构造一个CButton对象,然后调用成员函数Create创建Windows按钮控件并应用到CButton对象上。
在一个从类CButton派生出来的类中,构造可以一步完成。程序员可以为这个派生类编写一个构造函数,并在其中调用Create函数。
如果想处理Windows的通知消息,如位图按钮控件发给它的父对象(通常是从CDialog继承来的)的消息,就要在父对象中加入消息映射入口以及处理每个消息的成员函数。
每个消息映射入口的格式如下:
ON_Notification(id, memberFxn)
其中id指定了发送通知的控件的子窗口的ID,而memberFxn指定了处理该通知的父对象中的成员函数名。
父对象的函数原型格式如下:
afx_msg void memberFxn( );
可能的消息映射入口如下:
映射入口 何时向父对象发送消息ON_BN_CLICKED 用户单击按钮时ON_BN_DOUBLECLICKED 用户双击按钮时
如果在对话框资源中创建了CButton对象,则在用户关闭该对话框时会自动撤消这个CButton对象。如果在窗口中创建了CButton对象,就可能需要自己撤消它。如果是用new函数在内存的堆中创建该对象的,则在用户关闭该窗口按钮控件时,必须用delete函数撤消它。如果在堆栈中创建了该对象,或者它嵌入在父对话框对象中,系统会自动撤消它。
#include
成员列表
CButton类的成员
构造函数
CButton 构造一个CButton对象
初始化函数
Create 创建Windows按钮控件并在CButton对象上应用
CButton::Create 创建一个CButton对象
BOOL Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
lpszCaption是按钮上显示的文本;
dwStyle指定按钮风格,可以是按钮风格与窗口风格的组合,取值有:
窗口风格
WS_CHILD 子窗口,必须有
WS_VISIBLE 窗口可见,一般都有
WS_DISABLED 禁用窗口,创建初始状态为灰色不可用的按钮时使用
WS_TABSTOP 可用Tab键选择
WS_GROUP 成组,用于成组的单选按钮中的第一个按钮
按钮风格
BS_PUSHBUTTON 下压式按钮,也即普通按钮
BS_AUTORADIOBUTTON 含自动选中状态的单选按钮
BS_RADIOBUTTON 单选按钮,不常用
BS_AUTOCHECKBOX 含自动选中状态的复选按钮
BS_CHECKBOX 复选按钮,不常用
BS_AUTO3STATE 含自动选中状态的三态复选按钮
BS_3STATE 三态复选按钮,不常用
以上风格指定了创建的按钮类型,不能同时使用,但必须有其一。
BS_BITMAP 按钮上将显示位图
BS_DEFPUSHBUTTON 设置为默认按钮,只用于下压式按钮,一个对话框中只能指定一个默认按钮
rect指定按钮的大小和位置;
pParentWnd指示拥有按钮的父窗口,不能为NULL;
nID指定与按钮关联的ID号,用上一步创建的ID号。
返回值:若成功,返回非0;否则返回0 CButton::DrawItem 重载该函数绘制一个CButton对象,由框架调用该函数
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
参数:lpDrawItemStruct指向包含绘制项信息和要求类型的LPDRAWITEMSTRUCT结构的长指针
CButton::SetCheck 设置或复位单选按钮和复选按钮的选择状态
void SetCheck(int nCheck);
参数:nCheck 指定设置的状态,0为未选择,1为选中,2为不确定
操作
GetState 检索按钮控件的选中状态、加亮状态和获得焦点状态
SetState 设置按钮控件的加亮状态
GetCheck 检索按钮控件的选中状态
SetCheck 设置按钮控件的选中状态
GetButtonStyle 检索按钮控件的风格
SetButtonStyle 设置按钮控件的风格
GetIcon 检索此前调用SetIcon设置的图标句柄
SetIcon 指定一个在按钮上显示的图标
GetBitmap 检索此前调用SetBitmap设置的位图的句柄
SetBitmap 设置在按钮上显示的位图
GetCursor 检索此前调用SetCursor设置的光标图像的句柄
SetCursor 设置在按钮上显示的光标图像
可覆盖的函数
DrawItem 可以覆盖它来绘制自定义的CButton对象
//========================================================================
//TITLE:
// CButton使用详解
//========================================================================
恩,不用怀疑了,这个CButton类也不是微软的通用控件,而是和我之前写的CText及CProgress一样,都是为了方便大面积需要贴图的程序,而模仿微软的特性来写的一个类.
就让我们直接看看例程代码.
CButton m_Btn;
//
设置该按钮可用
m_Btn.SetEnable(TRUE);
//
设置实例句柄
m_Btn.SetHinstance(hInst);
//
设置按钮的位置
m_Btn.SetPosition(
&
RC_BTN);
//
设置普通状态,按下状态,无效状态的图片信息
m_Btn.SetImgInfoDisable(
&
IMG_DISABLE);
m_Btn.SetImgInfoEnable(
&
IMG_ENABLE);
m_Btn.SetImgInfoPush(
&
IMG_PUSH);
//
设置透明绘制
m_Btn.SetTransparent(TRUE);
//
设置透明色
m_Btn.SetTransparentColor(TRANSPARENT_COLOR);
//
绘制背景
m_Btn.Draw(hdc);
//
判断是否点击该按钮
if
(m_Btn.CheckTap(
&
pt)
==
TRUE)
{
//Do something..
}
恩,就这么简单,也没什么很特别的地方,仅仅主要是方便大量采用贴图的程序而已.
CButton类完整源码:
//////////////////////////////////////////////////////////////////////
//
Button.h: interface for the CButton class.
//
//
Version:
//
1.1.1
//
Data:
//
2007.03.31
//////////////////////////////////////////////////////////////////////
#ifndef BUTTON_H
#define
BUTTON_H
#include
"
CtrlCommon.h
"
//
---------------------------------------------------------------------------
//
Enum data
//
For the button draw
enum
ButtonDrawType
{
BTN_DRAW_AUTO,
BTN_DRAW_PUSH,
BTN_DRAW_ENABLE,
BTN_DRAW_DISABLE
}
;
//
------------------------------------------------------------------------------
//
Class
class
CButton
{
public:
void SetTransparent(BOOL bTran);
void SetTransparentColor(COLORREF crColor);
void GetPosition(RECT *prcOut);
BOOL CheckTap(const LPPOINT ppt);
void SetPosition(const RECT * pRc);
void SetImgInfoPush(const DISPIMAGEINFO *pImgInfo);
void SetImgInfoDisable(const DISPIMAGEINFO *pImgInfo);
void SetImgInfoEnable(const DISPIMAGEINFO *pImgInfo);
void SetHinstance(HINSTANCE hInst);
BOOL Draw(HDC hdc, ButtonDrawType btnDraw = BTN_DRAW_AUTO);
void SetEnable(BOOL bEnable);
BOOL GetEnable();
CButton();
virtual ~CButton();
protected:
BOOL m_bEnable;
RECT m_rcWndPos;
DISPIMAGEINFO m_ImgPush;
DISPIMAGEINFO m_ImgEnable;
DISPIMAGEINFO m_ImgDisable;
HANDLE m_hBmpPush;
HANDLE m_hBmpEnable;
HANDLE m_hBmpDisable;
HINSTANCE m_hInst;
COLORREF m_crTranColor;
BOOL m_bTran;
}
;
#endif
//
#ifndef BUTTON_H
//////////////////////////////////////////////////////////////
//
Button.cpp: implementation of the CButton class.
//
//////////////////////////////////////////////////////////////////////
#include
"
stdafx.h
"
#include
"
Button.h
"
//
-------------------------------------------------------------------
//
Macro define
#define
DEFAULT_TRANSPARENT_COLOR RGB(125,125,125)
//
--------------------------------------------------------------------
//////////////////////////////////////////////////////////////////////
//
Construction/Destruction
//////////////////////////////////////////////////////////////////////
CButton::CButton()
{
m_bEnable = TRUE;
memset(&m_rcWndPos,0,sizeof(m_rcWndPos));
memset(&m_ImgPush,0,sizeof(m_ImgPush));
memset(&m_ImgEnable,0,sizeof(m_ImgEnable));
memset(&m_ImgDisable,0,sizeof(m_ImgDisable));
m_hBmpPush = NULL;
m_hBmpEnable = NULL;
m_hBmpDisable = NULL;
m_hInst = NULL;
m_crTranColor = DEFAULT_TRANSPARENT_COLOR;
m_bTran = FALSE;
}
CButton::
~
CButton()
{
if(m_hBmpPush != NULL)
{
DeleteObject(m_hBmpPush);
m_hBmpPush = NULL;
}
if(m_hBmpEnable != NULL)
{
DeleteObject(m_hBmpEnable);
m_hBmpEnable = NULL;
}
if(m_hBmpDisable != NULL)
{
DeleteObject(m_hBmpDisable);
m_hBmpDisable = NULL;
}
}
//
--------------------------------------------------------------------
//
Description:
//
The button is enable or not
//
//
-------------------------------------------------------------------
BOOL CButton::GetEnable()
{
return m_bEnable;
}
//
--------------------------------------------------------------------
//
Description:
//
Set the button status
//
//
-------------------------------------------------------------------
void
CButton::SetEnable(BOOL bEnable)
{
m_bEnable = bEnable;
}
//
--------------------------------------------------------------------
//
Description:
//
Draw the button
//
//
-------------------------------------------------------------------
BOOL CButton::Draw(HDC hdc, ButtonDrawType btnDraw)
{
if(m_hInst == NULL)
{
return FALSE;
}
HANDLE hBmp = NULL;
PDISPIMAGEINFO pInfo;
if(btnDraw == BTN_DRAW_AUTO)
{
if(m_bEnable == TRUE)
{
if(m_hBmpEnable == NULL)
{
m_hBmpEnable = LoadImage(m_hInst,MAKEINTRESOURCE(m_ImgEnable.imgID),IMAGE_BITMAP,0,0,0);
}
hBmp = m_hBmpEnable;
pInfo = &m_ImgEnable;
}
else
{
if(m_hBmpDisable == NULL)
{
m_hBmpDisable = LoadImage(m_hInst,MAKEINTRESOURCE(m_ImgDisable.imgID),IMAGE_BITMAP,0,0,0);
}
hBmp = m_hBmpDisable;
pInfo = &m_ImgDisable;
}
}
else if(btnDraw == BTN_DRAW_ENABLE)
{
if(m_hBmpEnable == NULL)
{
m_hBmpEnable = LoadImage(m_hInst,MAKEINTRESOURCE(m_ImgEnable.imgID),IMAGE_BITMAP,0,0,0);
}
hBmp = m_hBmpEnable;
pInfo = &m_ImgEnable;
}
else if(btnDraw == BTN_DRAW_DISABLE)
{
if(m_hBmpDisable == NULL)
{
m_hBmpDisable = LoadImage(m_hInst,MAKEINTRESOURCE(m_ImgDisable.imgID),IMAGE_BITMAP,0,0,0);
}
hBmp = m_hBmpDisable;
pInfo = &m_ImgDisable;
}
else if(btnDraw == BTN_DRAW_PUSH)
{
if(m_hBmpPush == NULL)
{
m_hBmpPush = LoadImage(m_hInst,MAKEINTRESOURCE(m_ImgPush.imgID),IMAGE_BITMAP,0,0,0);
}
hBmp = m_hBmpPush;
pInfo = &m_ImgPush;
}
//Create a DC that matches the device
HDC hdcMem = CreateCompatibleDC(hdc);
//Select the bitmap into to the compatible device context
HGDIOBJ hOldSel = SelectObject(hdcMem,hBmp);
//Copy the bitmap image from the memory DC to the screen DC
if(m_bTran == FALSE)
{
StretchBlt(hdc,m_rcWndPos.left,m_rcWndPos.top,(m_rcWndPos.right - m_rcWndPos.left),(m_rcWndPos.bottom - m_rcWndPos.top),
hdcMem,pInfo->left,pInfo->top,(pInfo->right - pInfo->left),(pInfo->bottom - pInfo->top),SRCCOPY);
}
else
{
TransparentBlt(hdc,m_rcWndPos.left,m_rcWndPos.top,(m_rcWndPos.right - m_rcWndPos.left),(m_rcWndPos.bottom - m_rcWndPos.top),
hdcMem,pInfo->left,pInfo->top,(pInfo->right - pInfo->left),(pInfo->bottom - pInfo->top),m_crTranColor);
}
//Restore original bitmap selection and destroy the memory DC
SelectObject(hdcMem,hOldSel);
DeleteDC(hdcMem);
return TRUE;
}
//
--------------------------------------------------------------------
//
Description:
//
Set the handle of instance
//
//
-------------------------------------------------------------------
void
CButton::SetHinstance(HINSTANCE hInst)
{
m_hInst = hInst;
}
//
--------------------------------------------------------------------
//
Description:
//
Set the image of enable
//
//
-------------------------------------------------------------------
void
CButton::SetImgInfoEnable(
const
DISPIMAGEINFO
*
pImgInfo)
{
if(m_hBmpEnable != NULL)
{
DeleteObject(m_hBmpEnable);
m_hBmpEnable = NULL;
}
m_ImgEnable = *pImgInfo;
}
//
--------------------------------------------------------------------
//
Description:
//
Set the image of disable
//
//
-------------------------------------------------------------------
void
CButton::SetImgInfoDisable(
const
DISPIMAGEINFO
*
pImgInfo)
{
if(m_hBmpDisable != NULL)
{
DeleteObject(m_hBmpDisable);
m_hBmpDisable = NULL;
}
m_ImgDisable = *pImgInfo;
}
//
--------------------------------------------------------------------
//
Description:
//
Set the image of push
//
//
-------------------------------------------------------------------
void
CButton::SetImgInfoPush(
const
DISPIMAGEINFO
*
pImgInfo)
{
if(m_hBmpPush != NULL)
{
DeleteObject(m_hBmpPush);
m_hBmpPush = NULL;
}
m_ImgPush = *pImgInfo;
}
//
--------------------------------------------------------------------
//
Description:
//
Set the button position
//
//
-------------------------------------------------------------------
void
CButton::SetPosition(
const
RECT
*
pRc)
{
m_rcWndPos = *pRc;
}
//
--------------------------------------------------------------------
//
Description:
//
Check tapped position in the area.If the button is disable,
//
it would return FALSE.
//
//
-------------------------------------------------------------------
BOOL CButton::CheckTap(
const
LPPOINT ppt)
{
if(m_bEnable == FALSE)
{
return FALSE;
}
if( ppt->x >= m_rcWndPos.left && ppt->x <= m_rcWndPos.right && ppt->y >= m_rcWndPos.top && ppt->y <= m_rcWndPos.bottom)
{
return TRUE;
}
else
{
return FALSE;
}
}
//
--------------------------------------------------------------------
//
Description:
//
Get the position as rect
//
//
---------------------------------------------------------------------
void
CButton::GetPosition(RECT
*
prcOut)
{
*prcOut = m_rcWndPos;
}
//
--------------------------------------------------------------------
//
Description:
//
Set the transparent color
//
//
-------------------------------------------------------------------
void
CButton::SetTransparentColor(COLORREF crColor)
{
m_crTranColor = crColor;
}
//
--------------------------------------------------------------------
//
Description:
//
Set the transparent mode
//
//
Parameters:
//
bTran:[in]
//
TRUE - Don't draw the transparent color
//
FALSE - Draw all the color
//
//
-------------------------------------------------------------------
void
CButton::SetTransparent(BOOL bTran)
{
m_bTran = bTran;
}