最近在寫專案的時候要對視窗進行重新布局,winform的視窗的最小化,最大化,關閉按鈕以及logo的區域要全部去掉,即FormBorderStyle=None,
但是這樣處理有個問題,就是視窗拖拽,視窗調整大小等winform自帶的功能都不能用了(當然,都已經通過WndProc訊息重新弄好了)
但是最重要的一個東西也丟了,就是當我們把視窗拉到最左最右或者最上邊,當滑鼠指標貼靠在螢屏邊緣時,自動貼靠邊緣的功能沒有了!
如圖所示:

網上找了很久也沒找到解決的辦法,有沒有大牛知道?
uj5u.com熱心網友回復:
我們不知道你的代碼實作方式但是我想你需要
private const int WM_NCLBUTTONDOWN = 0XA1;
private const int HTCAPTION = 2;
private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
ReleaseCapture();
SendMessage((int)this.Handle,WM_NCLBUTTONDOWN,HTCAPTION,0);
}
這代碼是模擬轉發一條模擬視窗title移動的訊息
ps:還是那句話,如果你的代碼是從博客園抄的,注意分辨時效性和有效性。那些人寫文章是不會考慮到底有坑還是沒坑的
uj5u.com熱心網友回復:
或者變通設計,移動時設定回Sizable,移動結束在設成noneuj5u.com熱心網友回復:
另一個問題是,winform的事件不會冒泡,所以UI上有其他控制元件,事件觸發不會在form里,需要自行處理uj5u.com熱心網友回復:
你沒明白我的意思,我的意思是視窗貼靠,貼靠后的效果是這樣的
uj5u.com熱心網友回復:
我明白你的意思。因為對齊功能依賴表單的一個視窗屬性Sizable。 所以先設定成Sizable,讓他變化后,得到表單大小設定表單大小,然后在修改回none
這個是默認依賴,對齊停靠--------------需要表單sylte為可變。設定成none,fixXXX都是不可變風格
uj5u.com熱心網友回復:
學過win32api sdk都知道表單實際樣式受WNDCLASS 和WS_ 控制
https://blog.csdn.net/jadeshu/article/details/70477539?utm_medium=distribute.pc_relevant.none-task-blog-title-2&spm=1001.2101.3001.4242
從win10得基本表征可以判定,他應該沒有系統api支持,而是由擴展得shell,拿handler,判定handler得表單風格。當是WS_SIZEBOX這類設定時才會回應
我們測驗得結果是:fixedsingle,fixed3dDialog ,這類指定了“固定“得風格都不會產生對齊效果
uj5u.com熱心網友回復:
所以我的意思就是有沒有辦法讓視窗被滑鼠托到最邊緣的時候,產生和有handler一樣的效果,你像QQ它也是重繪視窗,你把QQ的聊天視窗拖到邊緣它也能做到自動停靠半個螢屏,而且這個停靠不是win10獨有,而是從win7開始甚至是win7之前的小版本就有了的
uj5u.com熱心網友回復:
我實驗了另外一個東西 “有道詞典”,很明顯他不是一個帶title得東西,他只是自繪的。但是他的邊框是變動大小的,所以他可以對齊停靠用spy+看一下style風格看看的表單風格設定,然后我們使用win32api 強制修改你的sytle風格就可以
uj5u.com熱心網友回復:
你不用強調qq,win7.我們只是告訴why,人家可以。
因為人家設定的是有邊框樣式。你自己都是說了qq聊天視窗,那么你看他能拉大不?他能拉大。
你設定none后,你的能拉大不?設定成FixedXXXX,能拉大不??不能
原因spy++告訴你了,人家用win32的主動設定的樣式為:
WS_THICKFRAME-----------------------------------創建一個具有厚邊框的視窗,可以通過厚邊框來改變視窗大小。
WS_EX_WINDOWEDGE-------------------------指定了具有凸起邊框的視窗
這個你也可以用win32api的
setWindowlong 方法自己設定
uj5u.com熱心網友回復:
在實驗一個360,很明顯360沒有邊框不可拉大你看360還能用你這個對齊功能么?結果是不能對齊了
uj5u.com熱心網友回復:
能不能給具體代碼,我理論知識不豐富
uj5u.com熱心網友回復:
第一步,找到win32api函式原型和引數設定值https://blog.csdn.net/jigetage/article/details/85207073
第二步 直接到pinvoke.org 搜索win32api 定義(windows標準win32api和常見庫的api這個站有收錄)
http://www.pinvoke.net/default.aspx/user32/SetWindowLong.html
uj5u.com熱心網友回復:
真能折騰啊,如果專案經理要求我這么搞,當場翻臉。uj5u.com熱心網友回復:
@wanghui0380算了,你說的我不是太懂,我只想來個直接貼代碼的
uj5u.com熱心網友回復:
這個問題解決掉也許很簡單,但是像我這種沒有深入學習過或者壓根日常寫代碼不接觸win32api的人來說,windos的句柄或者訊息啥的,對我來說都有點深,貼代碼給我的好處就是,下次我遇到同樣的問題,復制粘貼就行了,不需要再去理解它的意思uj5u.com熱心網友回復:
沒用,你自己都說了,花了好長滿世界都找不到。所以看我們怎么分析問題,學著自己怎么解決問題。
下次你在遇到問題,也許又是滿世界都找不到,那怎么辦
so,趁著你這問題,那就把那些東西看看唄
ps:很長時間我都不想看正則運算式,我認為那是反人類的語言。所以每次都網上搜。可是當我一個專案需要經常用,并且都沒啥現成答案,花2天時間看看正則,如今我已經快10年沒問過別人正則問題了
uj5u.com熱心網友回復:
參考WPF的DragMove方法的實作:
UnsafeNativeMethods.SendMessage( CriticalHandle, WindowMessage.WM_SYSCOMMAND, (IntPtr)NativeMethods.SC_MOUSEMOVE, IntPtr.Zero);
UnsafeNativeMethods.SendMessage( CriticalHandle, WindowMessage.WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/213168.html
標籤:C#
上一篇:c# 決議JSON 物體類
下一篇:c#如何寫插件
