2011-01-09 15 views
0

XPユーザーが通常のウィンドウスタイルを使用している間にVista/Win7を使用するようになっています(Windows XP stlyeを取得しwin95スタイルbtwを取得する方法は?)ウィンドウのバージョンに基づいてコントロールのビジュアルスタイルを変更する

アイデアは、このようなものです:今

OSVERSIONINFOEX osvi; 
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); 
GetVersionEx((OSVERSIONINFO*)&osvi); 
if (osvi.dwMajorVersion > 5) { 
       #pragma comment(linker,"/manifestdependency:\"type='win32' "\ 
       "name='Microsoft.Windows.Common-Controls' "\ 
       "version='6.0.0.0' "\ 
       "processorArchitecture='x86' "\ 
       "publicKeyToken='6595b64144ccf1df' "\ 
       "language='*' "\ 
       "\"") 
} 

if文は、私はの#pragmaが動作するだけの方法だと思いた、真または偽の場合は、#pragmaは関係なく実行されます。確かにあなたがの実行時の実行とプラグマのコンパイル時に評価を混合している(#ifndefのに#define ...私は推測する#endifのようなもの)

乾杯

+1

コンパイル時のアクションと実行時の条件を混在させようとしています。 – SLaks

+0

また、なぜあなたはそれをしたいのですか? – SLaks

+0

私はxpとwin7/vistaとの互換性を望んでいましたが、今は別の実行可能ファイルが必要なのがわかりました。乾杯。 – KaiserJohaan

答えて

2

作業にこれを得るために他のいくつかの方法がありますコード。明らかに、これは動作しません。

"PutYourProgramNameHere.exe.manifest"ファイルにアプリケーションのマニフェストを保存することは可能です。したがって、XPとVista/Win7で異なるマニフェストが必要な場合は、ターゲットコンピュータにアプリケーションをインストールするときに、異なるマニフェストファイルをインストールできます。私。インストーラはOSのバージョンを確認し、一致するマニフェストをインストールします。

+0

私は、物事をクリアすることがわかります。ありがとう – KaiserJohaan

1

Activation Context API関数を使用してこれを行うことができます。要件は次のとおりです。

  • 使用LoadLibrary実際に彼らはNT 5.1
  • どちらかがリソースとリソースとしてCOMCTL 6依存関係を含むマニフェストを埋め込む前に存在していないとして、問題のAPI関数をロードする& GetProcAddress id> 16、またはそれをディスク上のファイルとして持つことができます。

このサンプルコードは、マニフェストが17 TestOSVersionのID()天気をを決定する関数があるかどうかあなたは肌のウィンドウをしたいと、RT_MANIFESTリソースとして埋め込まれていることを前提としています。

ACTCTX actx = {0}; 
actx.cbSize = sizeof(ACTCTX); 
actx.dwFlags = ACTCTX_FLAG_RESOURCE_NAME_VALID | ACTCTX_FLAG_HMODULE_VALID; 
actx.lpResourceName = MAKEINTRESOURCE(17); 
actx.hModule = GetModuleHandle(NULL); // assumes the manifest is exe embedded. 

HANDLE hactx = INVALID_HANDLE_VALUE; 

if(TestOsVersion()) 
    hactx = CreateActCtx(&actx); 
ULONG_PTR actxCookie = NULL; 
if (hactx != INVALID_HANDLE_VALUE) 
    ActivateActCtx(hactx,&actxCookie); 

// Now, with the activation context active, create the dialog box 
// or window or whatever. 
HWND hwndDialog = CreateDialogBoxParam(...); 

// and pop the context. It doesn't matter if the dialog still exists, the 
// ctl6 dll is now loaded and serving requests. 
if (hactx != INVALID_HANDLE_VALUE) 
    DeactivateActCtx(0,actxCookie); 

明らかに、これが機能するには、v6共通コントロールをプロセスのデフォルトマニフェストに入れることはできません。

関連する問題