기본 제공되는 윈도우즈 폼의 형식을 이용하지 않고..
타이틀바를 이쁘게 꾸민다던지, 스킨을 입힌다던지.. 기타등등의 이유로 FormBorderStyle.None 을 세팅하는 경우가 있을텐데요.
그럴경우에 타이틀바가 없어지기 때문에 마우스 위치 캡쳐하면서 드래그를 구현하는데요.
아래의 팁은 굳이 복잡(?)한 로직을 구현하지 않더라도 API 호출로 살짝 눈속임 해주는것만으로도 간단하게 드래그를 구현해주는 팁입니다.
특정 영역으로 제한하고 싶을때는MouseEventArgs 의 위치 정보를 활용하면 되겠죠.
using System; using System.Windows.Forms; using System.Runtime.InteropServices;
namespace DragFormSample { public partial class DragFormSample : Form { [DllImport("user32.dll")] public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam); [DllImport("user32.dll")] public static extern bool ReleaseCapture();
public readonly int WM_NLBUTTONDOWN = 0xA1; public readonly int HT_CAPTION = 0x2;
public DragFormSample() { InitializeComponent();
this.FormBorderStyle = FormBorderStyle.None; }
protected override void OnMouseDown(MouseEventArgs e) { if (e.Button == MouseButtons.Left) { // 다른 컨트롤에 묶여있을 수 있을 수 있으므로 마우스캡쳐 해제 ReleaseCapture();
// 타이틀 바의 다운 이벤트처럼 보냄 SendMessage(this.Handle, WM_NLBUTTONDOWN, HT_CAPTION, 0); }
base.OnMouseDown(e); } } } |
출처 : 훈스닷넷