WEB开发网
开发学院软件开发VC Visual C++中自绘菜单的实现 阅读

Visual C++中自绘菜单的实现

 2008-11-14 19:33:22 来源:WEB开发网   
核心提示: ODS_DEFAULT表示当前控件处于默认状态;ODS_DISABLED表示控件将被禁止;ODS_FOCUS表示控件需要输入焦点;ODS_GRAYED表示控件需要被灰色显示,该值只在绘制菜单时使用;ODS_HOTLIGHT表示鼠标指针位于控件之上时控件会显示高亮颜色(支持Windows 9

ODS_DEFAULT表示当前控件处于默认状态;

ODS_DISABLED表示控件将被禁止;

ODS_FOCUS表示控件需要输入焦点;

ODS_GRAYED表示控件需要被灰色显示,该值只在绘制菜单时使用;

ODS_HOTLIGHT表示鼠标指针位于控件之上时控件会显示高亮颜色(支持Windows 98/Me, Windows 2000/XP);

ODS_SELECTED表示选中控件;hwndItem 指定了组合框、列表框和按钮等自绘控件的窗口句柄;如果自绘的对象时菜单项,则表示包含该菜单项的菜单句柄。hDC指定了绘制操作所使用的设备环境。 rcItem指定了将被绘制的矩形区域。这个矩形区域就是上面hDC的作用范围。系统会自动裁剪组合框、列表框或按钮等控件的自绘制区域以外的部分。也就是说rcItem中的坐标点(0,0)指的就是控件的左上角。但是系统不裁剪菜单项,所以在绘制菜单项的时候,必须先通过一定的换算得到该菜单项的位置,以保证绘制操作在我们希望的区域中进行。

itemData这个成员变量最为关键,菜单自绘时所需要的图标、文本等信息都是通过它获取的,至于它的具体值,是通过CMenu类的CMenu::AppendMenu()、CMenu::InSertMenu()、CMenu::ModifMenu()等函数的调用来传递的。

菜单自绘仅仅重载CMenu::DrawItem()函数是不够的,还需要重载CMenu:: MeasureItem()函数,在这个函数里面填充MEASUREITEMSTRUCT结构,通知Windows自绘控件的尺寸。该函数的原形为:

virtual void MeasureItem( LPMEASUREITEMSTRUCT lpMeasureItemStruct );

该函数的参数为一个指向MEASUREITEMSTRUCT结构的指针对象,该对象结构为:

typedef struct tagMEASUREITEMSTRUCT {
 UINT CtlType; //控件类型;
 UINT CtlID; //控件的ID识别号,它不包括菜单控件;
 UINT itemID; //菜单项的ID识别号;
 UINT itemWidth; //菜单项的宽度;
 UINT itemHeight; //菜单项的高度;
 DWORD itemData //自绘控件所需要的数据,
} MEASUREITEMSTRUCT;

上面这个结构中,成员变量CtlType等于ODT_COMBOBOX 时,表示当前控件为自绘型的组合框,等于ODT_LISTBOX 时表示当前控件为自绘列表控制件,等于ODT_MENU 时表示当前控件为自绘菜单。对于组合框和列表框控件,成员变量itemData是通过相应的AddString()、InsertString()获取的, 对于菜单控件,成员变量itemData与DRAWITEMSTRUCT结构中的itemData是一致的。

上一页  1 2 3 4 5 6  下一页

Tags:Visual 菜单 实现

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接