站内搜索

扩展MFC类库建立自己的界面类库(1)

作者:雷神
转载请联系作者

    除非应用程序只是给自己使用,否则它的价值必须由别人决定。应用程序的界面对用户的影响很大――无论程序代码如何高效,功能如何强大,如果用户发现它太难使用,那么这个程序就不会得到广泛的应用。摘自《Visual C++图形用户界面开发指南》

    如何建立一个优秀的应用程序界面呢,当然通过MFC可以很轻松的生成应用程序的基本框架,使得应用程序有着标准的WINDOWS程序的“面容”,不过如果你想给它整整容那就需要扩展MFC类库建立自己的界面类库。

按钮类

CObject类的派生结构

CObject
|-CCmdTarget
|-CWnd
|-CButton
|-CBitmapButton


【说 明】CButton类提供Windows按钮控件的功能。常用的按钮控件风格有检取框风格、单选按钮风格和标准风格。按钮控件的风格由成员函数Create在初始化时指定。从CButton类派生的CBitmapButton类支持创建用位图代替文本的按钮控件。CBitmapButton可以具有几个独立的位图分别代表按钮的上、下、聚焦和禁止状态。当CButton类的对象被点击时将向父窗口发送消息.应用程序可以从对话模板创建按钮控件,也可用代码直接创建。在两种情况中,都要首先调用构造函数Cbutton()构造CButton类的对象;然后调用成员函数Create()创建Windows按钮控件,并将它附着于CButton类的对象。用CButton创建按钮可以一步实现。在派生类中设计构造函数,并在其中直接调用Create函数。如果希望处理由按钮控件向其父窗口类发送Windows的通告消息则需要在相应的父窗口类中添加消息映射入口和消息处理函数。

每个消息映射入口都具有以下形式:

ON_Notification(id,memberFxn)

其中id指定了发送通告信息的控件id,而memberFxn则指定了用于处理控件通告的消息成员函数。
消息处理函数如下:

afx_msg void memberFxn();

【库 名】
【成员函数】
(1)CButton(); //构造一个空的CButton类的对象。
(2)BOOL Create(LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);

【返回值】该成员函数调用成功返回非零值,否则返回零。

【参 数】

lpszCaption //指定按钮控件的文本内容。
dwStyle //指定按钮控件的风格。按钮可以使用窗口风格和下列按钮风格的组合。
BS_3STATE //创建一个3态检取框风格的按钮控件,当使用者选中一个未被选中过的控件后,该控件的 选择框将不改变其状态,可以使用成员函数SetCheck设置该标记。
BS_AUTO3STATE //类似于3态检取框风格的按钮控件,当使用者选中一个未被选中过的控件后,该控件的选 择框将改变其状态。
BS_AUTOCHECKBOX //类似于检取框风格的按钮控件,当使用者选中一个未被选中过的控件后, 在该控件的选 择框中将出现选中的标记,当使用者再次选中该控件时选中的标记消失。
BS_AUTORADIOBUTTON //类似于单选按钮风格的按钮控件, 当使用者选中一个未被选中过的控件后,该控件将被自 动加亮并在选择框出现选中的标记,同时将同组中带有选中标记且风格一致的控件的选中标 记删除。
BS_BITMAP //指定在按钮控件上显示一个位图,由成员函数SetBitmap设置具体要显示的位图。
BS_BOTTOM //指定在按钮控件上显示的内容下对齐。
BS_CENTER //指定在按钮控件上显示的内容在水平方向上居中。
BS_CHECKBOX //创建一个检取框风格的按钮控件,不同于BS_AUTOCHECKBOX风格的控件,当使用者 选择了一个未被选中过的控件后,在该控件的选择框中将不会出现选中的标记,此时可以使 用成员函数SetCheck设置该标记。
BS_DEFPUSHBUTTON //创建一个具有深黑色边框的按钮控件,使用者可以通过按Enter键选择该控件,该风格可 以使用户快速的选择出最合适的选项(一般为缺省选项)。
BS_FLAT //指定按钮控件以二维效果显示,而不是默认的三维效果。
BS_GROUPBOX //创建一个可将其它按钮控件分组的按钮控件。该控件的文本将显示在该矩形的左上角。
BS_ICON //指定在按钮控件上显示一个图标,由成员函数SetIcon设置具体要显示的图标。
BS_LEFT //指定在按钮控件上显示的内容左对齐。
BS_LEFTTEXT //当与检取框风格、单选按钮风格或3态检取框风格组合使用时选择框出现在该控件的右侧。
BS_MULTILINE //当在按钮控件上显示的字符太多,该风格允许文本在按钮上显示多行。
BS_NOTIFY //指定按钮控件在被双击、聚焦和失去焦点时向父窗口发送消息。
BS_OWNERDRAW //创建一个自画的按钮控件,当该控件在视觉外观发生变化时,将调用成员函数DrawItem, CBitmapButton类必须设置该风格。
BS_PUSHBUTTON //创建一个标准风格的按钮控件,在使用者选择了该控件后,该控件将向其父窗口发送一条 WM_COMMAND消息。
BS_PUSHLIKE //与检取框风格、单选按钮风格或3态检取框风格组合使用,使该控件外表与标准按钮控件 一致。当该控件没有被按下或选中时控件外表凸起,当该控件被按下或选中时控件外表凹陷。
BS_RADIOBUTTON //创建一个单选按钮风格的按钮控件, 当使用者选中一个未被选中过的控件后,该控件将被 自动加亮,但不会移动选中的标记,可以使用成员函数SetCheck设置该标记。
BS_RIGHT //指定在按钮控件上显示的内容右对齐。
BS_RIGHTBUTTON //当与检取框风格、单选按钮风格或3态检取框风格组合使用时选择框出现在该控件的右侧。
BS_TEXT //指定在按钮控件上显示文本,文本内容可以在初始化时指定也可以由成员函数 SetWindowText设置。如控件没有设置BS_ICON或BS_BITMAP风格则默认为BS_TEXT。
BS_TOP //指定在按钮控件上显示的内容上对齐。
BS_VCENTER //指定在按钮控件上显示的内容在垂直方向上居中。
rect //指定按钮控件在父窗口中的位置和大小。
pParentWnd //指定按钮控件的父窗口,不能为NULL。
nID //指定按钮控件使用的资源标识。

【注 释】应用程序用两步构造一个CButton类的对象。首先调用构造函数,然后调用Create创建Windows按钮控件,并将它附着于CButton类的对象。

(3)virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
【参 数】 lpDrawItemStruct //一个指向DRAWITEMSTRUCT结构的长整型指针,该结构中包含有关被绘制项的信息和 要求的绘制类型。
【注 释】当自画风格的按钮控件的可见部分发生变化时,此成员函数被调用来重绘控件。
(4)HBITMAP GetBitmap() const;
【返回值】获得由成员函数SetBitmap设置的位图的句柄。
(5)UINT GetButtonStyle() const;
【返回值】返回某个按钮控件风格的代码,它只返回按钮控件风格的代码而不会返回按钮控件的窗口风格代码。含义参见成员函数SetButtonStyle。
(6)int GetCheck() const;
【返回值】返回某个检取框风格、单选按钮风格或3态检取框风格按钮控件的检取状态。含义参见成员函数SetCheck。
(7)HCURSOR GetCursor();
【返回值】获得由成员函数SetCursor设置的光标的句柄。
(8)HICON GetIcon() const;
【返回值】获得由成员函数SetIcon设置的图标的句柄。
(9)UINT GetState() const;
【返回值】返回某个按钮控件的当前状态。它包括检取状态、加亮状态和焦点状态三部分。0x0008表示按钮控件拥有焦点,0x0004表示按钮控件被加亮,检取状态值的含义见函数SetCheck。
(10)HBITMAP SetBitmap(HBITMAP hBitmap);
【返回值】返回先前设置在按钮控件上的位图的句柄。
【参 数】 hBitmap //指定将显示在按钮控件上的位图的句柄。
【注 释】在使用该成员函数之前必须在初始化时设置BS_BITMAP标志,否则无效。可能是由于按钮类中没有复制被设置位图的句柄,所以设置位图的句柄的作用域应至少等于按钮控件变量的作用域以保证在按钮重画时显示正确。
(11)void SetButtonStyle(UINT nStyle, BOOL bRedraw = TRUE);
【参 数】nStyle //指定按钮控件风格的代码。见成员函数Create。
bRedraw = TRUE //当该参数非零时重画按钮控件,否则不重画。缺省设置为重画。
【注 释】改变某个按钮控件的风格。
该成员函数只能设置按钮控件的风格代码,而不能设置窗口的风格代码,窗口风格代码只能创建时设置。 该成员函数对于风格代码BS_LEFTTEXT、BS_TEXT、BS_BITMAP、BS_ICON、BS_TOP、BS_BOTTOM、BS_LEFT、BS_RIGHT、BS_RIGHTBUTTON、BS_PUSHLIKE、BS_MULTILINE、BS_FLAT和BS_NOTIFY设置无效,上述风格代码均须在初始化时设置。
(12)void SetCheck(int nCheck);
【参 数】nCheck //指定检取的状态,可以为以下值。
定义的常量值及含义
BST_UNCHECKED 0 没有被选中
BST_CHECHED 1 被选中了
BST_INDETERMINATE 2 模糊状态
【注 释】设置某个检取框风格、单选按钮风格或3态检取框风格按钮控件的检取状态。
(13)HCURSOR SetCursor(HCURSOR hCursor);
【返回值】返回先前设置在按钮控件上的光标的句柄。
【参 数】hCursor //指定将显示在按钮控件上的光标的句柄。
【注 释】在使用该成员函数之前必须在初始化时设置BS_ICON标志,否则无效。可能是由于按钮类中没有复制被设置光标的句柄,所以设置光标的句柄的作用域应至少等于按钮控件变量的作用域以保证在按钮重画时显示正确。
(14)HICON SetIcon(HICON hIcon);
【返回值】返回先前设置在按钮控件上的图标的句柄。
【参 数】hIcon //指定将显示在按钮控件上的图标的句柄。
【注 释】在使用该成员函数之前必须在初始化时设置BS_ICON标志,否则无效。可能是由于按钮类中没有复制被设置图标的句柄,所以设置图标的句柄的作用域应至少等于按钮控件变量的作用域以保证在按钮重画时显示正确。
(15)void SetState(BOOL bHighlight);
【参 数】bHighlight //对于标准风格的按钮控件,参数为TURE时按钮控件被按下,为FALSE时控件被弹起。
对于检取框风格、单选按钮风格或3态检取框风格的按钮控件,参数为TURE时控件的选择框被加亮,为FALSE时控件的选择框恢复。
【注 释】将某个按钮控件设置为加亮状态。

以上我们对MFC的Cbutton类有了一个详细的了解,由于MFC支持自绘制(owner-draw)概念,自绘制的控制类,通过调用DrawItem() 函数实现控件的绘制,由于控件绘制,消息检测和消息比较代码是在控件中实现而不足在拥有控件的窗口中实现,因而叫自绘制。因而通过重载虚函数virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);函数来控制控件的外观和行为,实现控制所需要的参数,都包含在LPDRAWITEMSTRUCT结构中。

lpDrawItemStruct:是指向DRAWITEMSTRUCT结构的指针,它为需要自己绘制的对象(控件或菜单项)提供了必要的信息,并决定了绘制的方式和细节,需要自己绘制的控件或菜单项的父窗口,将指向该结构的指针作为WM_DRAWITEM消息的lParam参数。

DRAWITEMSTRUCT 结构:

typedef struct tagDRAWITEMSTRUCT
{
UINT CtlType;
UINT CtlID;
UINT itemID;
UINT itemAction;
UINT itemState;
HWND hwndItem;
HDC hDC;
RECT rcItem;
DWORD itemData;
} DRAWITEMSTRUCT;


【结构成员】

CtlType――指定了控件的类型,有以下几种取值:
ODT_BUTTON 自绘制按钮
ODT_COMBOBOX 自绘制组合框
ODT_LISTBOX 自绘制列表框
ODT_MENU 自绘制菜单项
ODT_LISTVIEW 自绘制列表视
ODT_STATIC 自绘制静态控件
ODT_TAB Tab控件
CtlID――指定了需要自绘制的控件ID,而对于菜单项无需使用。
itemID――是菜单项的ID或列表框或组合框的索引。
itemAction――绘制动作,有以下几种取值:
ODA_DRAWENTIRE 整个控件都需被绘制
ODA_FOCUS 控件需要获得或失去焦点时被绘制
ODA_SELECT 控件需要在被选中时绘制
itemState――当绘制完成后的,所绘项的可见状态,有以下几种取值:
ODS_CHECKED 如果菜单项将被选中,则设置该值(只对菜单项有效)
ODS_DISABLED 如果绘制项将被禁止,则设置该值
ODS_FOCUS 如果绘制项需要输入焦点,则绘制该值
ODS_GRAYED 如果绘制项需要被灰色显示,则设置该值
ODS_SELECTED 如果绘制项需要被设置为选中状态,则设置该值
ODS_COMBOBOXEDIT 在自绘制组合框中只绘制选择区域
ODS_DEFAULT 自绘制项为默认项
hwndItem――指定了组合框、列表框和按钮等自绘制控件的窗口句柄;包含菜单项的菜单句柄(HMENU)
hDC――设备环境的句柄。
rcItem――控件外观大小的矩形。
itemData――传递给控件的值。

  • 上一篇:让你的控制台程序也支持自动补齐
  • 下一篇:经典:用API 作简繁体转换