如何启用“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_SETCUEBANNER
的CEdit
。
我尝试在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' 的支持”错误?
markdown ubuntu如何启用IPv6.ubuntu如何启用IPv6。