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

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

 前回紹介した方法だと、大きくする方向(下/右)へ仕切り線を移動させた場合、一つ下/一つ右の行/列の最小サイズが確保出来ませんでした。
 そこで、今回はその問題を解決する方法を紹介します。
 といっても、前回のものを少し改良するだけなので、変更点だけを掲載します。

 前回の以下の部分を、
    else if (m_pRowInfo[row].nCurSize + m_pRowInfo[row+1].nCurSize
            < pt.y + m_pRowInfo[row+1].nMinSize)
    {
        // not enough room for other pane
        if (GetStyle() & SPLS_DYNAMIC_SPLIT)
            DeleteRow(row + 1);
    }
から、
    else if (m_pRowInfo[row].nCurSize + m_pRowInfo[row+1].nCurSize
            < pt.y + m_pRowInfo[row+1].nMinSize)
    {
        CRect rct;
        GetClientRect(&rct);
        m_pRowInfo[row].nIdealSize =
            rct.Height() - (m_pRowInfo[row+1].nMinSize + m_cySplitter +
            m_cyBorderShare + m_cySplitterGap + m_cyBorder);
        // not enough room for other pane
        if (GetStyle() & SPLS_DYNAMIC_SPLIT)
            DeleteRow(row + 1);
    }
とするだけです。

 上記のコードについて少し説明すると、ペインが2行のときに仕切り線をドラッグして移動させた場合、「row」は常に"0"になるため、"1"のペインについては最小値が適用されずサイズ"0"になってしまいます。
 そこで、「else if」の部分で最小値になるように処理するのですが、仕切り線の位置からペイン"1"のサイズを確保できるように、ペイン"0"のサイズを変更します。
 そのとき、スプリッタウインドウのクライアント領域サイズを取得し、そこから仕切り線の幅などを引いてペイン"1"の最小値が確保できるようにペイン"0"のサイズを変更しています。

 さらに、またしても問題なのですが、メインフレームなどの親フレームをサイズ変更したとき、一番端のペインの最小サイズが確保できないのです。
 この問題については、もう少し調べてみて、解決方法がわかったらまた紹介したいと思います。
ランキングへ     posted by 遠雷 | Comment(0) | フレーム
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

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


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