我正在尝试制作一个在 Visual C++ 6.0 中完成大部分开发的应用程序,以遵循 Windows 主题,或者更准确地说是它的视觉样式方面。有问题的应用程序是具有 MBCS 字符集的 MFC 应用程序。首先要启动主题需要将InitCommonControlsEx(...);
技巧与 Common Controls 6.0 的适当清单相结合。到目前为止没有什么特别的。
完成所有这些后,我有大量的窗口显示出一些类似的绘图故障 - 背景上的白色矩形曾经是灰色的,就像窗口的其余部分一样,但它们不会妨碍。
最大的麻烦制造者是CDialog
实现(古老的)“你知道吗...”提示对话框的后代。当清单就位时,它拒绝绘制按钮、复选框和装饰框以外的任何内容。但是,如果我将清单取出,一切正常。
我已经逐步完成了OnPaint
代码(它绘制了图标和“你知道吗”文本,并且所有函数都返回合理和成功的值。我还尝试删除整个 customdrawn 位(注释掉WM_PAINT
和WM_CTLCOLOR
消息的映射),但是即便如此,也没有什么表现出或采取不同的行动。
单击“下一个提示”按钮后,它将正确绘制列表中的下一个提示。但是,带有灯泡图标的自定义标头仍然丢失。
该代码确实没有什么特别之处,我可以发现,我很茫然。由于我怀疑对话定义最有帮助,因此我将其包括在内,尽管如果人们对问题隐藏在哪里有想法,我可以发布其他内容。
IDD_TIP DIALOG DISCARDABLE 0, 0, 231, 164
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Tip of the Day"
FONT 8, "MS Sans Serif"
BEGIN
CONTROL "",IDC_STATIC,"Static",SS_BLACKFRAME,12,11,207,123
LTEXT "Some String",IDC_TIPSTRING,28,63,177,60
CONTROL "&Show Tips on StartUp",IDC_STARTUP,"Button",
BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,13,146,85,10
PUSHBUTTON "&Next Tip",IDC_NEXTTIP,109,143,50,14,WS_GROUP
DEFPUSHBUTTON "&Close",IDOK,168,143,50,14,WS_GROUP
CONTROL "",IDC_BULB,"Static",SS_BITMAP,20,17,190,111
END
我正在测试的机器是运行 VS2010 的 W7 64 位机器。有问题的应用程序本身是 32 位的。
编辑:
新的一天提供新的见解。不知何故,问题在于WM_CTLCOLOR
消息的处理。当我将它设置为返回 aNULL_BRUSH
时,我终于看到了正在绘制的东西(在初始绘制之后,当然在另一个之上模糊了)。更进一步,似乎当nCtlColor == CTLCOLOR_STATIC
我返回 a时NULL_BRUSH
,会显示一些东西。然而,当我把它变成WHITE_BRUSH
空无一物时,它又被画了出来。
原始代码:
HBRUSH CTipDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { if (pWnd->GetDlgCtrlID() == IDC_TIPSTRING) 返回(HBRUSH)GetStockObject(WHITE_BRUSH); 否则如果(nCtlColor == CTLCOLOR_STATIC) /* 启用视觉样式会导致我们在 WM_PAINT 中绘制的东西 * 如果我们在这里不使用空心刷子,则清除(而不是重绘)。 * 使用主题时,默认行为可能会有所不同。*/ 返回(HBRUSH)GetStockObject(HOLLOW_BRUSH); 返回 CDialog::OnCtlColor(pDC, pWnd, nCtlColor); }
问题解决了!粗体字是我为解决我的问题所做的更改,包括强制性注释。:)