gpt4 book ai didi

windows - 如何启用 'Microsoft.Windows.Common-Controls' 进行指定控制?

转载 作者:可可西里 更新时间:2023-11-01 09:57:30 25 4
gpt4 key购买 nike

我有一个旧的 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?

最佳答案

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

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

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

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

// I borrowed code from https://stackoverflow.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);

结果是这样的:

image

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

关于windows - 如何启用 'Microsoft.Windows.Common-Controls' 进行指定控制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51969459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com