C# WinForm 改變無邊框窗體尺寸
阿新 • • 發佈:2019-01-23
c# 透明winform上建立了自定義邊框後,需要拖動自定義邊框達到改變窗體尺寸的效果。使用了很多方法發現有些程式碼只能橫向拉伸,有些程式碼會造成無法拖動。
最後才找到這個切實可行的辦法。
const int Guying_HTLEFT = 10; const int Guying_HTRIGHT = 11; const int Guying_HTTOP = 12; const int Guying_HTTOPLEFT = 13; const int Guying_HTTOPRIGHT = 14; const int Guying_HTBOTTOM = 15; const int Guying_HTBOTTOMLEFT = 0x10; const int Guying_HTBOTTOMRIGHT = 17; protected override void WndProc(ref Message m) { switch (m.Msg) { case 0x0084: base.WndProc(ref m); Point vPoint = new Point((int)m.LParam & 0xFFFF, (int)m.LParam >> 16 & 0xFFFF); vPoint = PointToClient(vPoint); if (vPoint.X <= 5) if (vPoint.Y <= 5) m.Result = (IntPtr)Guying_HTTOPLEFT; else if (vPoint.Y >= ClientSize.Height - 5) m.Result = (IntPtr)Guying_HTBOTTOMLEFT; else m.Result = (IntPtr)Guying_HTLEFT; else if (vPoint.X >= ClientSize.Width - 5) if (vPoint.Y <= 5) m.Result = (IntPtr)Guying_HTTOPRIGHT; else if (vPoint.Y >= ClientSize.Height - 5) m.Result = (IntPtr)Guying_HTBOTTOMRIGHT; else m.Result = (IntPtr)Guying_HTRIGHT; else if (vPoint.Y <= 5) m.Result = (IntPtr)Guying_HTTOP; else if (vPoint.Y >= ClientSize.Height - 5) m.Result = (IntPtr)Guying_HTBOTTOM; break; case 0x0201: //滑鼠左鍵按下的訊息 m.Msg = 0x00A1; //更改訊息為非客戶區按下滑鼠 m.LParam = IntPtr.Zero; //預設值 m.WParam = new IntPtr(2);//滑鼠放在標題欄內 base.WndProc(ref m); break; default: base.WndProc(ref m); break; } }
注意點:窗體內所有物件必須將邊框保留出來,不然就無法拖動,比如將statusBar設定Duck為bottom,此時元素與底部沒有空隙即看不到form的邊框。
如圖所以就無法拖動。如果要可以拖動就必須使元素與窗體邊緣保持一定距離如下,就可以。