c++ - 使用 list 会导致窗口部分保持空白

标签 c++ mfc manifest visual-styles

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

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

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

Comparison images right after invoking the dialog

我已经逐步完成了 OnPaint 代码(它绘制了图标和“你知道吗”文本,并且所有函数都返回了合理且成功的值。我还尝试删除了整个 customdrawn 位(注释掉了 WM_PAINTWM_CTLCOLOR 消息的映射),但即便如此,也不会导致任何显示或行为不同。

单击“下一个提示”按钮后,它正确绘制列表中的下一个提示。但是,带有灯泡图标的 customdrawn header 仍然缺失。

这段代码确实没有任何我能发现的特别之处,我不知所措。由于我怀疑对话定义最有帮助,因此我将其包括在内,尽管如果人们对问题隐藏的位置有想法,我可以发布其他内容。

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 消息的处理上。当我将它设置为返回一个 NULL_BRUSH 时,我终于看到了正在绘制的东西(当然,在初始绘制之后,它在另一个之上变得模糊)。进一步确定,似乎当 nCtlColor == CTLCOLOR_STATIC 时,如果我返回 NULL_BRUSH,就会显示内容。然而,当我将它设为 WHITE_BRUSH 时,不会再绘制任何东西。

原代码:

HBRUSH CTipDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    if (pWnd->GetDlgCtrlID() == IDC_TIPSTRING)
        return (HBRUSH)GetStockObject(WHITE_BRUSH);
    else if (nCtlColor == CTLCOLOR_STATIC)
        /* Visual styles enabled causes the things we draw in our WM_PAINT
         * to get cleared (and not redrawn) if we do not use a hollow brush here.
         * Likely the default behaviour differs when using theming. */
        return (HBRUSH)GetStockObject(HOLLOW_BRUSH);
        
    return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
}

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

最佳答案

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

根据 a blog entry by Raymond Chen 的说法,这些控件在一定程度上使用 ANSI 字符集,但仅出于向后兼容性的原因。没有人应该故意使用它。

If you're an ANSI application and you create controls from the common controls library, you may encounter strange behavior. It'll mostly work, but things may be weird at the fringe.

...

And it means that all you folks who are using version 6 of the common controls but haven't converted to Unicode are relying on a compatibility loophole. The ANSI support is there for the old programs that thought they were talking to a version 5 common control; it isn't there for you.

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

关于c++ - 使用 list 会导致窗口部分保持空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3783237/

相关文章:

c++ - 使用 SB_SETTEXT 在状态栏中显示的字符数是否有限制?

html - 应用程序缓存 list + 本地存储大小限制

c++ - QMutexLocker 和 QMutex 哪个更好用?

android - 如何将代码从 QSerialPort 迁移到 QBluetoothSocket

C++/错误 : expression must have integral or unscoped enum type

c++ - 列表控件中的 MFC 对话框组合框

visual-c++ - 捕获 OpenGL/Direct3D 第 3 方应用程序的屏幕截图

android - Delphi Android 防止/处理多 View 模式

javascript - Chrome 扩展程序未自动运行。内容脚本未执行

c++ - 运算符的初始化列表和 RHS