VC++6.0で常駐プログラムを作成しております。
タスクトレイにアイコンを表示するところまでは
できました。
画面の最小化ボタンを押下したら画面が消え、
タスクトレイにあるアイコンをダブルクリック
したら表示される様にしたいです。
//最小化ボタンで画面を消す処理
void CChildDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフ
ォルトの処理を呼び出してください
ShowWindow(SW_HIDE);
//CDialog::OnSysCommand(nID, lParam);
}
最小化ボタンで画面を消す処理は上記の様にしたのですが、
これでよかったでしょうか?
後、アイコンをダブルクリックして元に戻したいのですが
それをどこにコーディングしたらよいのかが分からず悩んで
おります。
すいませんが、どうぞよろしくお願いします。
ここを参考にされては?
Win32APIでのやり方ですが、参考にはなると思います。
第254章 タスクトレーに格納する
http://www.kumei.ne.jp/c_lang/sdk3/sdk_254.htm
OnSysCommand() がどういう時に呼び出されるのか
ということは調べましたか?
>OnSysCommand() がどういう時に呼び出されるのか
>ということは調べましたか?
使い方が間違っているということですよね?
最小化した際に走るイベントだと思っていました。。。
CWnd::OnSysCommandを調べてみれば、わかると思います。
HELPを引く癖をつけたほうが良いです。
追加。
HELPのCWndクラスのメンバーを説明するページを上から下まで
一通り読んでみるとどんな物があるのかわかりますよ。
下の方にXXXXXメッセージ ハンドラと言うのが固まってますから
一通り読んでみるとよろしいかと。
void CChildDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフ
ォルトの処理を呼び出してください
switch(nID){
case SC_MINIMIZE :
ShowWindow(SW_HIDE);
break;
}
CDialog::OnSysCommand(nID, lParam);
}
PATIOさん、こんな感じでよかったですか?
ちょっと疑問。
ShowWindow(SW_HIDE)している状況でデフォルトのCDialog::OnSysCommandを呼び出すべき
なのか?
デフォルトの処理を動かしたくないのであれば、呼び出すべきではないような気もします。
非表示状態のウインドウに対する最小化ってどう処理されるんだろう。
void CChildDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフ
ォルトの処理を呼び出してください
switch(nID){
case SC_MINIMIZE :
ShowWindow(SW_HIDE);
break;
case SC_CLOSE:
PostMessage(WM_CLOSE);
break;
}
//CDialog::OnSysCommand(nID, lParam);
}
そうですねー。すいません。
あの後、動かしてみて修正しました。
今は上の様になっております。
今はコード変換ってどうやるのだろう。。。と悩んでおります。
PATIOさんの様にできるようになりたいものです・・・。
今度は、「最小化」と「閉じる」以外は何も起こらないコードになってますが、
大丈夫でしょうか?
あとヘルプに、
| In WM_SYSCOMMAND messages, the four low-order bits of the nID parameter
| are used internally by Windows. When an application tests the value of
| nID, it must combine the value 0xFFF0 with the nID value by using the
| bitwise-AND operator to obtain the correct result.
とある通り、(nID&0xFFF0) と比較しなければなりません。
基本的に自分が処理しない部分はデフォルトの実装であるCDialog::OnSysCommandを呼ぶ
のが定石だと思います。
独自の操作をしてなおかつ、デフォルトの操作を通したくない場合はCDialog::
OnSysCommandを呼びません。
呼ぶべきか、呼ぶべきでないかは自分がやりたい処理に依存します。
独自の操作+デフォルトの動作が必要な場合は、操作を行った上でCDialog::
OnSysCommandの呼び出しも行う必要があると思います。
厳密にはデフォルトの動作がどういう処理を行っているのかまで把握していないときちん
とした判断は難しいと思いますよ。