< ダイアログのデフォルトボタンを変更する | ナチュラルインプットを抹殺する >

October 21, 2005

非表示のウインドウの最大化を解除する

ウインドウを最大化した後、非表示にする。

SendMessage (hWnd, WM_SYSCOMMAND, SC_MAXIMIZE);
ShowWindow (hWnd, SW_HIDE);

次に表示すると、ウインドウは最大化状態のままだ。

ShowWindow (hWnd, SW_SHOW);

ここで問題です。ウインドウを非表示のままでリストア(元のサイズに戻す、つまり最大化状態を解除)するにはどうしたらいいでしょう。

// 元のサイズに戻るが、同時にウインドウが表示されてしまう
ShowWindow (hWnd, SW_RESTORE);

// これも
SendMessage (hWnd, WM_SYSCOMMAND, SC_RESTORE);

// これも
WINDOWPLACEMENT Placement;
ZeroMemory (&Placement, sizeof (WINDOWPLACEMENT));
Placement.length = sizeof (WINDOWPLACEMENT);
GetWindowPlacement (hWnd, &Placement);
Placement.showCmd = SW_RESTORE;
SetWindowPlacement (hWnd, &Placement);

意外と難しい。最終的に、私が思いついたのはこんな方法。

DWORD dwStyle = GetWindowLong (hWnd, GWL_STYLE);
dwStyle &= ~WS_MAXIMIZE;
SetWindowLong (hWnd, GWL_STYLE, dwStyle);

この場合、最大化時のウインドウ位置とサイズがそのままでリストアされてしまう。非表示のままリストアを厳密にシミュレートするには、あらかじめ GetWindowPlacement で、リストア時のウインドウ矩形を取得しておき、リストア後に MoveWindow してあげないといけない。

トラックバック

このエントリーにトラックバック:
http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/1113

コメント

コメントする

※ コメントスパム対策のため、コメント本文はおはよう、こんにちわ、こんばんわのいずれかより始めるようにしてください。

name:
email:

※ 必要ですが、表示しません。

url:
情報を保存する ?