WinForm中拖拽窗體實現移動功能

2022-03-11 18:17:32 字數 1822 閱讀 5825

在windowsform 應用程式中,有時我們會將窗體的formborderstyle屬性設定為none,這時,用滑鼠拖拽窗體時就無法實現移動的功能了!你是否也遇到過這種情況?

不要著急,下面就是解決方案.

在formbordestyle屬性設定為none的窗體的後台**中新增以下**:

[dllimport("

user32.dll

")]public

static

extern

bool releasecapture();

[dllimport("

user32.dll

")]public

static

extern

bool sendmessage(intptr hwnd, int wmsg, int wparam, int iparam);

public

const

int wm_syscommand = 0x0112;

public

const

int sc_move = 0xf010;

public

const

int htcaption = 0x0002;

該處為補充內容(用於解釋上述**中用到的api函式及要用到的引數常量):

(1)上述**中用到了兩個常用的api函式sendmessage和releasecapture,介紹一下這兩個函式。

releasecapture函式的作用是為當前的應用程式釋放滑鼠的捕獲

sendmessage函式的作用是呼叫乙個視窗的視窗函式,將一條訊息命令發給那個視窗。需要注意的是,這裡所說的視窗不是.net中的窗體(form),而是相當於.net中的控制項。當然,system.windows.forms.form也是乙個control.

sendmessage函式的宣告及引數作用

sendmessage(intptr hwnd, int wmsg, int wparam, int lparam);

hwnd,要接收訊息的那個視窗的控制代碼

wmsg,訊息的識別符號

wparam,具體取決於傳送的訊息

lparam,具體取決於傳送的訊息

(2)引數常量

wm_syscommand常量代表要向視窗傳送訊息,sc_move常代表要向視窗傳送移動的訊息,

htcaption 指的是 標題欄

##以下程式主要是將滑鼠點選標題欄的訊息傳送給視窗,來實現移動視窗的功能##

當然你需要引入 dllimport  相對應的命名空間 :

using system.runtime.interopservices;
這還不算完,前提有了,然後我們就需要呼叫了;既然是拖拽,那麼我們就在窗體的 mousedown 事件中呼叫相應的函式,**如下:

view code

private

void form1_mousedown(object sender, mouseeventargs e)

好了,這樣就可以實現我們想要的功能了!

這時,有的人就會問了,如果我設定了窗體的formbordestyle屬性設定為none,但是在這個窗體的最上邊有乙個panel擋住了。我怎麼點選是移動呢?

這好辦,在panel 的 mousedown 事件中呼叫如上所示的函式**,**如下:

view code

private

void panel1_mousedown(object sender, mouseeventargs e)

這樣就可以實現了!其它控制項上如果也希望實現這種功能,與上面同理!在此不多講!

Winform程式拖拽檔案到窗體

1 首先需要將接收拖拽的窗體屬性allowdrop設定為true。2 編寫窗體拖拽進入 dragenter 和拖拽完成 dragdrop 事件。private void frmcode dragenter object sender,drageventargs e else private void...

winform中實現不重複建立窗體

晚上有問了個問題,通過button的click事件,例項化乙個窗體,並show 當我多次點選button時,會產生多個窗體。請問怎麼解決這個問題?不想通過設定button的enable false來解決這個問題。其實這也算是乙個比較實際的問題,有回答說可以使用模式窗體,呵呵,稍微想了下確實是可以解決...

WinForm實現簡單的拖拽功能 C

用到了listbox和treeview兩個控制項,listbox作為資料來源,通過拖拽其中的資料放置到treeview上,自動新增乙個樹節點 listbox控制項的mousedown用於獲取要拖拽的值並呼叫dodragdrop方法 private void listbox1 mousedown ob...