フォームをドラッグするには、Windowsメッセージをホールドアップ。
あなたは、開発に窓のないタイトルバーを提供しないためにここにいるとき
または不規則なウィンドウ
あなたは小さな眉機能をドラッグする必要があります...
私は今、ほとんどの人が実践していることがわかり
1.座標を記録する際に、ウィンドウ上でマウスの右ボタンを押すと
マウスは、記録の相対変位を移動2.
3.マウスが解放されると、ウィンドウが座標に対して移動します
しかし、実際には、このトラブルに手を触れないでください
ここでは原則についてご説明します
我々はタイトル欄を押した後にウィンドウをドラッグすることができた理由
システムは知らせを受けたため、WM_NCLBUTTONDOWN
だから今、あなたは言ってウィンドウをドラッグすることができます
そして、我々は、マウスの左ボタンで見出しされていない列が押されたとき
これは、WM_LBUTTONDOWNを受け取ることになります
しかし、あなたは、タイトルバーを非表示にした後、
WM_NCLBUTTONDOWN自然のシステムが受け取ることはありません
私はここで何人かの人々がすべき知っていただきたいと思いますZenmo
はい^^
そのWM_LBUTTONDOWNを受信します
彼はWM_NCLBUTTONDOWNを置き換えます
次のプログラムは練習でした
あなたがMFCにいる場合は、このメソッドのWindowProcをオーバーライドすることができます限り
LRESULT CMoveWindowsDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
// 拦截鼠标消息
case WM_LBUTTONDOWN:
// 然后送出WM_NCLBUTTONDOWN
this->SendMessage(WM_NCLBUTTONDOWN,HTCAPTION);
return 1;
}
return CDialog::WindowProc(message, wParam, lParam);
}
な限り、
あなたはの目的を達成することができます
それは今^^
もちろん、C#で同じことを行うことができます
しかし、少しトラブル
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; // 记得要参考这个才能叫用外部dll
namespace MoveWindowsCS
{
public partial class Form1 : Form, IMessageFilter
{
private const int WM_LBUTTONDOWN = 0x0201; // WM_LBUTTONDOWN 的消息编号
private const int WM_NCLBUTTONDOWN = 0x00A1; // WM_NCLBUTTONDOWN 的消息编号
private const int HTCAPTION = 2; // 标题栏本身
// 这里引用SendMessage这个API
[DllImport("user32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
public Form1()
{
InitializeComponent();
// 记得向Application注册PreFilterMessage才会生效
Application.AddMessageFilter(this);
}
///
/// 这边的做法与MFC类似
///
///
///
public bool PreFilterMessage(ref Message m)
{
switch (m.Msg)
{
case WM_LBUTTONDOWN:
SendMessage(this.Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);
break;
}
return true;
}
}
}
オリジナル:大列 ウィンドウのドラッグ&hellipに。