这篇文章是以前的补充:
http://www.cnblogs.com/wangkewei/archive/2009/02/24/1397490.html
放在首页是想借助各位从事Windows Mobile本地代码开发的前辈们力量,把这方面的资料完善一下,我会总结更多有关这方面的文章。
typedef struct tagDRAWITEMSTRUCT { UINT CtlType; //控件类型 UINT CtlID; //控件id UINT itemID; //菜单项、列表框或组合框中某一项的索引值 UINT itemAction; //控件行为 UINT itemState; //控件状态 HWND hwndItem; //父窗口句柄或菜单句柄 HDC hDC; //控件对应的绘图设备句柄 RECT rcItem; //控件所占据的矩形区域 ULONG_PTR itemData; //列表框或组合框中某一项的值 } DRAWITEMSTRUCT;结构体每项的具体取值如下:(摘自MSDN文档)
Value | Description |
---|---|
ODT_BUTTON | Owner-drawn button |
ODT_LISTVIEW | Owner-draw list view control |
ODT_MENU | Owner-drawn menu |
ODT_TAB | Tab control |
Value | Description |
---|---|
ODA_DRAWENTIRE | The entire control needs to be drawn. |
ODA_FOCUS | The control has lost or gained the keyboard focus. You should check the itemState member to determine whether the control has the focus. |
ODA_SELECT | The selection status has changed. You should check the itemState member to determine the new selection state. |
Value | Description |
---|---|
ODS_CHECKED | The menu item is to be checked. Use this value only in a menu. |
ODS_COMBOBOXEDIT | The drawing takes place in the edit control of an owner-drawn combo box. |
ODS_DEFAULT | The item is the default item. |
ODS_DISABLED | The item is to be drawn as disabled. |
ODS_FOCUS | The item has the keyboard focus. |
ODS_GRAYED | The item is to be grayed. Use this value only in a menu. |
ODS_SELECTED | The status of the menu item is selected. |
hLevelUpButton = CreateWindow(_T("button"), NULL, WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, 0, 0, 32, 32, hWnd, (HMENU) IDC_LEVELUPBUTTON, g_hInst, NULL); if (NULL == hLevelUpButton) { MessageBox(hWnd, L"Create up button fails", L"Message", MB_OK); }
hLevelDnButton = CreateWindow(_T("button"), NULL, WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, 32, 0, 32, 32, hWnd, (HMENU) IDC_LEVELDNBUTTON, g_hInst, NULL); if (NULL == hLevelDnButton) { MessageBox(hWnd, L"Create down button fails", L"Message", MB_OK); }在主窗口消息处理里定义结构体:
DRAWITEMSTRUCT* pdis;添加消息处理:
case WM_DRAWITEM: pdis = (DRAWITEMSTRUCT*) lParam; // (winuser.h) Maybe you also want to account for pdis->CtlType (ODT_MENU, ODT_LISTBOX,ODT_COMBOBOX, ODT_BUTTON, ODT_STATIC) switch(pdis->CtlID) { case IDC_LEVELUPBUTTON: // Fall through (you would use a "break" otherwise): case IDC_LEVELDNBUTTON: result = OwnerDrawButton(pdis, g_hInst); if (FALSE == result) { MessageBox(hWnd, L"OwnerDrawButton return fasle", L"Message", MB_OK); return(FALSE); } break; // Other case labels if any... default: break; } //如果处理该消息,则必须返回TRUE return(TRUE);
OwnerDrawButton函数的定义如下:
BOOL OwnerDrawButton(DRAWITEMSTRUCT* pdis, HINSTANCE hInstance) { static RECT rect; static int iCount = 0; // Icon handles: static HICON hCurrIcon, hUpIconI, hDnIconI, hUpIconA, hDnIconA; // Use copy of rectangle: rect = pdis->rcItem; //只载入一次Icon if (iCount < 1) { // LoadIcon only loads once, but LoadImage does not, // so in case you call the latter, use a static counter: iCount++; // Inactive buttons: hUpIconI = (HICON) LoadIcon(hInstance, MAKEINTRESOURCE(ID_UP_ICONI)); if (!hUpIconI) { MessageBox(NULL, L"Loading ID_UP_ICONI icon fails", L"Message", MB_OK); } hDnIconI = (HICON) LoadIcon(hInstance, MAKEINTRESOURCE(ID_DN_ICONI)); if (!hDnIconI) { MessageBox(NULL, L"Loading ID_DN_ICONI icon fails", L"Message", MB_OK); } // Active buttons: hUpIconA = (HICON) LoadIcon(hInstance, MAKEINTRESOURCE(ID_UP_ICONA)); if (!hUpIconA) { MessageBox(NULL, L"Loading ID_UP_ICONA icon fails", L"Message", MB_OK); } hDnIconA = (HICON) LoadIcon(hInstance, MAKEINTRESOURCE(ID_DN_ICONA)); if (!hDnIconA) { MessageBox(NULL, L"Loading ID_DN_ICONA icon fails", L"Message", MB_OK); } } // If the control's id is that of the "Up" button: if (IDC_LEVELUPBUTTON == pdis->CtlID) { // If the button is selected, display the // "active" icon, else the "inactive" icon: if (pdis->itemState & ODS_SELECTED) hCurrIcon = hUpIconA; else hCurrIcon = hUpIconI; } // If the control's id is that of the "Down" button: if (IDC_LEVELDNBUTTON == pdis->CtlID) { // If the button is selected, display the // "active" icon, else the "inactive" icon: if (pdis->itemState & ODS_SELECTED) hCurrIcon = hDnIconA; else hCurrIcon = hDnIconI; } // Center the icon inside the control's rectangle: if (!DrawIconEx( pdis->hDC, (int) 0.5 * (rect.right - rect.left - ICON_WIDTH), (int) 0.5 * (rect.bottom - rect.top - ICON_HEIGHT), (HICON) hCurrIcon,//根据上面指定的Icon绘制 ICON_WIDTH, ICON_HEIGHT, 0, NULL, DI_NORMAL )) { MessageBox(NULL, L"Drawing icon fails", L"Message", MB_OK); } return TRUE; }
附件项目的环境是:
Win32/Windows Mobile 6 Professional(CHS)/Visual Studio 2008(CHS)
/Files/wangkewei/OwnerDrawButton.rar