在windowsform 應用程式中,有時我們會將窗體的formborderstyle屬性設定為none,這時,用滑鼠拖拽窗體時就無法實現移動的功能了!你是否也遇到過這種情況?
不要著急,下面就是解決方案.
在formbordestyle屬性設定為none的窗體的後台**中新增以下**:
[dllimport("該處為補充內容(用於解釋上述**中用到的api函式及要用到的引數常量):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;
(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...