前回http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200808/08080011.txt
で質問させていただきましたVC初心者のPicardです。
下記のシェル名前空間拡張のサンプルコードを利用させてもらってます。
http://www.codeproject.com/KB/shell/TipsInNSE_SubFld.aspxシリーズ
このサンプルでシェルビューに表示されるリストビューのカラムヘッダーに
XPビジュアルスタイルを適用したいのですが、どうしても適用されません。
XPビジュアルスタイルの適用方法を自分なりにかなり調査したつもりなのですが、お手上げ状態となってしまいました。
【私が試したDLLへのXPビジュアルスタイル用マニフェスト組み込み方法】
コンパイルで組み込む(VS2005以降)
方法1. ソースコードに記述
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
をどこかに記述。(StdAfx.hなど)
この場合、「構成プロパティ > リンカ > マニフェストファイル > マニフェストファイルの生成」が「はい」になっていなければならない。
方法2. マニフェストファイルを作成し、コンパイル設定でファイルを指定する。
この場合、「構成プロパティ > リンカ > マニフェストファイル > マニフェストファイルの生成」が「いいえ」になっていなければならない。
sample.manifestをソースフォルダに作成(手動)
?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<noInherit/>
<assemblyIdentity
processorArchitecture="*"
type="win32"
name="Sample"
version="1.0.0.0"/>
<description>Sample Description</description>
<dependency optional="yes">
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.1.0"
publicKeyToken="6595b64144ccf1df"
language="*"
processorArchitecture="*"/>
</dependentAssembly>
</dependency>
</assembly>
[プロジェクトのプロパティ/構成プロパティ/マニフェスト ツール/入力と出力/追加のマニフェスト ファイル」に「sample.manifest」と指定する。
マニフェストの適用自体はうまく行っているように思えるのですが、XPビジュアルスタイルが適用されません。
解決策をご存知の方、ぜひご教授お願いいたします。
もしかしたら、このサンプルコードでは、根本的にXPビジュアルスタイルの適用は無理なのでしょうか?
開発環境:Windows XP Pro(SP3) + VC++2008(VS2008), VC++6.0
XP pro3 VC2005
以下の方法でうまくいっていますが・・
1.ボタンなどのコントロールを普通に配置する
2.[プロジェクト] - [新しい項目の追加] - [ユーティリティー] - [テキストファイル]
ApplicationName.exe.manifest としてファイルを作成する( ApplicationNameは適宜変更する )
3.以下の記述をコピー貼り付けする
4.assemblyIdentity の name にアプリケーションの名前を記入する
5.作成したファイルをプロジェクトに追加する
6.ビルドして実行するとXPスタイルのコントロール表示になる
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="ApplicationName"
type="win32"
/>
<description>アプリケーションの説明</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>
かもねぎさん、ありがとうございます。
ご指摘のように通常のアプリケーションの場合、特に問題なくXPスタイルが
適用される(私が書いた上記の2つの方法でも)のですが、今回のサンプル
コードではうまく行かないようです。
シェル名前空間拡張では、このほかに何か特殊な設定が必要なのではないか
と思い、質問させていただきました。
シェル名前空間拡張でのXPスタイルを適用したサンプルコードも見つけられないので、原因がさっぱり分かりません。
実際にこのサンプルコードをコンパイルして調べていただける方もなかなか
いないとは思いますが、すがるような気持ちで投稿させていただきました。
このサンプルコードでは無理なのかどうなのかだけでも知りたいところです。
CNWSModule.h line : 140 がグレーになっていますね。
ってことは_WIN32_WINNT >= 0x0500ではないってことですよね?
XPスタイルということは0x0501以上ですよね?
この辺ですか?
かもねぎさん、再度ありがとうございます。
サンプルコードをご覧になっていただけたのですね。感謝します。
>CNWSModule.h line : 140 がグレーになっていますね。
すみません。これの意味がよく分かりません。
プロジェクトをVSで開いてみたときにグレー表示になっているということでしょうか?
初心者なもので知らないことが多々ありご迷惑をおかけします。
CNWSModule.h line : 140は、
#endif // _NO_CLIPFORMATS
となっていて、クリップボード関連のものでしょうか。
CNWSModule.h line : 137で
#if (_WIN32_WINNT >= 0x0500)
という記述があります。変数の上にマウスをかざしてみたところ
_WIN32_WINNT = 0x0600と定義されているようです。
このあたりをどうにかすれば、実現可能なのでしょうか?
xp pro sp3 vc2005 standard
でプロジェクト変換してコードを見てみました。
そのままビルドするとコンパイルエラーだらけ^^
CNWSModule.h
#ifdef INITCOMMONCONTROLSEX
INITCOMMONCONTROLSEX iccex;
iccex.dwSize = sizeof(INITCOMMONCONTROLSEX);
iccex.dwICC = ICC_LISTVIEW_CLASSES;
::InitCommonControlsEx(&iccex);
#else
::InitCommonControls();
#endif // INITCOMMONCONTROLSEX
ここでは ::InitCommonControls(); が選択されています。
DLLのバージョンの古いのを選択?
#if(_WIN32_WINNT >= 0x0500)
CLIPFORMAT m_CFSTR_TARGETCLSID;
#endif // _WIN32_WINNT
ここでは CLIPFORMAT m_CFSTR_TARGETCLSID; が選択されていませんでした。
それで OS のバージョン指定
DLLのバージョン指定が必要なのか?
とか気になっただけです。
的外れならごめんなさいです。
作った DLL を、Visual Studio の「ファイル」→「開く」→「ファイル」で開くと、DLL 中のリソースを見ることができます。
ここで、RT_MANIFEST のリソース ID は何番になっているでしょうか?
もう一つ確認。
プロジェクトの文字セット(プロジェクトのプロパティ→構成プロパティ→全般→文字セット)は何になっていますか?
ここが Unicode でないようなら、Unicode にしてください。
その際にエラーや警告が出たら、根気良く対処してくださいね。
かもねぎさん、ありがとうございます。
>そのままビルドするとコンパイルエラーだらけ^^
確かにWarningは多いですが、こちらの環境では、エラーは、dinput.libの箇所だけで、
dinput.libを適所に配置するだけでビルドは通りました。
シャノンさん、ありがとうございます。
>RT_MANIFEST のリソース ID は何番になっているでしょうか?
確認したところ、2のようです。
また、文字セットはマルチバイト文字セットになっていてUnicodeではありませんでした。
Unicodeに設定変更後、ビルドしたとこと1箇所だけエラーが発生しましたので、
ソースコードを修正し、再ビルドしました。
しかし、リストビューのカラムヘッダーは、XPスタイルにはなりませんでした。
また、文字セットにUnicodeを指定した場合、仮想フォルダが表示されなくなりましたが、これは別の問題だと感じます。
ご指摘のあった2点はなにかXPスタイルに関係するのでしょうか?
無知で申し訳ありません。
> 確認したところ、2のようです。
EXE なら 1、DLL なら 2 でいいようです。
間違えて DLL なのに 1 になってたりしないかな、と思って。
ちなみに、コントロールパネルの場合は 123 らしいですが、今回は関係ないですね。
シェル拡張の場合だけ特別な値があったりするのかな?
文字セットのほうは、コモンコントロール v6 は Unicode での使用を前提としているという話を聞いたことがあるので。
同じ問題かもしれないので一応リンクしておきます。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200707/07070045.txt
subaruさん、ありがとうございます。
紹介してくださった
http://takehiro.ciao.jp/tips/vc_atl_2.html
の方法で解決しました。
あきらめかけていたので、非常にうれしいです。
大変感謝いたします。
ツイート | ![]() |