多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
自绘制知识基础 自绘制需要的两个基础步骤: 1.控件类型设置为 BS_OWNERDRAW 2.添加WM_DRAWITEM消息响应函数或者重写DrawItem函数。+ WM_DRAWITEM消息响应原型如下: ```c++ afx_msg void OnDrawItem( int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct ); 参数: nIDCtl 包含了发送WM_DRAWITEM消息的控件的标识符。如果菜单发送了此消息,则nIDCtl中包含0。 lpDrawItemStruct 指定了指向DRAWITEMSTRUCT数据结构的长指针,其中包含有关要画出的项和要求的绘图类型的信息。 ``` 说明: 当控件或菜单的可视状态发生变化时,框架为自画按钮控件、组合框控件、列表框控件或者菜单的拥有者调用这个成员函数。 DRAWITEMSTRUCT结构体信息如下: ```c++ typedef struct tagDRAWITEMSTRUCT { UINT CtlType; UINT CtlID; UINT itemID; UINT itemAction; UINT itemState; HWND hwndItem; HDC hDC; RECT rcItem; ULONG_PTR itemData; } DRAWITEMSTRUCT; 1.CtlType 控件类型。控件类型的值如下: ODT_BUTTON 所有者绘制的按钮 ODT_COMBOBOX 所有者绘制的组合框 ODT_LISTBOX 所有者绘制的列表框 ODT_MENU 所有者绘制的菜单 ODT_LISTVIEW 列表视图控件 ODT_STATIC 所有者绘制的静态控件 ODT_TAB 选项卡控件 2. CtlID 组合框,列表框或按钮的控件ID。该成员不用于菜单 3.itemID 菜单的菜单项ID或列表框或组合框中项目的索引, 对于空列表框或组合框,此成员是负值,允许应用程序仅在rcItem成员指定的坐标处绘制焦点矩形,即使控件中没有项目。因此,可以显示用户列表框或组合框是否具有输入焦点。 itemAction成员中位的设置确定是否要绘制矩形,就好像列表框或组合框具有输入焦点一样。 4.itemAction 定义所需的绘图操作。 这将是以下一个或多个位: DA_DRAWENTIRE 需要绘制整个控件时设置此位。 ODA_FOCUS 当控制增益或失去输入焦点时,该位置位。应检查itemState成员以确定控件是否具有焦点。 ODA_SELECT 仅在选择状态发生变化时设置此位。应检查itemState成员以确定新的选择状态。 ITEMSTATE 指定当前绘图操作发生后项目的可视状态。也就是说,如果要使菜单项变暗,则将设置状态标志ODS_GRAYED。州旗如下 | | | |---|---| | ODS_CHECKED | 如果要检查菜单项,则设置此位。该位仅在菜单中使用。| | ODS_DISABLED | 如果要将项目绘制为禁用,则设置此位。 | | ODS_FOCUS | 如果该项目有输入焦点设置该位 | | ODS_GRAYED | 如果项目要变暗,则设置此位。该位仅在菜单中使用| | ODS_SELECTED | 如果选择了项目的状态,则设置此位| | ODS_COMBOBOXEDIT | 绘图发生在ownerdrawn组合框的选择字段(编辑控件)中| | ODS_DEFAULT| 该项是默认项。| 该项是默认项。 5.hwndItem 指定组合框,列表框和按钮的控件的窗口句柄。指定包含菜单项的菜单(HMENU)的句柄。 的hDC+++ 6.hDC 标识设备上下文。在控件上执行绘图操作时,必须使用此设备上下文。 rcItem ```