1. 程式人生 > >C# WinForm 改變無邊框窗體尺寸

C# WinForm 改變無邊框窗體尺寸

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的邊框。


如圖所以就無法拖動。如果要可以拖動就必須使元素與窗體邊緣保持一定距離如下,就可以。