タイトルバーのないフォームの移動
タイトルバーのないフォームの移動を行なう場合のプログラム記述については、既に他のサイトでも紹介されています。しかし、実際の使用においては補足する必要もあったので、あえて覚え書きとして残しておきます。
この手で、一番考えつきやすいのは、マウスの左ボタンダウンでマウス位置を記憶→マウス移動でフォームをマウスの移動に合わせて位置合わせをしなおす方法ですね。
この手以外にも、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 の設定による描画位置 »
「覚え書き」カテゴリの記事
- プロジェクトにXMLスキーマを取り込む場合の注意点(2012.10.14)
- VS2008 XMLスキーマのプロジェクト取り込み(2012.09.17)
- DrawRectangle と Pen の設定による描画位置(2011.09.24)
- タイトルバーのないフォームの移動(2011.09.23)
- TextBox のマウス位置に該当する行・桁位置を求める(2011.02.13)
この記事へのコメントは終了しました。
コメント