- 1、本文档共5页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
用VC++实现自绘按钮控制
Microsoft Windows以其丰富一致的图形用户界面,简单灵便的操作,被广大用户所接受。对话框就是其中一个非常重要的界面形式,并且Windows为其应用程序的开发者提供了相当丰富的界面资源,许多控制可以方便地加入对话框中。但当我们需要编写一个商业应用,需要一个更友好的图形用户界面时,就会发现资源的贫乏。
Visual C++提供了一个CBitmap Button类在一定程序上缓解了增加新资源的要求。但当我们要求在程序中能动态地改变图形时,我们就不得不考虑放弃CBitmapButton类,而坐下来自己做一点工作了。一个可行的办法就是重载CButton类(即按钮控制)。这样对这块区域的大小、位置和ID号都可以通过AppStadio方便地制作。当然这样作最大的好处还是在于充分利用C++的特性把绘制控制的代码封装了起来,既避免了重复性开发,又使程序变得更简洁,增强了代码的可读性。
现在我们就通过创建一个名叫CColorButton的类来学习这种方法。虽然这是一个功能非常简单的类,通过调用成员函数ChangeColor可改变其颜色,鼠标点中时则高亮边框表示选中。但利用这种思路我们只需添加几个数据成员和重载一个函数就可以方便地实现你所需要的功能。
在创建这个类之前,我们必须先了解WM_DRAWITEM消息。当按钮、组合框、列表框或菜单的某一视觉状况发生变化时,系统就会发送一条WM_DRAWITEM消息给这些控制的拥有者窗口。这个消息的wParam指出这个控制的 id 号,而IParam则是一个指向DRAWITEMSTRUCT结构的指针,该结构存放有关要绘制的项的信息以及绘制所需的类型。
DRAWITEMSTRUCT结构具有如下格式。
typedef struct tagDRAWITEMSTRUCT{
UINT CtlType; // 控制类型
UINT CtlID;// 控制的ID号
UNIT itemID;//菜单项的索引
UINT itemAction;// 说明需要的绘图操作
UINT itemState; // 指明绘图后的可见状态
HWND hwndItem; // 控制的窗口句柄
HDC hDC; // 相关的设备环境
RECT rcItem;//被画控制的边框
DWORD itemData;// 指定与菜单项相联系的应用程序定义的32位值
}DRAWITEMSTRUCT;
其中itemAction 和 itemState决定了需要的绘图操作。itemAction 说明需要的绘图操作,可为下列值中的一个或多个;
值 含 义
ODA_DRAWENTIRE 需要重来全部控制时
ODA_FOCUS 获得或失去输入焦点
ODA_SELECT 选择状态改变
itemState指明当前绘图动作发生之后,项的可见状态。下面是状态标志:
值 含 义
ODS_CHECKD 只用于菜单中
ODS_DISABLE 该项被屏蔽
ODS_FOCUS 该项具有输入焦点
ODS_GRAYED 只用于菜单中
ODS_SELECT 该项处于被选中状态
利用VC++编程会发现,当按钮控制接收到WM_DRMAWITEM消息时会调用Cbotton类的DrawItem函数。因此我们要做的就是利用C++的多态性通过重载CButton类的Drawitem函数来响应MW-DRAWITEM消息。
下面我们就实际构造一个CColorButton类。
class ccolorButton:public CButton
{
private:
COLORREF m_color:
public:
CColorButton():CButton(),m_color(0){};
//构造函数
void ChangeColor(COLORREF color); //改变颜色
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);//重载的函数
};
//重载的虚函数
void CColorButton::DrawItem(LPDRAWITEMSTRUCT lpDrawIt
emtruct)
{
CDC dc;
dc.Attach(lpDrawItemStruct-hDC); //得到绘制的设备环境CDC
VERIFY( lpDrawItemStruct-CtlType==ODT_BUTTON);
if(lpDrawItemStruct-itemAction ODA_DRAWENTIRE)
{
//重绘整个控制
CBrush brush(color);
dc.FillRect((lpDrawItemStruct-rcItem),b
文档评论(0)