0

我正在尝试制作一个在 Visual C++ 6.0 中完成大部分开发的应用程序,以遵循 Windows 主题,或者更准确地说是它的视觉样式方面。有问题的应用程序是具有 MBCS 字符集的 MFC 应用程序。首先要启动主题需要将InitCommonControlsEx(...);技巧与 Common Controls 6.0 的适当清单相结合。到目前为止没有什么特别的。

完成所有这些后,我有大量的窗口显示出一些类似的绘图故障 - 背景上的白色矩形曾经是灰色的,就像窗口的其余部分一样,但它们不会妨碍。

最大的麻烦制造者是CDialog实现(古老的)“你知道吗...”提示对话框的后代。当清单就位时,它拒绝绘制按钮、复选框和装饰框以外的任何内容。但是,如果我将清单取出,一切正常。

调用对话框后立即比较图像

我已经逐步完成了OnPaint代码(它绘制了图标和“你知道吗”文本,并且所有函数都返回合理和成功的值。我还尝试删除整个 customdrawn 位(注释掉WM_PAINTWM_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);
}

问题解决了!粗体字是我为解决我的问题所做的更改,包括强制性注释。:)

4

1 回答 1

1

据我所知,Common Controls 版本 6 仅正式支持 Unicode。

根据Raymond Chen 的一篇博客文章,这些控件在一定程度上可以使用 ANSI 字符集,但只是出于向后兼容性的原因。没有人应该故意使用它。

如果您是 ANSI 应用程序并从通用控件库创建控件,您可能会遇到奇怪的行为。它大部分会起作用,但边缘的事情可能很奇怪。

...

这意味着所有使用第 6 版通用控件但尚未转换为 Unicode 的人都依赖于兼容性漏洞。ANSI 支持适用于认为它们正在与版本 5 通用控件通信的旧程序;它不适合你。

我从来没有尝试过做这样的事情,所以我不能肯定地说,但你可能会遇到一些这种“奇怪的行为”。如果是这种情况,那么唯一官方支持的选项是转换为 Unicode 或返回使用版本 5 的控件。否则,您将不得不尝试找到解决您可能发现的任何奇怪行为的解决方法,而这听起来并不是一个好的情况。

于 2010-09-24T01:20:57.523 回答