我正在尝试在我的 win32 应用程序中使用 NM_CUSTOMDRAW 而不是 WM_DRAWITEM 作为位图按钮。WM_DRAWITEM 工作正常 - 除了它在启用桌面主题的 WINE 下不起作用(出于某种原因,启用主题时,WINE 仅在您单击按钮时发送 WM_DRAWITEM)。
无论如何,我尝试从下面的“确定”按钮中删除 BS_OWNERDRAW - 让其他人独自一人。为了测试 WM_NOTIFY 的处理,我只需将我需要的字段从 NMCUSTOMDRAW 结构复制到 DRAWITEMSTRUCT 并将其传递给我现有的 WM_DRAWITEM 处理程序。按钮画得很好,但随后 Windows 在我的上面绘制了 OK 文本(我的文本被移动以为复选标记腾出空间)。我已经粘贴了下面的代码。我认为如果我返回 CDRF_SKIPDEFAULT 以响应所有 NM_CUSTOMDRAW 通知,Windows 就不会尝试绘制任何东西。显然我还有其他事情要做...
case WM_NOTIFY:
// Only intrested in NM_CUSTOMDRAW messages here.
nmh = (LPNMHDR) lParam;
if (nmh->code != NM_CUSTOMDRAW)
break;
// Only interested in CDDS_PREPAINT.
lpNMC = (LPNMCUSTOMDRAW) lParam;
if (lpNMC->dwDrawStage != CDDS_PREPAINT)
return(CDRF_SKIPDEFAULT);
// Copy fields we need from NMCUSTOMDRAW to a DRAWITEMSTRUCT.
memset(&dis, 0, sizeof(dis));
dis.hwndItem = nmh->hwndFrom;
dis.hDC = lpNMC->hdc;
dis.rcItem = lpNMC->rc;
if (lpNMC->uItemState & CDIS_FOCUS)
dis.itemState |= ODS_FOCUS;
if (lpNMC->uItemState & CDIS_SELECTED)
dis.itemState |= ODS_SELECTED;
if (lpNMC->uItemState & CDIS_DEFAULT)
dis.itemState |= ODS_DEFAULT;
if (lpNMC->uItemState & CDIS_DISABLED)
dis.itemState |= ODS_DISABLED;
DrawBitmapButtonOnWindowsDialog(wParam, (LPARAM) &dis, -1);
return(CDRF_SKIPDEFAULT);
case WM_DRAWITEM:
DrawBitmapButtonOnWindowsDialog(wParam, lParam, -1);
break;