[Winform/C#]點(diǎn)擊工作區(qū)域移動(dòng)窗體
前言
話說(shuō)鼠標(biāo)點(diǎn)擊客戶區(qū)域?qū)崿F(xiàn)移動(dòng)窗體蠻簡(jiǎn)單的,目前有3種方法。
1.通過(guò)Form的MouseDown、MouseMove、MouseUp實(shí)現(xiàn)。這個(gè)邏輯比較簡(jiǎn)單就不介紹了。
2.通過(guò)Form的MouseDown事件里調(diào)用API。主要是調(diào)用ReleaseCapture()及SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0),WM_SYSCOMMAND=0x112、SC_MOVE=0xf010、HTCAPTION=0x2。大概是這樣,有興趣的可以試試。
3.重寫WndProc函數(shù),處理WM_NCHITTEST消息。
我是懶得用API,就選了第三種實(shí)現(xiàn)。
實(shí)現(xiàn)
先看代碼,對(duì)WM_NCHITTEST消息有興趣可以看看這里,以及MSDN。
protected override void WndProc(ref Message m) { base.WndProc(ref m); if (m.Msg == 0x84) //WM_NCHITTEST { m.Result = (IntPtr)2; //HTCAPTION } }
問(wèn)題1
坑爹的是,F(xiàn)orm在無(wú)邊框的時(shí)候,雙擊工作區(qū)就最大化,把屏幕的工具欄區(qū)域也覆蓋了。
好吧,在構(gòu)造函數(shù)里加句this.MaximumSize = Screen.PrimaryScreen.WorkingArea.Size;
問(wèn)題2
最大化沒(méi)問(wèn)題了,但是你丫最大化了還能移動(dòng)就太二了吧。
想想就只能在處理Windows消息之前把鼠標(biāo)左鍵點(diǎn)擊消息屏蔽了。
完整代碼如下:
protected override void WndProc(ref Message m) { if (this.Size.Equals(this.MaximumSize)) { if (m.Msg == 0xA1) //WM_NCLBUTTONDOWN return; } base.WndProc(ref m); if (m.Msg == 0x84) //WM_NCHITTEST { m.Result = (IntPtr)2; //HTCAPTION } }

本文 由 彭旭 創(chuàng)作,采用 知識(shí)共享 署名-相同方式共享 3.0 中國(guó)大陸 許可協(xié)議進(jìn)行許可。歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文連接。
浙公網(wǎng)安備 33010602011771號(hào)