當用戶按下左鍵時,為按下對象的MouseMove事件綁定處理方法,并記錄鼠標坐標(窗體左上角為原點,在事件的MouseEventArgs類型的e參數(shù)中提供)。此時用戶移動鼠標,保持窗體原點與鼠標新坐標的相對位置不變。當用戶釋放左鍵時,撤銷按下對象的MouseMove事件處理方法
我們注重客戶提出的每個要求,我們充分考慮每一個細節(jié),我們積極的做好成都網(wǎng)站制作、做網(wǎng)站服務(wù),我們努力開拓更好的視野,通過不懈的努力,創(chuàng)新互聯(lián)公司贏得了業(yè)內(nèi)的良好聲譽,這一切,也不斷的激勵著我們更好的服務(wù)客戶。 主要業(yè)務(wù):網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)站設(shè)計,成都小程序開發(fā),網(wǎng)站開發(fā),技術(shù)開發(fā)實力,DIV+CSS,PHP及ASP,ASP.Net,SQL數(shù)據(jù)庫的技術(shù)開發(fā)工程師。
設(shè)置窗體的text為空,設(shè)置窗體的controlbox屬性為false,設(shè)置窗體的FormBorderStyle 屬性為Sizable,就可以改變窗體大小了,并且可以在任務(wù)欄點擊。
調(diào)用系統(tǒng)API使窗體下?lián)碛嘘幱靶Ч?/p>
using System.Runtime.InteropServices;
然后再窗口類的隨便哪個地方加上:
const int CS_DROPSHADOW = 0x20000;
const int GCL_STYLE = (-26);
//聲明Win32 API
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int SetClassLong(IntPtr hwnd,int nIndex,int dwNewLong);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int GetClassLong(IntPtr hwnd, int nIndex);
最后在窗體的構(gòu)造函數(shù)中加上:
SetClassLong(this.Handle, GCL_STYLE, GetClassLong(this.Handle, GCL_STYLE) | CS_DROPSHADOW);
設(shè)置全局變量:
Dim?drag?As?Boolean
Dim?mousex?As?Integer
Dim?mousey?As?Integer
假設(shè)你想拖動的是Panel1控件,以及此控件上的?Label1(用于顯示標題)和PictureBox4(用于顯示圖標):
Private?Sub?TitleMove_MouseDown(sender?As?Object,?e?As?System.Windows.Forms.MouseEventArgs)?Handles?Panel1.MouseDown,?Label1.MouseDown,?PictureBox4.MouseDown
drag?=?True
mousex?=?Windows.Forms.Cursor.Position.X?-?Me.Left
mousey?=?Windows.Forms.Cursor.Position.Y?-?Me.Top
End?Sub
Private?Sub?TitleMove_MouseMove(sender?As?Object,?e?As?System.Windows.Forms.MouseEventArgs)?Handles?Panel1.MouseMove,?Label1.MouseMove,?PictureBox4.MouseMove
If?drag?Then
Me.Top?=?Windows.Forms.Cursor.Position.Y?-?mousey
Me.Left?=?Windows.Forms.Cursor.Position.X?-?mousex
End?If
End?Sub
Private?Sub?TitleMove_MouseUp(sender?As?Object,?e?As?System.Windows.Forms.MouseEventArgs)?Handles?Panel1.MouseUp,?Label1.MouseUp,?PictureBox4.MouseUp
drag?=?False
End?Sub
? private const int GWL_STYLE = (-16);
? private const int GWL_EXSTYLE = (-20);
? private const uint WS_EX_LAYERED = 0x80000;
? private const uint WS_EX_TRANSPARENT = 0x20;
? private const uint WS_THICKFRAME = 262144;
? private const uint WS_BORDER = 8388608;
/// summary使指定 「 see cref="IntPtr"/ 句柄」 窗體 邊框樣式變?yōu)闊o邊框。/summary
? public static uint 無邊框窗體(IntPtr 句柄) {
? ? ? uint style = API_窗口.GetWindowLong(句柄, GWL_STYLE);
? ? ? style = ~WS_BORDER;
? ? ? style = ~WS_THICKFRAME;
? ? ? return API_窗口.SetWindowLong(句柄, GWL_STYLE, style); ;
? }
API窗口靜態(tài)類
? [DllImport("user32", EntryPoint = "SetWindowLong")]
? public static extern uint SetWindowLong(IntPtr hwnd, int nIndex, uint dwNewLong);
? [DllImport("user32", EntryPoint = "GetWindowLong")]
? public static extern uint GetWindowLong(IntPtr hwnd, int nIndex);
修改窗口位置
/// summary
? /// 設(shè)置窗體的位置和大小。
? /// /summary
? /// param name="hWnd"/param
? /// param name="hWndInsertAfter"用于標識在z-順序的此 CWnd 對象之前的 CWnd 對象。
? /// para/para如果uFlags參數(shù)中設(shè)置了SWP_NOZORDER標記則本參數(shù)將被忽略。可為下列值之一:
? /// para/paraHWND_BOTTOM:值為1,將窗體置于Z序的底部。如果參數(shù)hWnd標識了一個頂層窗體,則窗體失去頂級位置,并且被置在其他窗體的底部。
? /// para/paraHWND_NOTOPMOST:值為-2,將窗體置于所有非頂層窗體之上(即在所有頂層窗體之后)。如果窗體已經(jīng)是非頂層窗體則該標志不起作用。
? /// para/paraHWND_TOP:值為0,將窗體置于Z序的頂部。
? /// para/paraHWND_TOPMOST:值為-1,將窗體置于所有非頂層窗體之上。即使窗體未被激活窗體也將保持頂級位置。/param
? /// param name="x"窗體新的x坐標。如hwnd是一個子窗體,則x用父窗體的客戶區(qū)坐標表示/param
? /// param name="y"窗體新的y坐標。如hwnd是一個子窗體,則y用父窗體的客戶區(qū)坐標表示/param
/// param name="Width"指定新的窗體寬度/param
/// param name="Height"指定新的窗體高度/param
? /// param name="wFlags"/param
? /// returns/returns
? [DllImport("user32.dll", CharSet = CharSet.Ansi, EntryPoint = "SetWindowPos")]
? public static extern int SetWindowPos(IntPtr hWnd, hWndInsertAfter hWndInsertAfter, int x, int y, int Width, int Height, wFlags wFlags);
? /// summary
? /// 調(diào)整指定 「 see cref="IntPtr"/ 句柄」 窗體的位置和尺寸。
? /// /summary
? /// param name="句柄"指定 「 see cref="IntPtr"/ 句柄」 窗體/param
? /// param name="x"橫坐標/param
? /// param name="y"縱坐標/param
? /// param name="w"寬/param
? /// param name="h"高/param
? public static int 調(diào)整窗體(IntPtr 句柄, int x, int y, int w, int h) {
? ? ? return API_窗口.SetWindowPos(句柄, 0, x, y, w, h, wFlags.SWP_NOZORDER);
? }
? /// summary
? /// 調(diào)整指定 「 see cref="IntPtr"/ 句柄」 窗體的位置。
? /// /summary
? /// param name="句柄"指定 「 see cref="IntPtr"/ 句柄」 窗體/param
? /// param name="x"橫坐標/param
? /// param name="y"縱坐標/param
? public static int 調(diào)整窗體位置(IntPtr 句柄, int x, int y) {
? ? ? return API_窗口.SetWindowPos(句柄, 0, x, y, 0, 0, wFlags.SWP_NOSIZE | wFlags.SWP_NOZORDER);
? }