« ウィンドウ位置保存その2 |メイン| コントロールサイズのリサイズ »

ウィンドウ保存位置その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を持たせて対処。
力業だけど仕方在るまい。

なにか良い方法無いかなぁ。

« ウィンドウ位置保存その2 |メイン| コントロールサイズのリサイズ »

Σ(・×・)