5

私は C++ と Win API の経験がないので、この質問がわかりにくい場合は申し訳ありません。MessageBoxたとえば、いくつかのコンポーネントを作成するDLLがあります。ビジュアル スタイルを有効にするプラグマ コメントを追加しましたが、機能しません (そして、この回答からわかるように、Internet Explorer ツールバーのコンボボックスの Windows 7 スタイル、どのように?

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

4

1 に答える 1

12

ホスト アプリケーションがそれを使用しない場合でも、DLL でビジュアル スタイル対応コントロール (comctl32 v6 など) を使用する場合は、アクティベーション コンテキスト 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 が ID 2 のリソースに Common Controls バージョン 6.0 マニフェストを格納していることを意味します。

CreateActCtxDLL の初期化時とReleaseActCtx、それが不要になったときに1 回だけ呼び出すことができます。ActivateActCtxウィンドウを作成する前に呼び出し、制御DeactivateActCtxをアプリケーションに返す前に呼び出します。

于 2014-08-12T18:26:40.467 に答える