16個WinForm之FAQ

來源:互聯網
上載者:User
1. 如何設定一個From的邊界
2. 如何建立一個透明的From
3. 如何設定表單在螢幕中的位置
4. 如何使最小化和最大化按鈕不可用
5. 如何使一個表單不見
6. 如何設定使表單成為非矩形的.
7. 如何使一個表單在螢幕的最頂端.
8. 如何顯示一個Model和非Model的表單
9. 如何製作一個MDI的表單
10. 如何將你的表單不顯示在任務條上.
11. 如何製作一個帶啟動螢幕的表單.
12. 如何使你的表單TrayIcon.
13. 如何修改控制表單的尺寸和長寬尺寸.
14. 如何建立一個Windows Explorer風格的表單.
15. 如何設定初始的啟動表單
16. 如何建立一個有背景映像的表單
==========================================================

1. 如何設定一個From的邊界

form總共有七種不同的邊界風格讓你設定,你可以在設計時刻也可以運行時通過代碼動態來設定它.這七種邊界風格分別是:
none (System.Windows.Forms.FormBorderStyle.None )
fixed 3D (System.Windows.Forms.FormBorderStyle.Fixed3D)
fixed Dialog (System.Windows.Forms.FormBorderStyle.FixedDialog)
fixed Single(System.Windows.Forms.FormBorderStyle.FixedSingle)
fixed Tool Window(System.Windows.Forms.FormBorderStyle.FixedToolWindow)
sizable(system.windows.forms.formborderstyle.sizable)
sizable Tool Window
(system.windows.forms.formborderstyle.sizabletoolwindow)
在設計方式下在vs.net IDE的 Properties window中設定FormBorderStyle屬性就可以了.
在運行方式下你可以用代碼來完成:
dlgbx1.formborderstyle = System.Windows.Forms.FormBorderStyle.FixedDialog
這七種邊界類型VB6中就有,沒有什麼大的變化,運行方式下你需要對照不同的枚舉變數進行設定.

2. 如何建立一個透明的From

你可以通過兩種方法在設計時刻和運行時刻來做到這一點.
設計時刻,你可以在vs.net IDE的 Properties window, 設定Opacity 屬性達到這個效果.這個值從0.0到1.0 . 0表示完全透明,1.0表示完全不透明.
運行時刻你可以用下面的編碼設定表單的opactiy屬性來做到.具體:
frmtransparentform.opacity = 0.76; ( C# )
看得出現在很簡單了,你已經不用再去瞭解什麼alpha變數了.透明始終只是一種效果,不要濫用它.

3. 如何設定表單在螢幕中的位置

你可以設定表單的startposition屬性,vs.net一般給你一個保守的選項” WindowsDefaultLocation“ 這樣系統在Load表單時將根據使用者當前的電腦設定來確定一個值,你也可以在設計時將它改成另一個值”Center”.
如果你一定要在設計方式下確定表單在螢幕出現的位置你可以先設定startposition為manual,然後設定location的x和y的值.
運行時用代碼實現似乎更簡潔一些:
Form1.Location = new Point (100, 100) ( VB.NET )
當然你也可以分別修改的Location的X和Y值,對應的是表單的Left和Top屬性,比如:
form1.left += 200 ( VB.NET )
form1.top -= 100 ( VB.NET )
另外一個屬性將也將影響表單在螢幕的位置:desktoplocation 這個屬性主要是在你設定表單的位置相對於工作列時非常實用(當你把任務條放在螢幕的頂或左邊時,其實相應改動了desktop coordinates (0,0)),你可以這樣設定這個不出現在設計屬性視窗中的屬性,
form1.desktoplocation = new Point (100,100)
表單在螢幕中的位置將主要取決於各自使用者具體的硬體和設定情況,所以保守的作法是用預設的” WindowsDefaultLocation”或 ”Center”;專業的作法是自己先擷取系統的設定然後編碼動態計算後進行設定,不然很容易在螢幕上找不到你的表單.

4. 如何使最小化和最大化按鈕不可用

在設定表單的form.minimizebox和form.maximizebox 當為True時表示顯示,False時表示不可.用編程方式見下:
frmmaxmin.minnimizebox = False ( VB.NET)
frmmaxmin.maxmnimizebox = True ( VB.NET )

5. 如何使一個表單不見

我想最直接的辦法是你調用 Hide()方法來做到這一點.不過我想提供另一種方法,看了之後你會獲得一些其它的啟發. ( VB.NET )
Private Const WS_EX_TOOLWINDOW As Int32 = &H80
Private Const WS_POPUP As Int32 = &H80000000
Private Const WS_VISIBLE As Int32 = &H10000000
Private Const WS_SYSMENU As Int32 = &H80000
Private Const WS_MAXIMIZEBOX As Int32 = &H10000
Protected Overrides ReadOnly Property CreateParams() As System.Windows.Forms.CreateParams

Get
Dim cp As System.Windows.Forms.CreateParams
cp = MyBase.CreateParams
cp.ExStyle = WS_EX_TOOLWINDOW
cp.Style = WS_POPUP Or WS_VISIBLE Or WS_SYSMENU Or WS_MAXIMIZEBOX
cp.Height = 0
cp.Width = 0
Return cp
End Get
End Property
原來是把Height 和Width都設定成0 ,我想這種方式和Hide()調用的底層可能是不同的。

6. 如何設定使表單成為非矩形的.

這個問題我想我提供的不是最專業的作法,至少它還不能達到我期望的那樣,也就是說它在某些事件中它還會變回矩形.但至少我可以告訴你:如果試圖調用原來的win32’s API SetWindowRng是不行的,我曾如此的嘗試過.現在你可能需要知道有關表單的Region屬性
' // ( VB.NET )
Public Sub SetWindowRegion()
Dim FormPath As System.Drawing.Drawing2D.GraphicsPath
Dim Reg As Drawing.Region
Dim lRet As Long
FormPath = New Drawing2D.GraphicsPath()
FormPath.AddEllipse(New Rectangle(0, 0, 250, 120))
Me.Region = New Region(FormPath)
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Me.Region = Nothing
SetWindowRegion()

End Sub

Protected Overrides Sub OnResize(ByVal e As System.EventArgs)
Me.Region = Nothing
SetWindowRegion()
End Sub

7. 如何使一個表單在螢幕的最頂端.

這是很實用的一個功能,現在你不用在調用其它api了,只用設定topmost 屬性為True就可以了.對於這個屬性在設計時刻和運行時刻都是可以進行修改的.代碼方式:
myTopForm.TopMost = True ( VB.NET)

8. 如何顯示一個Model和非Model的表單

model和modeless的表單主要將取決於你的應用,最多的是用在顯示對話方塊.當你需要model的表單時你調用myform. ShowDialog而非Model的調用MyForm.Show,對於ShowDialog有一個選擇性參數ower可以讓你為一個表單建立父子關係.比如:
' Visual Basic
Private Sub mnuAbout_Click(…args…)
Dim f As New FormOption
f.ShowDialog Me
End Sub
有一點需要注意的是對於ShowDialog來說,當執行到這一句,表單顯示,但這之後的代碼將不會執行,只到視窗關閉之後才繼續執行,而對於Show來說是即時的,顯示表單之後將立即執行下面的代碼.

9. 如何製作一個MDI的表單

1. 建立一個新的Windows Application項目
2. 分別加入兩個表單Form1 、Form2
3. 設定Form1的IsMdiContainer屬性為True。使它成為MDI主表單。
4. 在Form2中加入一個RichTextBox控制項,並設定Dock為:Fill
5. 在Tools 表單中拖一個MainMenu到表單Form1,然後建立一個菜單File|Windows|Help三個功能表項目,File中包括New、Exit功能表項目;Windows中包括Cascade、Horizontal等。
6. 設定Windows功能表項目的MdiList屬性=True, 這樣每一個MDI子視窗將自動加在Windows功能表項目下面。
7. 雙擊New功能表項目,然後加入以下代碼:
private void menuNew_Click(object sender, System.EventArgs e)
{

Form2 NewMdiChild ;
NewMdiChild = new Form2() ;
NewMdiChild.MdiParent = this ;
NewMdiChild.Show() ;
}
8. 在Windows的Cascade等功能表項目中加入以下代碼:
private void menuWindowCasca_Click(object sender, System.EventArgs e)
{
this.LayoutMdi( MdiLayout.Cascade) ;
}

另外還有以下常用的:
this.layoutmdi(mdilayout.tilehorizontal);
this.layoutmdi(mdilayout.tilevertical);
9. F5運行。
最終版的vs.net 不知是否會有一個通用的模板,不過用完全手工的方式產生一個MDI的視窗,顯得有些繁瑣,不如VS.NET的IDE方式下那麼簡潔。

10. 如何將你的表單不顯示在任務條上.

當表單的邊界風格是tools Window時它都不會出現在任務條上的.另外上面標題5中介紹的方法不僅表單看不見,也不會出現在任務條上.
如果你現在在Dotnet的世界,這件事也變的簡單,任何的Winform表單現在都有ShowInTaskbar屬性,所以你只要簡單的設定這個屬性就可以了。同樣你可以選擇在屬性視窗中將ShowInTaskbar由True改為False。或是用代碼的方式:
MyTaskBarFrm.ShowInTaskbar = false ; ( C# )

11. 如何製作一個帶啟動螢幕的表單.

需要你準備兩個winform的表單,一個叫它:splashscreen,把它做成一個漂亮的表單。然後你需要一個主表單叫它:form1吧,然後在這個表單加入下面的代碼。
// ( C# )
protected override void OnLoad ( System.EventArgs e )
{
//make load take a long time
Thread.Sleep(2000);
base.OnLoad(e);
}
然後在main中加入這樣的代碼:
[STAThread]
static void Main()
{
SplashScreen splashForm = new SplashScreen();
splashForm.Show();
Form1 mainForm = new Form1() ;
mainForm.Load += new EventHandler(splashForm.MainScreen_Load);
Application.Run(mainForm);
}

不要忘了加上對threading的引用: using System.Threading;

12. 如何使你的表單TrayIcon.

實現這個功能你可以運用notifyicon控制項來達到,從tools Windows中將NotifyIcon拖到你的表單上然後在下面的事件加入如下代碼,F5。
' // VB.NET
Private mIconA As Icon = New Icon("Icon1.ico")
Private mIconB As Icon = New Icon("Icon2.ico")
Private mIconDisplayed As Boolean

Public Sub New()
MyBase.New
Form1 = Me
'This call is required by the Win Form Designer.
InitializeComponent
'TODO: Add any initialization after the InitializeComponent() call
'this form isn't used directly so hide it immediately
Me.Hide()
'setup the tray icon
Initializenotifyicon()
End Sub

Private Sub Initializenotifyicon()
'setup the default icon
notifyicon = New System.Windows.Forms.NotifyIcon()
NotifyIcon.Icon = mIconA
NotifyIcon.Text = "Right Click for the menu"
NotifyIcon.Visible = True
mIconDisplayed = True
'Insert all MenuItem objects into an array and add them to
'the context menu simultaneously
Dim mnuItms(3) As MenuItem
mnuItms(0) = New MenuItem("Show Form...", New EventHandler(AddressOf Me.ShowFormSelect))
mnuItms(0).DefaultItem = True
mnuItms(1) = New MenuItem("Toggle Image", New EventHandler(AddressOf Me.ToggleImageSelect))
mnuItms(2) = New MenuItem("-")
mnuItms(3) = New MenuItem("Exit", New EventHandler(AddressOf Me.ExitSelect))
Dim notifyiconMnu As ContextMenu = New ContextMenu(mnuItms)
notifyicon.ContextMenu = notifyiconMnu
End Sub

Public Sub ShowFormSelect(ByVal sender As Object, ByVal e As System.EventArgs)
'Display the settings dialog
Dim SettingsForm As New SettingsForm()
SettingsForm.ShowDialog()
End Sub

Public Sub ToggleImageSelect(ByVal sender As Object, ByVal e As System.EventArgs)
'called when the user selects the 'Toggle Image' context menu
'determine which icon is currently visible and switch it
If mIconDisplayed Then
'called when the user selects the 'Show Form' context menu
NotifyIcon.Icon = mIconB
NotifyIcon.Text = "Sad"
mIconDisplayed = False
Else
NotifyIcon.Icon = mIconA
NotifyIcon.Text = "Happy"
mIconDisplayed = True
End If

End Sub

Public Sub ExitSelect(ByVal sender As Object, ByVal e As System.EventArgs)
'called when the user selects the 'Exit' context menu
'hide the tray icon
NotifyIcon.Visible = False
'close up
Me.Close()
End Sub

'Form overrides dispose to clean up the component list.
Public Overloads Overrides Sub Dispose()
MyBase.Dispose()
components.Dispose()
End Sub

表徵圖檔案你自己準備了,如果成功你可以看到有關NotifyIcond的各種功能了。

13. 如何修改控制表單的尺寸和長寬尺寸.

主要是修改winform的size, Width 和Height屬性。同樣它們都是可以在設計和運行時刻進行修改和設定。

form1.size = New System.Drawing.Size(100, 100) ( VB.NET )
form1.width += 100 (VB.NET )
form1.height -= 20 (VB.NET )

14. 如何建立一個Windows Explorer風格的表單.

1.建立一個新的windows Application
2.從toolbox視窗拖一個treeview控制項、、一個splitterk控制項、一個listview控制項,分別在屬性視窗中設定treeview的dock屬性為::left;設定listview控制項的dock屬性為:fill
3: F5 運行

15. 如何設定初始的啟動表單

無論是c#還是visual Basic的Winform項目中你都可以在Solution Explorer視窗中右鍵你的Project,然後選擇屬性,從你Project的屬性頁面中選擇你啟動的表單或是Main()方法。
有些不同的是在目前的vs.net Beta2中C#項目會自動產生Main() 方法,Visual Basic.Net 的項目中你必須自己添加Main()代碼,C#中你可以將Form1改成任何你可以啟動的表單名:
// ( C# )
static void Main()
{
Application.Run(new Form1());
}

16. 如何建立一個有背景映像的表單

現在的winform中所有的表單都有一個backgroundimage屬性,只用對它賦值就可以了。普通表單可以在運行模式也可以在運行模式完成這個設定。比如在initializecomponent()或表單的建構函式中加入這樣的代碼:
this.backgroundimage = new Bitmap("C://DotNetApp//WinForm//Tile.bmp" ) ;

對於MDI的主表單要麻煩一些,在VS.NET的IDE表單中,當你設定完IsMdiContainer屬性為True後,你需要查看一下InitializeComponent()中是否有這樣的代碼 ( C# ):
this.mdiClient1.Dock = System.Windows.Forms.DockStyle.Fill;
this.mdiClient1.Name = "mdiClient1";

或是在視窗的屬性視窗組合框中看到mdiclient1 System.Windows.Forms.mdiClient.這就是主MDI視窗,不過我沒有在dotnet的文檔中找到任何有關System.Windows.Forms.mdiClient的說明。然後你可以在InitializeComponent()或表單的建構函式中加入這樣的代碼( C# ):

this.mdiclient1.backgroundimage = new Bitmap("C://DotNetApp//WinForm//Tile.bmp" ) ;

網上有一個ImageView的例子,裡面示範了給MDI主表單中背景上加入一行Logo文字的方法,這樣使你的MDI表單看起來很商業化,具體的你可以這樣做:

1. 先在VS.NET 自動產生代碼的InitializeComponent中看是否有這樣的語句( C# ):

this.controls.addrange(new System.Windows.Forms.Control[] {this.mdiClient1});

又是這個mdiClient (haha)

2. 建立以下兩個函數用於顯示這個Logo字元:

// ( C# )

protected void Mdi_OnPaint ( Object s, System.Windows.Forms.PaintEventArgs e )
{

Control c = (Control)s;
Rectangle r1 = c.ClientRectangle;
r1.Width -= 4;
r1.Height -= 4;
Rectangle r2 = r1;
r2.Width -= 1;
r2.Height -= 1;
Font f = new Font("Tahoma", 8);
String str = "MyWinform.NET ?2001 MyWinform Application V1.0";
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Far;
sf.LineAlignment = StringAlignment.Far;
e.Graphics.DrawString(str, f, new SolidBrush(SystemColors.ControlDarkDark), r1, sf);
e.Graphics.DrawString(str, f, new SolidBrush(SystemColors.ControlLight), r2, sf);
}

protected void Mdi_OnResize ( Object s , System.EventArgs e )
{
Control c = (Control)s;
c.Invalidate();
}

3. 在InitializeComponent()或表單的建構函式中加入這樣的代碼:
( C# )

this.Controls[0].Paint += new PaintEventHandler( Mdi_OnPaint ) ;
this.Controls[0].Resize += new EventHandler( Mdi_OnResize ) ;
注意將它加在InitializeComponent()後面或是在InitializeComponent函數中this.Controls.AddRange函數之後。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.