○起動時にウィンドウを表示しない
起動時にウィンドウを表示されないようにするには、タイマーを使ってウインドウが生成された後に消す必要があるようです。
しかし、タイマーを使ってShowWindow(hDlg,SW_HIDE)を実行した場合には一瞬ウィンドウが表示されてしまいます。
そのため、SetWindowPos(hWnd,NULL,-100,-100,0,0,SWP_HIDEWINDOW)によりウインドウの座標を X:-100 Y:-100 にしてディスプレイの外に移動し、サイズを W:0 H:0 変更して消すと一瞬で消えました。
ウィンドウの座標 X:0 Y:0 画面の一番左上、SetWindowPos(hWnd,NULL,0,0,0,0,SWP_HIDEWINDOW)だと一瞬最小化された画面が表示されます。
RECT rc;
//ダイアログプロシージャー
BOOL CALLBACK DlgProc(HWND hDlg,UINT msg,WPARAM wp,LPARAM lp){
switch (msg){
case WM_SHOWWINDOW:
SetTimer(hDlg,1000,0,NULL);//ID:1000 0msのタイマーを作成
break;
case WM_USER_MSG://タスクトレイのアイコンのメッセージ
switch(lp)
{
case WM_RBUTTONDOWN:
{
//アイコンが右クリックされたらメニューを表示
POINT pt;
GetCursorPos(&pt);
HMENU menu=LoadMenu((HINSTANCE)GetWindowLong(hDlg, GWL_HINSTANCE),MAKEINTRESOURCE(IDR_MENU1));
SetForegroundWindow(hDlg);
TrackPopupMenu(GetSubMenu(menu,0),TPM_LEFTALIGN,/* X */pt.x,/* Y */pt.y,NULL,hDlg,NULL);
DestroyMenu(menu);
}
break;
case WM_LBUTTONDOWN:
{
//アイコンが左クリックされたら、ダイアログの表示と非表示を交互に繰り返す
RECT i;
GetWindowRect(hDlg,&i);
if(i.top<0){
//ダイアログを表示
SetWindowPos(hDlg,NULL,rc.left,rc.top,rc.right -rc.left,rc.bottom -rc.top,SWP_SHOWWINDOW);
//最前面に固定 固定しないと一番前に表示されない
SetWindowPos(hDlg,HWND_TOPMOST, 0, 0, 0, 0, (SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW));
//最前面を解除 解除しないと最前面から変更できない
SetWindowPos(hDlg,HWND_NOTOPMOST, 0, 0, 0, 0, (SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW));
}else{
SetTimer(hDlg,1000,0,NULL);
}
}
break;
}
case WM_TIMER:
if(wp == 1000){
//ダイアログの座標を保存して消す
GetWindowRect(hDlg,&rc);
SetWindowPos(hWnd,NULL,-100,-100,0,0,SWP_HIDEWINDOW);
KillTimer(hDlg,1000);
}
break;
case WM_COMMAND:
switch (LOWORD(wp)){
case ID_MENUITEM40001:
//メニューにて設定の操作
//ダイアログを表示
SetWindowPos(hDlg,NULL,rc.left,rc.top,rc.right -rc.left,rc.bottom -rc.top,SWP_SHOWWINDOW);
//最前面に固定 固定しないと一番前に表示されない
SetWindowPos(hDlg,HWND_TOPMOST, 0, 0, 0, 0, (SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW));
//最前面を解除 解除しないと最前面から変更できない
SetWindowPos(hDlg,HWND_NOTOPMOST, 0, 0, 0, 0, (SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW));
break;
case ID_MENUITEM40002:
//メニューにてアプリケーションの終了の操作
NTFYICON::eraseNtfiIcon();//タスクトレイのアイコンを削除
EndDialog(hDlg,WM_CLOSE);
break;
}
break;
case WM_CLOSE:
SetTimer(hDlg,1000,0,NULL);//ID:1000 0msのタイマーを作成
break;
}
return FALSE;
}
▼ ウィンドウの非表示 ( 赤文字部分 )
画面が表示された時のWM_SHOWWINDOWと画面が閉じた時のWM_CLOSEの時に、タイマーを起動します。
タイマー内では、ウィンドウの座標を保存して画面を非表示にします。
▼ ウィンドウを表示する ( 緑文字部分 )
ウィンドウを表示する場合には保存した座標を使用します。
しかし、そのまま表示するだけだと他のウィンドウの下側に隠れて見えないなどの不具合が発生します。。
そこで、表示してから最前面に固定してから解除しています。。
そうすることにより、他のウインドウの上に表示されるようになります。
でも、よくよく考えたら SetForegroundWindow(hDlg); だけで最前面に表示されますのでこんな面倒な事しなくても良かったみたいです。
▲トップページ
>
Windows と C++