- 2009-07-17 (金) 2:23
- Programming
懐かしいことを聞かれたので。調べたら、VBのコードが多いのね。
ダブルクリックでフォームを閉じたければ、MouseDoubleClick っていうイベントで Close() すればよい。そのほかにも、マウスイベントの e.Clicks を見るという手もある。ここでは、MouseDown で処理したけど、普通は MouseDoubleClick でいい。
ついでに、ドラッグでフォームを移動させる。Delphi 系のサイトではおなじみの初心者向けTIPSだよね。マウスがクリックされたら、マウスのイベント処理を中断して、「タイトルバーで左クリックされたぜ!」とWindowsにウソを教える。移動コマンドを送ってもいい。自分でマウス押し下げ移動→フォームの位置を更新するのはお勧めしない。フレームワークが充実すると、Windows が 「ウィンドウとメッセージでできてる」ことを実感しにくくなるかな。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices; // for DllImport
namespace SampleBorderlessButMovableForm
{
public partial class Form1 : Form
{
[DllImport("User32.dll")]
public static extern bool ReleaseCapture();
[DllImport("User32.dll")]
public static extern int SendMessage(
IntPtr hWnd, int Msg, int wParam, int lParam);
const int WM_NCLBUTTONDOWN = 0xA1;
const int WM_SYSCOMMAND = 0x112;
const int SC_MOVE = 0xF010;
const int HTCAPTION = 2;
public Form1()
{
InitializeComponent();
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
if (e.Clicks > 1) // double click, and more ...
{
Close();
}
else
{
ReleaseCapture();
SendMessage(
Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);
/* SendMessage (
Handle, WM_SYSCOMMAND, SC_MOVE + 2, 0); */
}
}
}
}
}
でも、ぶっちゃけこういうコードは使わずに、標準的な動作に準拠したほうがいいと思うのさ。わざわざタイトルバーを消す必要があるんすかねーとか、考えてみてもいいかもね。やってみたい気持ちもわかるけど!w
—
SC_MOVE “+ 2” はマウスでの移動ってことで、SC_MOVE だけだとキーボードでの移動になるらしい。
- Newer: 2010 Suzuki GSR740 … ?
- Older: これは震えざるを得ないだろ。

