×

DotNET WinForm FAQ 16个2008-04-02 08:36目录

Kalet Kalet 发表于2009-03-20 12:00:14 浏览254 评论0

抢沙发发表评论

目录
1. 如何设置一个From的边界


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

DotNET WinForm FAQ 16个2008-04-02 08:36目录

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();


 

DotNET WinForm FAQ 16个2008-04-02 08:36目录

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 ) ;

DotNET WinForm FAQ 16个2008-04-02 08:36目录

注意将它加在InitializeComponent()后面或是在InitializeComponent函数中this.Controls.AddRange函数之后。



群贤毕至

访客