2

我正在尝试在我的 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;
4

0 回答 0