用C 實現不規則窗體

2021-08-24 23:55:22 字數 2972 閱讀 2580

如何實現不規則窗體?

transparencykey:獲取或設定將表示窗體透明區域的顏色。

formborderstyle:獲取或設定窗體的邊框樣式。

backgroundimage:獲取或設定在控制項中顯示的背景影象。

首先,使用影象處理軟體製作出所要實現的窗體樣式,最後實現的窗體樣式就和繪製的一樣。然後,將窗體的backgroundimage屬性設定為所繪製的。根據的大小設定窗體的大小,即窗體的寬度等於的寬度,窗體的高度等於的高度。之所以這樣做,是為了避免背景在窗體上的重複顯示。

接著,將窗體的formborderstyle設定為none,也即不要顯示窗體的邊框。這樣便只顯示帶有背景的窗體內容區,此時看起來整個窗體就和所指定的背景一致。但是此時實現的窗體樣式仍然是規規矩矩的四邊形。只要將中的背景顏色修改為透明色,那麼整個窗體的樣式就和中的繪圖區域保持一致了。要實現這點可以將窗體的transparencykey設定為的背景顏色,這樣以來,當窗體執行時,窗體的背景中包含此顏色的區域都將被透明化。(應該是這樣的,可是實現的**中貌似不是這樣的,那個背景色還是存在的。)

還有一點,由於將窗體的formborderstyle設定為none,窗體便沒有了標題欄,因此預設情況下窗體不可移動。下面將自己實現窗體的移動效果。

如何實現窗體的移動?

location:設定或獲取窗體在螢幕中的位置。

通過修改location的屬性值達到修改窗體在螢幕中位置的目的。通常是通過單擊滑鼠左鍵並移動滑鼠來移動窗體的。也就是說,滑鼠在窗體上移動的情況至少有2種,其一是不單擊滑鼠左鍵的移動,此時**不需要隨著滑鼠的移動來移動窗體;其二是單擊滑鼠左鍵的同時移動滑鼠,此時就需要跟隨滑鼠來移動窗體了。要實現的要過和通過窗體標題欄移動是一樣的,只是我們要讓它在窗體的任意區域都能夠移動。

可以通過control.mouseposition屬性獲取滑鼠單擊左鍵時的座標,此座標屬於螢幕座標系統。同樣的,窗體的location也是螢幕座標系統,這和窗體上的控制項的location是不一樣的,控制項的location是窗體範圍內的座標系統,即,座標x值和座標y值是相對於窗體左上角x=0,y=0的位置而確定的。而control.mouseposition和窗體的location則是相對於螢幕左上角的位置而言的。

知道了滑鼠左鍵單擊時所處的螢幕座標點,也知道窗體左上角在滑鼠左鍵單擊時的螢幕座標點,通過這2個座標點就可以計算出窗體左上角相對於滑鼠單擊時的螢幕座標點的偏移量。然後,隨著滑鼠的不斷移動,**隨時獲取滑鼠移動後所處的螢幕座標點,將這個新的座標點和前面計算出的偏移量再次進行計算,就可以獲取螢幕隨著滑鼠移動後應處的位置,再把這個值賦給窗體的location屬性,窗體不就隨著滑鼠而移動了嗎!!!^_^

**如下:

首先定義兩個似有變數,乙個用來儲存滑鼠單擊點和窗體左上角的偏移量,乙個用來標記滑鼠左鍵是否正處於按下狀態。

/// /// 用來記錄滑鼠的偏移量。 /// point mouseoffset = new point(); /// /// 用來標記滑鼠左鍵是否已經按下,如果按下則為true;否則為false。 /// bool ismouseleftbuttondown = false;

當滑鼠在窗體上單擊左鍵時,獲取滑鼠此時的螢幕座標值,並與窗體的location進行計算,得出偏移量。

private void mainform_mousedown(object sender, mouseeventargs e) }

接著就該開始移動滑鼠了,在移動滑鼠時確定按下滑鼠左鍵,然後獲取滑鼠移動後的座標值,與前面計算的偏移量進行計算,得出窗體左上角的螢幕座標值,並將其賦給窗體的location。

private void mainform_mousemove(object sender, mouseeventargs e) }

**中為什麼偏移量的x、y值都取負值呢?這是由窗體左上角位置和滑鼠單擊時位置的對應關係確定的。既然是在窗體上單擊滑鼠,那麼其單擊點的x和y值就必定要比窗體左上角的x和y值大,取負值實際上等於是減去偏移量的值。

當滑鼠左鍵鬆開時,就該停止移動窗體了。

private void mainform_mouseup(object sender, mouseeventargs e)

把ismouseleftbuttondown設定為false之後,滑鼠的mousemove事件還是會繼續觸發的,只是將不會在執行移動窗體的那段**,因為if條件已經不成立了。

搜尋了一下前面的那個點陣圖的背景色不能被去掉的問題,有說法是這樣的:在24位色以下的環境中可以顯示正常,但在24位色以上時黃色背景不能消失。為了確認這種說法的正確性,我將【螢幕的顏色質量】設定16位,還真就給正確顯示了。不過16位的顏色質量確實是不及32位的。總不能為了執行這個不規則的窗體程式,每次都來修改螢幕顏色質量吧?那也太過分了一點!當然可以自己編寫**來解決這個問題,但此文到此為止。^_^

完整**如下:

using system; using system.collections.generic; using system.componentmodel; using system.data; using system.drawing; using system.linq; using system.text; using system.windows.forms; namespace irregularwindows private void mainform_load(object sender, eventargs e) /// /// 關閉應用程式。 /// /// /// private void exitbutton_click(object sender, eventargs e) private void mainform_mousedown(object sender, mouseeventargs e) } private void mainform_mousemove(object sender, mouseeventargs e) } private void mainform_mouseup(object sender, mouseeventargs e) } }

QT實現不規則窗體

看到網上有很多不規則窗體的實現,效果很酷.於是使用qt也實現了乙個,qt的不規則窗體實現非常簡單,只需要設定乙個mask 遮掩 這個的格式可以使用png或bmp格式,我使用了png格式,預設窗體是矩形的,使用png影象,將需要隔離在窗體之外的區域的畫素設定為白色或透明色,其他顏色的區域對應顯示出來的...

GDI 實現不規則窗體

先來看一下實現的效果,下圖中那個娃娃就是我們要實現的不規則窗體啦 使用gdi 還需要進行初始化 在應用初始化時,啟動gdi 在程式退出時,關閉gdi png是實現不規則窗體的關鍵,因為它本身就是帶透明效果的,把這種格式的作為窗體本身就是不規則的。首先我們需要載入這張,在這裡我沒有將其作為資源新增到專...

C 建立不規則窗體

要求 1 使得窗體或按鈕的形狀跟一致。效果圖 參考文件 修改或新增部分,已經用 此處為新增部分 標註,缺少則不能達到效果 using system using system.collections.generic using system.componentmodel using system.da...