• 締切済み

[WinAPI]リージョンウィンドウとシステムメニューについて

C言語でWINDOWSプログラムを組んでいます。 リージョンウィンドウでウィンドウを作成した場合、終了処理や最小化など基本的にシステムがやってくれることも自分で書く必要があると思うのですが、いい方法が見つかりません。 お粗末なやり方ですが、WS_SYSMENUやWS_MINIMIZEBOX等のウィンドウスタイルを無理やりに使って、その場をしのいでいます。 しかし、最小化・元に戻すなどを行ったときに、一瞬ですがクラシックスタイルのキャプションバーが表示されます。 また、画面の外で最小化->元に戻すを行った場合、リージョンウィンドウの左上に重なってキャプションバーが描画されてしまい、見た目が悪いです。 以下の方法について解答お願いいたします。 1.タスクバー(タスクトレイではない)で右クリックしたときに表示されるPOPUPメニューの作り方。 2.タスクバーを左クリックしたときのアクティブ化と最小化・元に戻す、イベント処理。 3.もしくは、WS_SYSMENUを使わずにシステムに基本的な処理を任せる方法。 説明不足でしたら補足いたしますので、ご回答お願いいたします。

みんなの回答

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★アドバイス ・どんなソフトを作成中なのでしょうか?  全体像を把握する上で補足をお願いします。 >1.タスクバー(タスクトレイではない)で右クリックしたときに表示されるPOPUPメニューの作り方。  ↑  http://www.winapi-database.com/Message/WM/WM_PAINTICON.html→『WM_PAINTICON』  http://www.winapi-database.com/Message/WM/WM_QUERYDRAGICON.html→『WM_QUERYDRAGICON』  http://www.winapi-database.com/Message/WM/WM_ICONERASEBKGND.html→『WM_ICONERASEBKGND』  この辺を調べてみましょう。  未確認ですが WM_PAINTICON メッセージを処理すれば…。 >2.タスクバーを左クリックしたときのアクティブ化と最小化・元に戻す、イベント処理。  ↑  http://www.winapi-database.com/Message/WM/WM_SIZE.html→『WM_SIZE』  WM_SIZE メッセージを処理すれば良いでしょう。  例  switch ( wParam ){   case SIZE_RESTORED: [元に戻すイベント処理] break;   case SIZE_MINIMIZED: [最小化イベント処理] break;   case SIZE_MAXIMIZED: [最大化イベント処理] break;   default:[それ以外] break;  } >3.もしくは、WS_SYSMENUを使わずにシステムに基本的な処理を任せる方法。  ↑  WM_SYSCOMMANDメッセージですべて処理可能と思います。  http://yokohama.cool.ne.jp/chokuto/urawaza/message/WM_SYSCOMMAND.html  http://www.winapi-database.com/Message/WM/WM_SYSCOMMAND.html  例:  POINT pt; ←マウス座標を入れる(コマンド実行だけなら入れなくても良い)  SendMessage( hWnd, WM_SYSCOMMAND, SC_MAXIMIZE, MAKELPARAM(pt.x,pt.y) );  これで最大化されるはず。

kenji_aki
質問者

補足

回答ありがとうございます。 どのようなソフト、と申されましても少々困ってしまいます。 今回の質問に関しましては、リージョンウィンドウで作成されたウィンドウの基本的な動作に関する事柄ですから。 つまりは、これから先リージョンウィンドウで凝った概観を持つウィンドウを作成する場合に、WM_SYSMENUやWM_MINIMIZEBOX等のウィンドウスタイルを使わずに同じようなことをしたい(タスクバーのボタン?を右クリックしたときに出るPopupMenuだとか左クリックでアクティブかや最小化をサポート)、といった質問です。 1.に関してタスクバーのボタン(アイコンとタイトルが表示される)で右クリックした場合のPOPUPのSYSTEMMENUに関してはウィンドウメッセージの0x313(マクロ定義が無く、隠し機能のようなもの)を捕まえて独自のPOPUPMENUを表示させる事で解決できました。 2.のタスクバーのボタンを左クリックした場合にWM_MINIMIZEBOXスタイルが適応されたウィンドウと同じ動作、つまり、タスクバーのボタンを左クリックした時に最小化させる機能を持たせたいのですが、これに関してはなかなかうまくいきません。 どうやら、質問の意図がうまく伝わっていないようで申し訳ないのですが、ちょっと細かく書いてみます。 まず、普通にWM_SYSMENUとWM_CAPTION・WM_MINIMIZEBOXを指定したウィンドウを作ると、タスクバーのボタン(これは、タスクトレイと勘違いされる恐れがあるので、細かく言います。画面の下に表示されるタスクバーのスタートボタンの右側に表示されるアプリケーションのアイコンとタイトルが表示されたボタンのようなものです。アイコンだけのタスクトレイとは違います。)を左クリックすると、まずアクティブでないウィンドウはアクティブになります。このときボタンは窪んで表示されるはずです。そしてアクティブなウィンドウなら最小化されます。さらに最小化されているなら元の位置にアクティブな状態で表示されます。 これを、WM_SYSMENU・WM_MINIMIZEBOX等を使わない只のWM_POPUPでウィンドウを作成してリージョンウィンドウとして表示させます。 すると、ウィンドウに対してWM_SYSCOMMANDなどで閉じるや最小化をポストしてあげるとちゃんと機能するのですが、先も言ったとおり、タスクバーのボタンで上記のウィンドウのような振る舞いができません。 POPUPMENUに関しては解決いたしましたので、左クリックをしたときにアクティブなら最小化されるようにしたいのです。 例えばタスクバーのボタンが押されたときに送られてくるメッセージだとかそういうのがあれば教えていただきたいと思います。 書いてて思い出したのですが、タスクバーのボタンを左クリックしたときにいくつかメッセージが送られる事がわかりました。 これは、アクティブにされたときのメッセージだったりフォーカスが失われたり得たときのメッセージだったりします。都合4,5個くらい送られてくるのですが、直接タスクバーが押されたことを示すメッセージは見つけられませんでした。 これらのメッセージを使ってアクティブなら最小化されるようなやり方はご存知ないでしょうか? もちろん、タスクバーのボタンが押された時にだけ処理させないと、思いもしないところで最小化されてしまっては困りますので、なかなかうまくいかないとは思うのですが 説明下手で申し訳ありませんがお知恵をお貸しください。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.1

WM_NCHITTESTを独自に処理して、 HTCAPTIONとか、 HTCLOSE、HTMAXBUTTON、HTMINBUTTON、HTSYSMENUといった値をそれぞれ返してやればよかったと思います。

関連するQ&A