Winform. FormBorderStyle設(shè)置為None后移動窗體
在C# Winform中,系統(tǒng)只帶的窗體樣式,不太好看,往往需要把FormBorderStyle設(shè)置為None,然后自己根據(jù)需求定制窗體的樣式,
Winform FormBorderStyle設(shè)置為None后移動窗體
。FormBorderStyle設(shè)置為NoneWinform后移動窗體主要有兩種方法。
第一種:通過鼠標(biāo)事件來模擬先在窗體中激活三個(gè)事件:MouseDown,MouseUp,MouseMove. 然后利用 this.Location,Control.MousePosition,進(jìn)行模擬。
<code class="hljs" cs="">private bool flag1 = false; //標(biāo)記鼠標(biāo)是否按下左鍵private bool flag2 = false; //標(biāo)記鼠標(biāo)光標(biāo)是否進(jìn)入目的區(qū)域private Point FM, FL;private void Form1_MouseDown(object sender, MouseEventArgs e){ if (e.Button == MouseButtons.Left) //按下鼠標(biāo)左鍵 { FM = Control.MousePosition; //取鼠標(biāo)光標(biāo)相對于屏幕左上角的坐標(biāo)。 FL = this.Location; //窗體左上角相對于屏幕的左上角的坐標(biāo)。 flag1 = true; /* 限制鼠標(biāo)光標(biāo)在目的區(qū)域(30,300)里才能讓窗體移動。 去掉if可實(shí)現(xiàn),鼠標(biāo)光標(biāo)在窗體的任何位置點(diǎn)擊都可移動窗體。 */ if ((FM.X - FL.X) <= 300 && (FM.Y - FL.Y) <= 30) { flag2 = true; } }}private void Form1_MouseUp(object sender, MouseEventArgs e){ // 鼠標(biāo)左鍵彈起時(shí),重置判斷狀態(tài)。 flag1 = false; flag2 = false;}private void Form1_MouseMove(object sender, MouseEventArgs e){ if (flag1 && flag2) { Point pt = Control.MousePosition; int x = FM.X - pt.X; int y = FM.Y - pt.Y; Location = new Point(FL.X - x, FL.Y - y); // 繪制最新位置 }}</code>
第二種:重寫WndProc函數(shù)當(dāng)重載窗體的 WndProc 方法時(shí),可以截獲 WM_NCHITTEST 消息并改些該消息,
電腦資料
《Winform FormBorderStyle設(shè)置為None后移動窗體》(http://www.szmdbiao.com)。 當(dāng)判斷鼠標(biāo)事件發(fā)生在客戶區(qū)時(shí),改寫改消息,發(fā)送 HTCAPTION 給窗體。 這樣,窗體收到的消息就時(shí) HTCAPTION ,在客戶區(qū)通過鼠標(biāo)來拖動窗體就如同通過標(biāo)題欄來拖動一樣。 注意:當(dāng)你重載 WndProc 并改寫鼠標(biāo)事件后,整個(gè)窗體的鼠標(biāo)事件也就隨之改變了。<code class="hljs" cs="">private const int WM_NCHITTEST = 0x84;private const int HTCLIENT = 0x1;private const int HTCAPTION = 0x2;protected override void WndProc(ref Message id){ // 引用消息ID(ref Message ID) switch (id.Msg) { case WM_NCHITTEST: base.WndProc(ref id); if ((int)id.Result == HTCLIENT) id.Result = (IntPtr)HTCAPTION; return; } base.WndProc(ref id);}</code>
總結(jié):
使用第一種方法可以隨意的設(shè)置,鼠標(biāo)光標(biāo)在那個(gè)區(qū)域才可以實(shí)現(xiàn)窗體的移動,不過當(dāng)窗體的控件比較多的時(shí)候,窗體移動起來會有明顯的緩慢感覺。
使用第二種方法,不能設(shè)置目的區(qū)域,鼠標(biāo)光標(biāo)在窗體的任意位置都可以移動,并且改變了整個(gè)鼠標(biāo)事件的機(jī)制。