MFC   VC++   Visual Studio   Visual Studio   プログラミング

スプリッタウインドウの最小制限

 スプリッタウインドウでペインのサイズを一定以下に出来ないようにする方法を紹介します。

 通常、ペインの最小サイズを設定するときは、SetColumnInfoでcxMinを設定するか、SetRowInfoでcyMinを設定しますが、これだと設定値以下になったとき、幅や高さが"0"になると思います。

 そこで、ユーザーがペインの幅や高さを設定したサイズ以下にしようとしたとき、設定したサイズに戻るようにします。

 方法は、CSplitterWnd(Ex)クラスを派生させ、仮想関数「StopTracking」をオーバーライドします。
 まず、ヘッダで以下のように宣言し、
    virtual void StopTracking(BOOL bAccept);
 cppファイルで、
void CMySplitterWndEx::StopTracking(BOOL bAccept)
{
    CSplitterWndEx::StopTracking(bAccept);

    if(bAccept)        // bAcceptがTRUEのときだけ処理する
    {
        int iPos, iMin;
        GetRowInfo(0, iPos, iMin);    // 0行目の高さを取得
        if(iPos < 100)        // 最小値を"100"に設定
        {
            SetRowInfo(0, 100, 100);    // 高さを"100"に戻す
            RecalcLayout();
        }
    }
}
 上記の例は、0行目の高さが100未満になったとき、高さを100に戻しています。
 違う行を設定したい場合は、GetRowInfoとSetRowInfoの第一引数を指定の行に変更し、列を設定したい場合は、GetRowInfoとSetRowInfoを、それぞれGetColumnInfoとSetColumnInfoに変更して下さい。

 StopTracking関数は、ペインサイズを変更したときだけでなく、カーソル移動などでも呼ばれるため、ペインサイズが変更されたかどうかのフラグ「bAccept」が「TRUE」のときだけ処理するようにしてあります。

 ここで注意点として、このやり方だと一度小さく変更された後、指定のサイズに戻すため、最初に小さくなる描画処理が入り、そのあとまた大きくする描画処理が入るため、
場合によってはビュー内がちらついたり、スクロールバーが表示されたりすることがあります。

 他にも良い方法がありそうなのですが、今のところ確認できていないので、今回はこの方法を紹介しました。
 考えてとしては、LBUTTONUPで小さくなりそうだったら、LBUTTONUPの位置を指定の位置にすることで、一気に指定サイズに出来そうな気はするのですが・・・。
 実際内部では、Min値以下になったら"0"になるように処理している訳ですからね。

 この後、別のきちんとした方法を見つけたので、次の記事で紹介します。
ランキングへ     posted by 遠雷 | Comment(0) | フレーム
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。