« 記事修正のお知らせ | トップページ | DrawRectangle と Pen の設定による描画位置 »

2011年9月23日 (金)

タイトルバーのないフォームの移動

タイトルバーのないフォームの移動を行なう場合のプログラム記述については、既に他のサイトでも紹介されています。しかし、実際の使用においては補足する必要もあったので、あえて覚え書きとして残しておきます。

この手で、一番考えつきやすいのは、マウスの左ボタンダウンでマウス位置を記憶→マウス移動でフォームをマウスの移動に合わせて位置合わせをしなおす方法ですね。
この手以外にも、WM_NCHITTESTのメッセージを捕まえて処理する方法でも簡単に出来ます。

これら2つの方法とも、DOBON.NETの「タイトルバーのないフォームを移動できるようにする」で紹介されてます。従って本来はここであえて記事にする必要もないのですが、1点だけ補足の必要があります。

WM_NCHITTESTを使用したやり方の場合、マウスイベントを使うやり方より簡単そうに見えますが、これだけだとタイトルバーの扱いになるので、ダブルクリックすると最大化してしまうという欠点があります。

ダブルクリックしても最大化しない様にするには、WndProcの記述に、以下のコードを追加する必要があります。

protected override void WndProc(ref Message m)
{
    const int WM_SYSCOMMAND = 0x112;
    const int SC_MAXIMIZE = 0xF030;

    const int WM_NCHITTEST = 0x84;
    const int HTCLIENT = 1;
    const int HTCAPTION = 2;

    // 最大化要求のメッセージは基本クラスのメッセージ処理を行なわせない
    if ((m.Msg == WM_SYSCOMMAND) && ((m.WParam.ToInt32() & SC_MAXIMIZE) == SC_MAXIMIZE))
        return;

    base.WndProc (ref m);

    //マウスポインタがクライアント領域内にあるか
    if ((m.Msg == WM_NCHITTEST) &&
        (m.Result.ToInt32() == HTCLIENT))
    {
        //マウスがタイトルバーにあるふりをする
        m.Result = (IntPtr) HTCAPTION;
    }
}

最後にこのテストの為に作ったテストプログラムのソース一式をCAB形式で圧縮して、ここに置いておきます。
なおこれの処理部分は、ほとんどDOBON.NETのままです。上記の補足とテスト動作用にちょっぴりだけオリジナルのコードが入っているだけです。
「NonTitle.cab」をダウンロード


« 記事修正のお知らせ | トップページ | DrawRectangle と Pen の設定による描画位置 »

覚え書き」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: タイトルバーのないフォームの移動:

« 記事修正のお知らせ | トップページ | DrawRectangle と Pen の設定による描画位置 »