winform 關於無邊框和拖動窗體邊緣改變尺寸的 踩坑筆記

在做美化winform窗體,實現自定義窗體標題欄,圓角邊框,並且支持拖拽窗體,最後還要能拖動窗體左、右、下邊緣時,改變窗體的寬和高。
一般網上的都有代碼,窗體設成無邊框,自己加個panel就能實現自定義窗口標題。
圓角邊框,繪製窗體Region,網上也有很多代碼。
拖拽窗體,採用p/vinvoke操作,直接調win32api,簡單又高效。
拖動改變尺寸,也時 pv 操作。簡單又不閃屏,前提是不畫圓角窗體。
但是要支持前面的圓角,又能鼠標拖動邊緣改變尺寸,就有坑了。
採用了Region圓角方法,就無法拖動改變窗體的尺寸,解決辦法,OnsizeChange裏首先把Region置爲null。
我是把畫圓角的方法放在SizeChange裏的,每次改變窗體大小,就調用。
或者拖動時不調用,等初始化和 最大化最小化,還有拖動尺寸結束了在繪製圓角,也就拖動時不是圓角,這是個方法,
但是採用win32api方式,發送SysComand消息,我不知道什麼時候這個拖動尺寸的消息是結束了,不要以爲加個鼠標按下或擡起或移動的事件去判斷就可以了,不得行,因爲拖動尺寸這個是SysComand消息的,即使裏在這時候擡起鼠標按鍵,也是屬於SysComand消息,根本不會觸發常規的鼠標按鍵,移動等事件。
不採用win32api,而是寫鼠標移動按下擡起那套代碼來實現改變尺寸,然後OnsizeChange裏首先把Region置爲null,拖動完畢再加上圓角,這種方案,我試了,我沒有成功,因爲就算是不加圓角,就光拖動,這種方式就閃爍的厲害,加了雙緩衝也一樣吧。網上知乎有篇文章帶代碼帶動圖一搜就搜到了,可以看看。https://zhuanlan.zhihu.com/p/505185678
我採用這種方法,窗體上的圖片拖動時會閃爍,控件這些不得閃爍。看效果:

 

 
但是並沒又就解決了,改變大小時閃爍,即使加上雙緩衝,也是閃爍。
至今我解決不了這個問題。
拖動窗體尺寸改變時,採用win32api的方式,最好要在窗體屬性中找到有個MinSize什麼的屬性,能讓窗體拖動最小時維持在這個最小尺寸的樣子,否則,窗體會被拖動剩1px寬的像素不到。
 
還有種方法,重繪非客戶區,雖然能改改非客戶去的顏色,但是我不知道怎麼改變非客戶區的高度,能支持圓角,也支持改變尺寸,並且不用寫任何代碼,但是就是標題欄自定義程度太低,就能改改最大化、最小化、放大縮小的按鈕 顏色,標題文字。窗體還是很醜,一般自定義非客戶區不會這樣做吧,個人覺得。做法,就是重寫DefaultProc 方法,攔截非客戶區繪製消息,然後重繪。
 
因爲是個人練習,所以沒有繼續尋找解決辦法了,採用第一種方法,圓角和拖動改變窗體尺寸這兩個功能是相互排斥的,去掉其中任何一個功能,程序就會運行的很好。
最終,我沒有找到一個好的兼容辦法,有感興趣的不妨自己挑戰以下,代碼網上都能搜到,我放代碼怕誤導思路了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章