「MFCコントロール - 分割ウインドウ」の版間の差分

📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

261行目: 261行目:
それは、CSplitterWndExの派生クラスを作成して、OnNcHitTestハンドラをオーバーライドして<br>
それは、CSplitterWndExの派生クラスを作成して、OnNcHitTestハンドラをオーバーライドして<br>
CSplitterWndEx::OnNcHitTest関数で無条件にHTBORDERを返せば、マウスカーソルも変更されない。<br>
CSplitterWndEx::OnNcHitTest関数で無条件にHTBORDERを返せば、マウスカーソルも変更されない。<br>
<br>
<br>
分割ウインドウにて、仕切り位置を固定し、ユーザーに位置変更をさせない方法がある。<br>
また、カーソルが乗っても移動用のカーソルに変更しないようにする。<br>
<br>
まず、CSpritterWndまたはCSpritterWndExの派生クラスを作成する。(ここではCMySplitterWndEx)<br>
CMySplitterWndExにてHitTestハンドラをオーバーライドする。<br>
HitTestハンドラは、下記のように宣言されている。<br>
virtual int HitTest(CPoint pt) const;
<br>
HitTestの戻り値は下記の通りで、操作禁止にしたい方向のときに"0"を返すようにする。<br>
<source lang="c++">
enum HitTestValue
{
    noHit                  = 0,
    vSplitterBox            = 1,
    hSplitterBox            = 2,
    bothSplitterBox        = 3,          // just for keyboard
    vSplitterBar1          = 101,        // 横方向の上下に動かすバー
    vSplitterBar15          = 115,
    hSplitterBar1          = 201,        // 縦方向の左右に動かすバー
    hSplitterBar15          = 215,
    splitterIntersection1  = 301,        // 縦と横が交わる点
    splitterIntersection225 = 525
};
</source>
<source lang="c++">
int CMySplitterWndEx::HitTest(CPoint pt) const
{
    int ht = CSplitterWndEx::HitTest(pt);  // CSpritterWndExは、テーマの変更処理が追加されただけなのでCSplitterWndでも可
    if(ht == 201 || ht == 301)
    {  // 横方向のバーだけ上下に移動可
      ht = 0;  // ヒットしてないことにする
    }
    return ht;
}
</source>
上記の例では、横方向のバーだけ上下に移動出来るようになり、縦方向や交差している点ではカーソルも変更されない。<br>
enumのHitTestValueはcppファイル内で宣言されているため、使用する場合は各自で追加する。<br>
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:MFC]]
[[カテゴリ:MFC]]