无边框窗体的拖动和拉伸

  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Data;
  5 using System.Drawing;
  6 using System.Linq;
  7 using System.Text;
  8 using System.Windows.Forms;
  9 using System.Runtime.InteropServices;
 10 
 11 namespace WindowsFormsApplication2
 12 {
 13     public partial class Form1 : Form
 14     {
 15         public Form1()
 16         {
 17             InitializeComponent();
 18             this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
 19         }
 20 
 21         protected override void OnMouseDown(MouseEventArgs e)
 22         {
 23             base.OnMouseDown(e);
 24             if (e.Button == MouseButtons.Left &&
 25                 this.WindowState != FormWindowState.Maximized)
 26             {
 27                 ReleaseCapture();
 28                 SendMessage(this.Handle, 274, 61440 + 9, 0);
 29             }
 30         }
 31 
 32         [DllImport("user32.dll")]
 33         public static extern int ReleaseCapture();
 34 
 35         [DllImport("user32.dll")]
 36         public static extern int SendMessage(IntPtr hwnd, int msg, int up, int lp);
 37 
 38         protected override void WndProc(ref Message m)
 39         {
 40             switch (m.Msg)
 41             {
 42                 case (int)WindowsMessage.WM_NCHITTEST:
 43                     this.WM_NCHITTEST(ref m);
 44                     break;
 45                 default:
 46                     base.WndProc(ref m);
 47                     break;
 48             }
 49         }
 50 
 51         public static int LOWORD(int value)
 52         {
 53             return value & 0xFFFF;
 54         }
 55 
 56         public static int HIWORD(int value)
 57         {
 58             return value >> 16;
 59         }
 60 
 61         private void WM_NCHITTEST(ref Message m)
 62         {
 63             int wparam = m.LParam.ToInt32();
 64             Point point = new Point(LOWORD(wparam), HIWORD(wparam));
 65             point = this.PointToClient(point);
 66 
 67             if (point.X <= 5)
 68             {
 69                 if (point.Y <= 5)
 70                     m.Result = (IntPtr)WinAPIConst.HTTOPLEFT;
 71                 else if (point.Y > this.Height - 5)
 72                     m.Result = (IntPtr)WinAPIConst.HTBOTTOMLEFT;
 73                 else
 74                     m.Result = (IntPtr)WinAPIConst.HTLEFT;
 75             }
 76             else if (point.X >= this.Width - 5)
 77             {
 78                 if (point.Y <= 5)
 79                     m.Result = (IntPtr)WinAPIConst.HTTOPRIGHT;
 80                 else if (point.Y >= this.Height - 5)
 81                     m.Result = (IntPtr)WinAPIConst.HTBOTTOMRIGHT;
 82                 else
 83                     m.Result = (IntPtr)WinAPIConst.HTRIGHT;
 84             }
 85             else if (point.Y <= 5)
 86             {
 87                 m.Result = (IntPtr)WinAPIConst.HTTOP;
 88             }
 89             else if (point.Y >= this.Height - 5)
 90             {
 91                 m.Result = (IntPtr)WinAPIConst.HTBOTTOM;
 92             }
 93             else
 94                 base.WndProc(ref m);
 95         }
 96     }
 97 
 98     public enum WindowsMessage
 99     {
100         /// <summary>
101         /// 移动鼠标,桉树或释放鼠标时发生
102         /// </summary>
103         WM_NCHITTEST = 0x84,
104     }
105     public class WinAPIConst
106     {
107         public const int HTLEFT = 10;
108         public const int HTRIGHT = 11;
109         public const int HTTOP = 12;
110         public const int HTTOPLEFT = 13;
111         public const int HTTOPRIGHT = 14;
112         public const int HTBOTTOM = 15;
113         public const int HTBOTTOMLEFT = 0x10;//16
114         public const int HTBOTTOMRIGHT = 17;
115         public const int HTCAPTION = 2;
116 
117     }
118 }

 

posted @ 2012-10-31 16:19  JeffQing  阅读(1207)  评论(0编辑  收藏  举报