ウィンドウ保存位置その3 | August 2, 2008 8:03 PM _ prgramming
WINDOWPLACEMENTのshowCmdにSW_HIDEが保存されないと言う件で、
GetWindowPlacement()についてMSDNを読んだら以下のような記述が。
CWnd が最大表示されている場合は、WINDOWPLACEMENT 構造体の showCmd メンバは SW_SHOWMAXIMIZED になります。ウィンドウが最小化されている場合は、このメンバは SW_SHOWMINIMIZED になります。それ以外は SW_SHOWNORMAL になります。
要は最大化か最小化しか状態を保存できないと言うことらしい。
仕方ないので状態保存用の関数を書き換えることに。
修正前は、
// target : 状態を保存するウィンドウクラスへのポインタ
// nID : ウィンドウのID
void inputState(CWindow* target,int nID){
target->GetWindowPlacement(&wndPlc[nID]);
}
となっていて、WINDOWPLACEMENT構造体の配列に直接値を取得して居たわけだけれど、
GetWindowPlacement()は前述の通り、showCmdにSW_HIDEを保存できないので、以下のように修正。
// inWindplc : 保存するWINDOWPLACEMENT
// nID : ウィンドウのID
void inputState(WINDOWPLACEMENT inWndplc,int nID){
// ウィンドウ状態コピー
wndPlc[nID].flags = inWndplc.flags;
wndPlc[nID].length = inWndplc.length;
wndPlc[nID].ptMaxPosition = inWndplc.ptMaxPosition;
wndPlc[nID].ptMinPosition = inWndplc.ptMinPosition;
wndPlc[nID].rcNormalPosition = inWndplc.rcNormalPosition;
wndPlc[nID].showCmd = inWndplc.showCmd;
}
あとは呼び出し元を、
{
(~略~)
// ウィンドウ状態保存
WINDOWPLACEMENT wndplc;
GetWindowPlacement(&wndplc); //現在の状態を取得
// 表示状態をチェックし代入
if(IsWindowVisible()) wndplc.showCmd = SW_NORMAL;
else wndplc.showCmd = SW_HIDE;
// 状態保存関数呼び出し
pcfm->inputState(wndplc,wndId);
(~略~)
}
と修正。
一応これで無事動作することを確認。
さくさく次に進もう。
と思ったら確認不足。
OnDestroy()が呼び出されるのはウィンドウ破棄後。
すなわち必ずIsWindowVisible()はfalseを返す……!
なんかもう色々ごちゃごちゃ考えるのが面倒になったので、メンバにvisibleを持たせて対処。
力業だけど仕方在るまい。
なにか良い方法無いかなぁ。
Σ(・×・)