如何启用“Microsoft.Windows.Common-Controls”进行特定控制?

Posted

技术标签:

【中文标题】如何启用“Microsoft.Windows.Common-Controls”进行特定控制?【英文标题】:How to enable 'Microsoft.Windows.Common-Controls' for specificate control? 【发布时间】:2018-08-22 14:45:03 【问题描述】:

我有一个旧的 MFC 应用程序,由于某些控件的新行为,我无法为此应用程序中的所有控件启用“Microsoft.Windows.Common-Controls”。但我需要它来支持EM_SETCUEBANNERCEdit

我尝试在OnInitDialog 中这样做:

m_edt = (CEdit *)GetDlgItem(edit_id);
int i= SetWindowTheme(m_edt->m_hWnd, L"Explorer", NULL);

SetWindowTheme 返回 0 但我仍然无法使用 EM_SETCUEBANNER 消息。

如何才能仅为CEdit 启用 Microsoft.Windows.Common-Controls?

【问题讨论】:

我宁愿为应用程序中的所有控件启用“Microsoft.Windows.Common-Controls”并更改一些代码。几年前,当我在一个大型项目中这样做时,我能发现的唯一行为变化是在 ListBox 中:当您在项目外部单击时,旧的列表框不会报告 LBN_SELCHANGE,而新的 ListBox 会报告它。 如果您能提及您注意到哪些行为变化,我将不胜感激。 您可以调用 InitCommonControlsEx 并指定 ICC_STANDARD_CLASSES,但它将应用于按钮、编辑、静态、列表框、组合框和滚动条 @jaudo 我很确定InitCommonControlsEx 与此问题无关。 您需要在创建此控件之前激活 version='6.0.0.0' 的激活上下文并在之后停用。在 version='6.0.0.0' 活动上下文中创建的所有控件都将是此版本 【参考方案1】:

您需要创建一个使用 ComCtrl32 v6 清单的Activatation Context。然后您可以在创建CEdit 之前激活上下文,然后再停用上下文。

请参阅 Raymond Chen 在 MSDN 上的博客上的 How can you use both versions 5 and 6 of the common controls within the same module?。

例如,我做了一个快速测试:

// setup main UI as needed, then...

// I borrowed code from https://***.com/a/10444161/65863
// for testing purposes, but you can set lpSource to your own manifest
// file, if needed...
ACTCTX ctx = ;
ctx.cbSize = sizeof(actCtx);
ctx.dwFlags = ACTCTX_FLAG_RESOURCE_NAME_VALID
            | ACTCTX_FLAG_SET_PROCESS_DEFAULT
            | ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID;
ctx.lpSource = TEXT("shell32.dll");
ctx.lpAssemblyDirectory = TEXT("C:\\Windows\\System32\\"); // <-- don't hard-code this in production code!
ctx.lpResourceName = MAKEINTRESOURCE(124);

HANDLE hActCtx = CreateActCtx(&ctx);
if (hActCtx == INVALID_HANDLE_VALUE) 
    // handle error ...
    return;


ULONG_PTR ulCookie = 0;
if (!ActivateActCtx(hActCtx, &ulCookie)) 
    // handle error ...
    ReleaseActCtx(hActCtx);
    return;


// make single Edit control as needed ...

DeactivateActCtx(0, ulCookie);
ReleaseActCtx(hActCtx);

结果如下:

该应用程序是在没有任何清单的情况下编译的,因此 ComCtrl32 v5 将是默认设置。顶部的 Edit 控件是使用进程的默认激活上下文创建的,底部的 Edit 控件是使用 ComCtrl32 v6 清单的显式激活上下文创建的,然后将EM_SETCUEBANNER 应用于它(如果您不想创建自己的清单,您可以使用从shell32.dll 到this answer 到How to enable visual styles without a manifest 的资源#124。

【讨论】:

可以上传你的例子吗?

以上是关于如何启用“Microsoft.Windows.Common-Controls”进行特定控制?的主要内容,如果未能解决你的问题,请参考以下文章

如果已启用,如何修复“当前未启用对实验语法 'classProperties' 的支持”错误?

Linux的透明大页如何启用禁用

markdown ubuntu如何启用IPv6.ubuntu如何启用IPv6。

如何在 iCloud 未启用时保存文件,然后启用

如何启用“启用 .NET Framework 源单步执行”?

如何在 Ubuntu 20.04 上安装启用 SSH