スタイルを持つボタンでのXPビジュアルの使用

[戻る]
2004/11/26(金) 11:33:22
こんにちは

XPビジュアルスタイルを使用したボタンに関する質問です
開発環境:WindowsXP、VC++6.0、SDK

先日自分のパソコンにXPを導入し、
過去に作ったアプリをXPビジュアルスタイルに対応させようと考えました

そこで情報を検索し、manifestファイルを使用するという方法を発見
manifestファイルを同じフォルダに置くことでだいたいのコントロールは
無事にXPビジュアルスタイルが適用されました

しかし、ボタンの中でBS_BITMAPスタイルを持つボタンに関しては
なぜかXPビジュアルスタイルが適用されませんでした
どうやらBS_BITMAPスタイルを持つボタンへBM_SETIMAGEでビットマップを設定すると
クラシックスタイルへ変わってしまうようです
ボタンを作成した段階でビットマップが設定されていない状態では
ビジュアルスタイルが適用されていました

ちなみにBS_ICONスタイルでアイコンを設定する方法も試しましたが、
これも同様でした

これは仕様なのでしょうか

私的な推測ですが、ビジュアルスタイルのボタンは
クラシックスタイルのように表面が単なる塗りつぶしではなく立体的ですよね
なのでビットマップの背景色をシステムカラーに置き換えて描画し、
透過しているように見せることができないからではないかと考えたりもしました
が・・・

で、今やりたいのは
ビジュアルスタイルの外観を使用したビットマップボタンを作ることです

一番最初に思いついたのはオーナードローです
これなら自分でビットマップのマスクを作れば透過もちゃんとできますし
しかしその場合、ボタンの外観の描画をどうしようかと考えたときに困ります
ビジュアルスタイルはいくつも種類があるみたいですし、
それにどう対応させればよいかという問題が出てきます

システムのどこかにビジュアルスタイルに使用するパーツや情報などがあるはずです
が、
それを読み出して使用するなどしなければならないのでしょうか

クラシックスタイルならばDrawFrameControlでボタンの外観を描画できましたが、
DrawFrameControlはビジュアルスタイルに対応していないようですし

何か簡単にビジュアルスタイルで描画できるような方法はないものでしょうか

長くなってしまいましたが、何かアドバイスがありましたらよろしくお願いします

2004/11/26(金) 13:09:04
タイトルが・・・
「BS_BITMAPスタイルを持つボタンでのXPビジュアルの使用」
と入れたはずなんですが、何かのミスで消えてしまったようです
妙なタイトルになってすみません

シャノン 2004/11/26(金) 14:08:46
> 何か簡単にビジュアルスタイルで描画できるような方法はないものでしょうか

やったことないので確信はありませんが、
DrawThemeBackground とか DrawThemeEdge なんていう関数が、それっぽい名前ですね。

2004/11/26(金) 15:54:29
[[解決]]
シャノンさん、レスありがとうございます

DrawThemeBackground、DrawThemeEdgeについて調べてみたところ、
まさにそのために作られた関数であることがわかりました

おおまかな使い方はこんな感じのようです

#include <uxtheme.h>   //Theme系関数に必要
#include <TmSchema.h>  //DrawTheme系関数で使用する列挙型等が定義されている
#pragma comment(lib,"uxtheme")

・・・

HTHEME    hTheme; 
RECT      rc = {10,10,50,50};
hTheme    = OpenThemeData(hWnd,L"BUTTON");
if(hTheme != NULL){
   DrawThemeBackground(hTheme,hdc,BP_PUSHBUTTON,PBS_NORMAL,&rc,NULL);
   CloseThemeData(hTheme);
}
else{
   //ビジュアルスタイルを使用しない描画
}

・・・

一部(だいぶ?)省いていますが、
これでボタンの通常状態の背景を描画することができました
パラメータを変えれば、無効、押している状態、フォーカス状態、
またボタン以外にもさまざまなコントロールに対応した描画を行えるようです

MSDNのヘルプでもまだ英語のドキュメントしかなく、
解読が不十分な部分もありますが、
実現したい部分はなんとかなりそうです

どうもありがとうございました

古いスレッドには追加発言できません。