- ベストアンサー
ウィンドウ(?)の見た目を変更したい
いつもお世話になっています。 現在、WindowsXPでVC++を使用し、アプリケーションを作成しています。 ウィンドウを作る際、通常の方法で作成すると、上部に青いタイトルバーを持つ、普通のウィンドウになりますが、これを別のグラフィックのウィンドウに変更する方法はあるのでしょうか。 (例えばMSNのような、普通の枠?でないウィンドウなど。。) タイトルの位置を上から横に変更したり、ウィンドウ内のどこをクリックしてドラッグしてもウィンドウを移動できたり、背景を自分で作成した画像にしたりしたいのですが。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
★全部自分で作成するのは大変です。 ・タイトルバーの位置は変更する必要がありますが、サイズの変更などは『DefWindowProc』に 任せた方が簡単で確実です。また、ウインドウ内のどこをクリックしても移動できるように するには全ウインドウを『クライアント領域』として処理すれば簡単かもしれません。 ・下の項目を参考にして下さい。 実現方法: (1)ウインドウの移動は『DefWindowProc』の『WM_NCLBUTTONDOWN』を使う。 (2)タイトルバー領域は『WM_NCHITTEST』メッセージを処理して変更する。 (3)ウインドウサイズの変更も『WM_NCHITTEST』メッセージを処理する。 (4)ボタンなどのコントロールは『オーナードロー描画』すれば出来る。 (5)ウインドウの背景は『WM_ERASEBKGND』を処理すれば出来る。 (6)クライアント領域は『WM_NCCALCSIZE』を処理すればサイズを計算できる。 描画関連: ・立体的な効果を持つ長方形の辺描画は『DrawEdge』API関数を使う。 ・標準のタイトルバーを描画したい場合は『DrawCaption』API関数を使う。 ・『閉じる』、『最大化』、『最小化』、『元のサイズに戻す』などのボタンは『DrawFrameControl』API関数を使う。 最後に: ・ウインドウの移動は『SendMessage( hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0 );』の1行で行えます。 これは最終的に『DefWindowProc』に『WM_NCLBUTTONDOWN』メッセージが渡されて移動処理が行われるのです。 ・タイトルバー領域を変更(左端)するには、クライアント領域の左端にタイトルバーを描画します。 その後、『WM_NCHITTEST』メッセージを処理してタイトルバー領域、クライアント領域、変更枠の上境界、下境界、 左境界、右境界、左上境界、右上境界、左下境界、右下境界の部分を計算してそれぞれの『定数』を返します。 定数を返すだけで『サイズ変更』のカーソルも出ますし、サイズ変更が可能になります。→『DefWindowProc』に任せる。 ・その他、いろいろとかなりのスキルがないと全てを実現するのはかなり大変になりますが、もしもこの質問を 最後まで実現できたときには、かなりのスキルが身に付いている事を保障します。 ・以上。おわり。→処理を分けて質問しないと『量』が多すぎて上記ぐらいしかアドバイスできません。この質問は。
その他の回答 (1)
- chie65536
- ベストアンサー率41% (2512/6032)
「枠無しウィンドゥ」を作成し、自前で枠などを描画しましょう。 もちろん、ウィンドゥの全部がクライアント領域になるので「普通の枠付きウィンドゥで出来る事」を全部自前でコーディングしなければなりません(窓移動、サイズ変更、閉じる、最大化、最小化、元のサイズに戻す、などを全部) さもなければ、枠部分のウィンドゥハンドルを取得し、そのウィンドゥのイベント処理ルーチンをオーバーラップして奪い取り、描画イベントを自前で処理しましょう。
お礼
回答ありがとうございます。 やはり全部自分で作らないとできなそうですね。。 タイトルの位置の変更やサイズの変更などは全部作成しないとだめみたいですね。 ボタンなどの表示を自作のグラフィックに置き換えるくらいは、元々の描画イベントの代わりに実行するコードを書けばできそうな気がしてきました。 実際にいろいろやってみようと思います。
お礼
回答ありがとうございます。 一通り実装してみて、思い通りに動かすことができました。 ウィンドウの移動についてはWM_NCLBUTTONDOWNメッセージを送らず、WM_NCHITTESTメッセージで領域を指定して行うことにしました。 子ウィンドウで付箋紙?みたいなのを、自分で作成したグラフィックを使用して作りたかったので、これらの方法で実装使用と思います。 ありがとうございます。