非表示のウインドウの最大化を解除する
ウインドウを最大化した後、非表示にする。
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
コメント