シェル名前空間拡張でリストビューのカラムヘッダーにXPビジュアルスタイルを適用する方法

解決


Picard  2008-08-29 07:05:17  No: 68901

前回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


かもねぎ  2008-08-29 07:48:48  No: 68902

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>


Picard  2008-08-29 08:30:41  No: 68903

かもねぎさん、ありがとうございます。
ご指摘のように通常のアプリケーションの場合、特に問題なくXPスタイルが
適用される(私が書いた上記の2つの方法でも)のですが、今回のサンプル
コードではうまく行かないようです。
シェル名前空間拡張では、このほかに何か特殊な設定が必要なのではないか
と思い、質問させていただきました。

シェル名前空間拡張でのXPスタイルを適用したサンプルコードも見つけられないので、原因がさっぱり分かりません。

実際にこのサンプルコードをコンパイルして調べていただける方もなかなか
いないとは思いますが、すがるような気持ちで投稿させていただきました。

このサンプルコードでは無理なのかどうなのかだけでも知りたいところです。


かもねぎ  2008-08-29 13:21:39  No: 68904

CNWSModule.h line : 140 がグレーになっていますね。
ってことは_WIN32_WINNT >= 0x0500ではないってことですよね?
XPスタイルということは0x0501以上ですよね?
この辺ですか?


Picard  2008-08-29 14:10:03  No: 68905

かもねぎさん、再度ありがとうございます。
サンプルコードをご覧になっていただけたのですね。感謝します。

>CNWSModule.h line : 140 がグレーになっていますね。
すみません。これの意味がよく分かりません。
プロジェクトをVSで開いてみたときにグレー表示になっているということでしょうか?
初心者なもので知らないことが多々ありご迷惑をおかけします。

CNWSModule.h line : 140は、
#endif // _NO_CLIPFORMATS
となっていて、クリップボード関連のものでしょうか。

CNWSModule.h line : 137で
#if  (_WIN32_WINNT >= 0x0500)
という記述があります。変数の上にマウスをかざしてみたところ
_WIN32_WINNT = 0x0600と定義されているようです。

このあたりをどうにかすれば、実現可能なのでしょうか?


かもねぎ  2008-08-29 19:31:08  No: 68906

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のバージョン指定が必要なのか?
とか気になっただけです。

的外れならごめんなさいです。


シャノン  2008-08-29 20:51:02  No: 68907

作った DLL を、Visual Studio の「ファイル」→「開く」→「ファイル」で開くと、DLL 中のリソースを見ることができます。
ここで、RT_MANIFEST のリソース ID は何番になっているでしょうか?


シャノン  2008-08-29 20:53:20  No: 68908

もう一つ確認。
プロジェクトの文字セット(プロジェクトのプロパティ→構成プロパティ→全般→文字セット)は何になっていますか?
ここが Unicode でないようなら、Unicode にしてください。
その際にエラーや警告が出たら、根気良く対処してくださいね。


Picard  2008-08-30 07:26:03  No: 68909

かもねぎさん、ありがとうございます。
>そのままビルドするとコンパイルエラーだらけ^^
確かにWarningは多いですが、こちらの環境では、エラーは、dinput.libの箇所だけで、
dinput.libを適所に配置するだけでビルドは通りました。

シャノンさん、ありがとうございます。
>RT_MANIFEST のリソース ID は何番になっているでしょうか?
確認したところ、2のようです。

また、文字セットはマルチバイト文字セットになっていてUnicodeではありませんでした。
Unicodeに設定変更後、ビルドしたとこと1箇所だけエラーが発生しましたので、
ソースコードを修正し、再ビルドしました。
しかし、リストビューのカラムヘッダーは、XPスタイルにはなりませんでした。

また、文字セットにUnicodeを指定した場合、仮想フォルダが表示されなくなりましたが、これは別の問題だと感じます。

ご指摘のあった2点はなにかXPスタイルに関係するのでしょうか?
無知で申し訳ありません。


シャノン  2008-08-31 06:42:54  No: 68910

> 確認したところ、2のようです。

EXE なら 1、DLL なら 2 でいいようです。
間違えて DLL なのに 1 になってたりしないかな、と思って。
ちなみに、コントロールパネルの場合は 123 らしいですが、今回は関係ないですね。
シェル拡張の場合だけ特別な値があったりするのかな?

文字セットのほうは、コモンコントロール v6 は Unicode での使用を前提としているという話を聞いたことがあるので。


subaru  2008-09-01 22:41:31  No: 68911

同じ問題かもしれないので一応リンクしておきます。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200707/07070045.txt


Picard  2008-09-03 07:15:30  No: 68912

subaruさん、ありがとうございます。

紹介してくださった
http://takehiro.ciao.jp/tips/vc_atl_2.html
の方法で解決しました。

あきらめかけていたので、非常にうれしいです。
大変感謝いたします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加