2017-01-18 8 views
0

私は、次のMFCコードを使用して、ダイアログウィンドウが表示されることがDLLを持っている:DLLから作成されたCDialogの共通コントロールにビジュアルスタイルを有効にする方法はありますか?

void ShowMyDialog() 
{ 
    BOOL bInitted = SUCCEEDED(::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE)); 

    INITCOMMONCONTROLSEX InitCtrls; 
    InitCtrls.dwSize = sizeof(InitCtrls); 
    InitCtrls.dwICC = ICC_WIN95_CLASSES; 
    InitCommonControlsEx(&InitCtrls); 
    //InitCommonControls(); //Tried also with just this call 

    AfxEnableControlContainer(); 

    HMODULE hDll = NULL; 
    if(GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, 
     (LPCWSTR) ShowMyDialog, 
     &hDll) && 
     hDll) 
    { 
     AfxSetResourceHandle(hDll); 

     CMyDialog dl;  //Derived from CDialog 
     dl.DoModal(); 
    } 

    if(bInitted) 
     ::CoUninitialize(); 
} 

これは動作しますが、表示されるダイアログには、visualスタイルが有効になっていません。

enter image description here

私はDLLのビジュアルスタイルを有効にする方法については、this articleが見つかりました。だから私は提案マニフェスト内容のリソースファイルを追加しました:

enter image description here

をして、それは123のID資源ました:

enter image description here

しかし、まだありません葉巻を。私はここで何が欠けていますか?

+0

リソースID 123は、「コントロールパネルのComCtl32バージョン6またはRunDll32.exeによって実行されるDLLの使用」のセクションにあります。このDLLはコントロールパネルのページですか?もしそうなら、123が必要で、何かが間違っています。これがrundll32.dllによって実行されるDLLの場合、[通常の通常のプログラムに変換する必要があります](https://blogs.msdn.microsoft.com/oldnewthing/20130104-00/?p=5643)。 2つのどちらも正しいのでなければ、あなたは間違ったセクションを見ている。代わりに、「エクステンション、プラグイン、MMCスナップイン、またはプロセスに組み込まれたDLLにビジュアルスタイルサポートを追加する」が望ましいでしょう。 – andlabs

+0

はい、私はそれらのセクション名が良くないことに同意します。 – andlabs

+0

@DavisHeffernan:ありがとうございます。ワオ。誰がそれらの 'CreateActCtx' APIを使う必要があると思ったのですか? – c00000fd

答えて

0

私はそれがうまくいくとは思わない。あなたがEXEに埋め込まれたマニフェストを持っている場合、それはマニフェストローダによってロードされたデフォルトにするために、

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

:AppWizardのプロジェクトを生成するとき、それは一般的なコントロール6が含まれている場合、それは次のようにプラグマを使用していますそれは0のIDを持っている必要があります。あなたは他のIDを持っていますので、あなたはそれが働く機会を保っていません。

私の簡単な示唆は、テストMFCアプリケーションウィザードアプリケーションを生成し、そのプロジェクトから#pragmaディレクティブをコピーすることです。通常、App Wizardはstdafx.hファイルに格納しますが、通常は任意のソースファイルに格納することができます。

また、SideInstance()メソッドで、ShowMyDialog()関数でCoInitializeEx()を呼び出す代わりにAfxOleInit()を呼び出します。また、AfxEnableControlContainer()をInitInsance()に配置します。もちろん、あなたのShowMyDialog()が呼び出される前でなければなりません。

+0

リソースID 123は、「コントロールパネルのComCtl32 Version 6またはRunDll32.exeによって実行されるDLLの使用」のセクションにあります。このDLLがコントロールパネルのページである場合は、123が必要です。これがrundll32.dllによって実行されるDLLの場合、[通常の通常のプログラムに変換する必要があります](https://blogs.msdn.microsoft.com/oldnewthing/20130104-00/?p=5643)。営業担当者は具体的にはDLLを作っていると言いました。あなたのアドバイスが実行可能ファイルについて正しいのに対し、質問には答えません。私は、より多くの指針で上記にコメントした。 – andlabs

+0

@andlabs:まあ、このDLLをロードできるプロセスを制御することはできません。 – c00000fd

+0

@ c00000fdこれは、DLLがどのプロセスにロードされるかに関するものではありません。それは、DLLの意図されたユースケースが何であるかについてです。意図したユースケースは何ですか?あなたが読んでいる部分は、セクション名が悪いという理由で、また、コントロールパネルシステムやrundll32.dllによって*実行される予定の* DLLのために、あなたが読んでいると思われます。私はWindowsでrundll32.dllを使用する必要があることを認識していません... – andlabs

関連する問題