❶ C#怎麼設置能讓窗體出現在屏幕的正中央
首先,創建一個點陣圖文件作為程序的窗體。點陣圖可以是任意形狀的,但是點陣圖文件區域一定要足夠大,這樣才能包含窗體上的所有控制項。然後,你可以通過設置一些屬性使該圖成為程序的窗體。
把程序中的標題欄去掉,否則整個界面將顯得很不協調。當然你去掉了標題欄也就去掉了它的最大化、最小化、關閉、移動窗體等功能。為了使程序仍然具有這些功能,我們需在程序中添加一些代碼,這樣用戶就仍然可以像以前一樣和程序進行交互。
因此,你需要完成如下工作:
1.創建一個作為窗體的點陣圖文件。
2.創建一個Windows應用程序,用上述點陣圖文件作為程序的窗體同時去掉其標題欄。
3.添加原標題欄具有的功能所需的代碼。
具體步驟
下面我就具體向大家介紹如何創建不規則窗體。
創建一個具有不規則形狀的點陣圖文件
1.用任何畫圖程序就可以創建不規則形狀的點陣圖,你可以使用最容易也是最方便的畫圖程序。
2.用一種顏色畫出一個不規則的區域作為程序的窗體,並用另一種顏色畫出該點陣圖的背景。(你要使該不規則區域足夠大。)
3.保存點陣圖文件。
下面就是一個例子:
在VS.net中創建一個新的工程
首先,設置窗體的背景從而建立窗體形狀。
1.在窗體設計器中選中窗體使之獲得焦點。
2.在屬性對話框中進行如下設置:
●
將FormBorderStyle屬性設置為None。該屬性去掉了程序的標題欄,同時也除去了標題欄的功能,不過我在後面還會向大家介紹如何添加代碼以恢復這些功能的。
●
將BackgroundImage屬性設置為你創建的點陣圖文件。你不必在工程中添加該文件,因為你一旦指定了該文件,它就會自動被添加到工程中。
●
將TransparencyKey屬性設置為點陣圖文件的背景顏色值(在本例中是藍色)。該屬性使得點陣圖的背景即上圖中的藍色部分不可見,從而窗體就呈現出一個不規則的橢圓形。
3.
保存工程。按Ctrl+F5可以運行此程序。(註:因為沒有標題欄,所以你可以通過Alt+F4來關閉程序)
將FormBorderStyle屬性設置為None後,程序的標題欄就被去掉了。這樣,為了獲得原來標題欄的功能,我們必須手動添加代碼。下面我就向大家介紹如何添加代碼實現關閉功能以及移動窗體的功能。
實現窗體的關閉及移動
1.往窗體上拖放一個按鈕控制項。
2.在屬性對話框中,將該控制項的Text屬性設置為「關閉」。
3.雙擊按鈕添加一個Click事件處理函數。
4.在代碼編輯器中添加如下代碼:
private
void
button1_Click(object
sender,
System.EventArgs
e)
{
this.Close();
}
5.
接下來就是實現窗體的移動功能。添加以下代碼來創建一個Point對象,該對象(作為一個變數)決定在什麼情況下移動窗體。
private
Point
mouse_offset;
6.
創建窗體的MouseDown事件的事件處理函數。為該事件添加代碼後,用戶就可以在任何位置移動窗體了。代碼如下:
private
void
Form1_MouseDown(object
sender,
System.Windows.Forms.MouseEventArgs
e)
{
mouse_offset
=
new
Point(-e.X,
-e.Y);
}
7.
創建窗體的MouseMove事件的事件處理函數。當滑鼠左鍵被按下,同時滑鼠被移動時,窗體的Location屬性就被設置為新的位置了,這樣窗體就被用戶拖動了。
private
void
Form1_MouseMove(object
sender,
System.Windows.Forms.MouseEventArgs
e)
{
if
(e.Button
==
MouseButtons.Left)
{
Point
mousePos
=
Control.MousePosition;
mousePos.Offset(mouse_offset.X,
mouse_offset.Y);
Location
=
mousePos;
}
}
8.
保存工程。按Ctrl+F5可以運行該程序。現在程序的界面還是和以前的一樣,不過你可以用滑鼠移動窗體並通過按按鈕來關閉窗體了。
現在,我們已經創建了一個不規則的窗體,並實現了一些基本的移動窗體、關閉窗體的功能。然而,窗體上的按鈕控制項還是老一套,那麼方方正正,使得整個界面不美觀。接下來我就向大家介紹如何創建自定義形狀的控制項。
前面我們創建不規則窗體的時候用到了TransparencyKey屬性,但是控制項是沒有該屬性的,所以我們得找其他的方法來實現控制項的不規則形狀了。在窗體上畫一個自定義形狀的控制項時,你需要精確的告知窗體在什麼位置以及如何畫該控制項。在.Net
Framework中有相應的類和方法來幫你實現這些,所以你不必擔心具體實現。
.Net
Framework中的類提供給控制項一個指示說明,該指示說明能確定控制項被畫的形狀。通過不同的指示說明,你就可以按你想要的方法來畫控制項了。該指示說明利用了GraphicsPath這個類,這個類代表了一系列用來畫圖的直線和曲線。首先,你得指定一個GraphicsPath類的對象並告知它你要畫什麼圖形。然後,你將控制項的Region屬性設置為上述GraphicsPath類的對象。這樣,你就可以創建任何自定義形狀的控制項了。
步驟如下:
●創建一個GraphicsPath類的實例對象。
●指定好該對象的各項細節(如大小、形狀等等)。
●將控制項的Region屬性設置為上面建立的GraphicsPath類的實例對象。
創建一個像文本的按鈕控制項:
1.拖放一個按鈕控制項到窗體上。
2.在屬性對話框中進行如下設置:
●將Name屬性設置為CustomButton。
●將BackColor屬性設置為一個和窗體背景顏色不同的顏色值。
●將其Text屬性設置為空字元串。
3.添加窗體的Paint事件的事件處理函數。
4.添加以下代碼,用GraphicsPath類的實例對象來畫控制項。下面的代碼以一串字元串的形式畫該按鈕控制項,同時,程序還設置了字元串的字體、大小、風格等屬性。字元串被賦給GraphicsPath類的實例對象。然後,該實例對象就被設置為按鈕控制項的Region屬性。這樣一個自定義形狀的控制項就完成了。
private
void
CustomButton_Paint(object
sender,
System.Windows.Forms.PaintEventArgs
e)
{
//初始化一個GraphicsPath類的對象
❷ 不規則窗體是怎樣創建的
創建不規則窗體經驗總匯- -
很多人都很熱衷於創建形狀奇怪的窗體。而且不斷的有熱心的傢伙們將他們的發現放到我們這里與大家分享。今天我將我所知道的方法總結一下。希望對大家有所幫助。
一般來說,要創建一個不規則的窗體。我們需要使用一個Win32 API: SetwindowRgn。這個API您可以在Api瀏覽器中找到。這個Api的作用就是將窗體的「剪」成一個指定的形狀。下面是這個Api聲明於解釋:
Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long,ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
它有三個參數。
第一個(hWnd)是用來指定被剪切的對象的句柄,比如Picture圖形框等, 我們一般就是用窗體的hWnd屬性;
第二個(hRgb)指明剪切的形狀, 即指定的幾何圖形特徵, 此參數也必須由相應的API 函數提供說明。用那些APi可以創建一個您想要的區域(窗體的形狀)。然後這些Api會返回一個數值。這個數值就是這個形狀在Windows中的句柄(可以理解為身份證號碼)。SetWindowsRgn可以通過這個數值來找到我們創建的那個區域;
第三個(bRedraw)是一個布爾變數, 一般可設置為真(True)。
看來僅僅有SetWindowsRgn還不行。我們還必須創建一個區域。創建區域可以使用如下的一些Api:
CreateRectRgn : 建立矩形區域,其參數分別為矩形的左上角坐標及右下角坐標。但是由於窗體默認就是一個矩形,所我們應該用不到它;
CreateRoundRectRgn:建立圓角矩形區域,其參數分別為左上角及右下角坐標, 還有圓角直徑等, 當圓角直徑接近或超過矩形的長度時, 將呈現為圓或橢圓形;
CreateEllipticRgn :建立橢圓矩形區域,參數分別橢圓的約束矩形左上角與左下角頂點的坐標;;
所以現在我們就可以創建一下形狀比較簡單的窗體了。比如下面的代碼我們就創建了一個橢圓形的窗體:
Option Explicit
'Win32 Api 的聲名
Private Declare Function CreateEllipticRgn Lib "gdi32" Alias "CreateEllipticRgn" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long,ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Private Sub Form_Load()
Dim Result As Long '聲明變數用於保存「區域」的句柄
Me.Show
Result = CreateEllipticRgn(0, 0, 300, 200) '創建「區域」並將其句柄保存到變數中
SetWindowRgn Me.Hwnd, Result, True '根據前面創建的區域對窗體進行「剪裁」
End Sub
但是你要說,我想創建的窗體是一個人的形狀或者是其他的不規則的形狀呀!是的,上面的方法只能創建一些簡單的幾何圖形。創建比較復雜形狀的窗體我們仍然需要使用SetWindowRgb這個Api來對窗體進行「剪裁」。但是我們需要用其它的Api來創建復雜的「區域」。一般的,我們會用到下面的Api。這些Api配合使用就會得到復雜形狀的區域。從而我們可以使用SetWindowRgb裁出窗體。
CreatePolygonRgn : 用於通過連接各個點來創建一個區域
CombineRgn: 用於對兩個區域進行運算。比如合並兩個區域或這是將兩個區域相減、求交集等等。
下面我們來詳細的介紹一下這兩個Api:
CreatePolygonRgb
Declare Function CreatePolygonRgn Lib "gdi32" Alias "CreatePolygonRgn" (lpPoint As POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
參數一(lpPoint): POINTAPI類型的變數。POINTAPI是一個用於描述點坐標的結構。他有兩個成員x與y。您可以在Api瀏覽器中找到它。在這里我們需要一個數組,並將這個屬組的第一個元素作為這里的參數。
參數二(nCount): 區域頂點的個數。比如一個三角形的區域有三個頂點。我們應該根據這個參數來確定上一個參數使用的數組的大小;
參數三(nPolyFillMode): 指定區域的填充模式。我們可以使用兩個常量作為參數:ALTERNATE和WINDING。這兩個常量可以在Api瀏覽器中找到。我們在這里可以直接使用1.
CombineRgb
Declare Function CombineRgn Lib "gdi32" Alias "CombineRgn" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long
參數一(hDestRgn): 目標區域的句柄;
參數二(hSrcRgn1): 源區域一的句柄;
參數三(hScrRgn2): 源區域二的句柄。
參數四(nCombineMode): 合並模式。我們可以在Api瀏覽器中到這些常量作為它的參數:
RGN_AND
Creates the intersection of the two combined regions.
RGN_COPY
Creates a of the region identified by hrgnSrc1.
RGN_DIFF
Combines the parts of hrgnSrc1 that are not part of hrgnSrc2.
RGN_OR
Creates the union of two combined regions.
RGN_XOR
Creates the union of two combined regions except for any overlapping areas.
好了,下面我們來創建一個沙漏形的區域。
Option Explicit
'Win32 API的聲明
Private Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint As POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Private Type POINTAPI
x As Long
y As Long
End Type
Private Sub Form_Load()
'聲明變數
Dim Result As Long
Dim Points(5) As POINTAPI
'更改窗體大小
With Me
.Width = 5000
.Height = 10000
End With
'將區域的頂點坐標存入變數
Points(0).x = 0
Points(0).y = 0
Points(1).x = 300
Points(1).y = 0
Points(2).x = 175
Points(2).y = 300
Points(3).x = 300
Points(3).y = 600
Points(4).x = 0
Points(4).y = 600
Points(5).x = 125
Points(5).y = 300
'創建區域
Result = CreatePolygonRgn(Points(0), 6, 1)
'「裁剪」窗體
SetWindowRgn Me.hwnd, Result, True
End Sub
另外,我們還應該注意一個Win32 Api:DeleteObject。 我們用Api創建了一個區域。雖然不可見,但是它卻是一個對象。如果我們不將其刪除,它就會存在於系統中消耗系統資源,所以我們不用的時候就應該將它刪除掉。這個Api只有一個參數就是指定要刪除對象的句柄。
❸ C#不規則窗體
一:使用點陣圖文件作為窗口背景
1.先使用繪圖軟體創建不規則窗體的點陣圖,最好設置單一背景顏色,記好背景顏色。
2.將所選窗體 FormBorderStyle 屬性設置為 None。
3.將BackgroundImage 屬性設置為先前創建的點陣圖文件。
4.將 TransparencyKey 屬性設置為點陣圖文件的背景色。
5.電腦監視器的顏色深度設置應小於 24 位,否則無論 TransparencyKey 屬性是如何設置的,窗體的非透明部分都會產生顯示問題。
6.由於隱藏了標題欄,需要自己編寫移動和關閉窗體的代碼。
二:也可自己創建形狀背景(如橢圓)此時需重寫Onpaint方法
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
System.Drawing.Drawing2D.GraphicsPath shape = new System.Drawing.Drawing2D.GraphicsPath();
shape.AddEllipse(0, 0, this.Width, this.Height);
this.Region = new System.Drawing.Region(shape);
}
❹ TM2008的皮膚功能用戶可以很好的選擇..它的原理是
產生不同的不規則窗體,和改變窗體的透明度,qq的不規則窗體比較復雜,用很多小圖片拼出來的
❺ unity3d 不規則窗體
unity3d本身是無法實現這種功能的,你可以將unity3d製作的內容嵌入winform窗體來間接實現,然後將窗體做成不規則窗體,有關實現不規則窗體的技術方法可以在查到很多,有關將unity3d嵌入到窗體中可以參考我的另一個回答http://..com/question/1817740996379148828,嵌入到wpf也可以類似實現。
❻ 用SetWindowRgn構建的不規則窗體,有沒有辦法恢復為正常矩形窗體
HRGN m_hOldRgn; (pos->second)->GetWindowRgn(m_hOldRgn); (pos->second)->SetWindowRgn(m_hRgnRight, TRUE); (pos->second)->SetWindowRgn(m_hOldRgn, TRUE); //恢復
❼ VB編程:怎樣可以把窗體設計成不規則的形狀
剪裁窗體:用CreateRectRgn、CreateEllipticRgn、CreatePolygonRgn等API函數創建矩形、圓形、多邊形區域,然後用CombineRgn合並多個區域,最後用SetWindowRgn把合並後的區域作為剪裁區作用到窗體上即可。這是正統的方法,不過過程稍微有點復雜,而且要創建復雜的不規則的窗體就比較吃力了。