【问题标题】:Win32. Enable visual styles in dll赢32。在 dll 中启用视觉样式
【发布时间】:2014-08-12 14:43:09
【问题描述】:

我没有 C++ 和 Win API 方面的经验,如果这个问题是nooby,我很抱歉。我有 DLL,可以在其中创建一些组件,例如 MessageBox。我添加了杂注注释以启用视觉样式,但它不起作用(我从这个答案中知道它不应该:windows 7 style for combobox on internet explorer toolbar, how?

Dll代码(省略导出等):

#include "stdafx.h"
#include "my-dll.h"
#include <Windows.h>
#pragma comment(linker,"\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*'    publicKeyToken='6595b64144ccf1df' language='*'\"")

MYDLL_API int fnmydll(void)
{
   MessageBox(NULL, L"Message", NULL, 0);
   return 42;
}

然后我从我的应用程序中调用这个 dll 函数:

#include <iostream>
#include <Windows.h>
#include "my-dll.h"

int WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)
{
    fnmydll();
    return 0;
}

我有我的消息框,但没有视觉样式。据我了解,我应该在调用我的 dll 时激活上下文,但 MSDN 没有如何执行此操作的示例。您能否给我这样的例子,或者至少更详细地解释发生了什么?因为我什至不明白为什么函数BOOL GetCurrentActCtx(_Out_ HANDLE *lphActCtx); 接收到ACTCTX 的指针但有一些HANDLE 类型的签名。

【问题讨论】:

  • 好吧,您将不得不创建并激活一个激活上下文。最简单的方法是使用ISOLATION_AWARE_ENABLED
  • 至于GetCurrentActCtx,肯定是文档bug。该函数将HANDLE 返回到激活上下文。您可以将此句柄与QueryActCtxWQueryActCtxSettingsW 一起使用来查询上下文信息。

标签: c++ winapi dll visual-styles activation-context-api


【解决方案1】:

如果您希望您的 DLL 使用视觉样式感知控件,即 comctl32 v6,即使您的主机应用程序不使用它,您也必须使用 Activation Context API。这是一个如何使用它的示例:

 HANDLE hActCtx;
 ACTCTX actCtx;
 ZeroMemory(&actCtx, sizeof(actCtx));
 actCtx.cbSize = sizeof(actCtx);
 actCtx.hModule = hInst;
 actCtx.lpResourceName = MAKEINTRESOURCE(2);
 actCtx.dwFlags = ACTCTX_FLAG_HMODULE_VALID | ACTCTX_FLAG_RESOURCE_NAME_VALID;

 hActCtx = CreateActCtx(&actCtx);
 if (hActCtx != INVALID_HANDLE_VALUE) {
     ULONG_PTR cookie;
     ActivateActCtx(hActCtx, &cookie);

     // Do some UI stuff here; just show a message for example
     MessageBox(NULL, TEXT("Styled message box"), NULL, MB_OK);

     DeactivateActCtx(0, cookie);
     ReleaseActCtx(hActCtx);
 }

这里hInst是你的DLL的模块句柄,你可以把它保存在DllMain的一个全局变量中,或者使用GetModuleHandle函数来获取它。此示例意味着您的 DLL 将 Common Controls 6.0 版清单存储在其 ID 为 2 的资源中。

您只能在 DLL 初始化时调用 CreateActCtx 一次,而在不再需要时调用 ReleaseActCtx。在创建任何窗口之前调用ActivateActCtx,在将控制权返回给应用程序之前调用DeactivateActCtx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 2021-04-08
    相关资源
    最近更新 更多