一鹤(hjz)_贺建中 撰写 http://www.yescnet.com
今天刚拿到beta2,因为不想邮购,一直等到现在,今天刚到手,就把“随心所欲窗体外观”程序拿来小试了一下(现在大部份的例程都很简单,Microsoft也只有一些Class A Class B 之类很抽象的示例,这个源码我当初在VB6中写出来,在beta1中足足写了一个月才成功,那时候不要说中文,连英文的帮助都找不到,不眠不休才搞定),这也是我比较满意的一个程序,如果用得好,足以制作出令人眩目的效果,所以我不想他失效,所以一定要试一试,一试才知道,在beta2中beta1的程序根本不能用了,要改的地方很多,很多默认的引用并不清楚,只好新建一个工程,重新写过,顺便把我遇到的问题注释在代码中间。痛苦的折腾了一番,终于成功。
全部代码如下:
请到我的网站去下源码吧(我现在还没有上网上传,我会把文章写好再上传源码,所以现在无法标明确切地址,好在首页更新一定有的,
要不我那里搜索功能也很强大,打入“窗体外观”的关键字肯定能找到的)
Public Class Form1
Inherits System.Windows.Forms.Form '继承一个窗体的类
'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
'注意注意beta2这里的变化
'winforms类现在变成了windows.forms类
'不要想升级或修改beta1的程序,因为很多的基类重新定义了
'必须在beta2中新建,才能默认的有windws.forms这些引用
'如果手工添加|删除引用也可以
'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Dim Genie As AgentObjects.IAgentCtlCharacterEx '声明一个agent的对象
Const DATAPATH As String = "MERLIN.ACS" '加载动画数据
Public frmpre As Form1 '声明一个新的窗体,请不要在这里使用初始化的方法或使用New方法
Friend WithEvents AxAgent1 As AxAgentObjects.AxAgent
Friend WithEvents lbExit As System.Windows.Forms.Label
Friend WithEvents lbPre As System.Windows.Forms.Label
Friend WithEvents lbShow As System.Windows.Forms.Label
Friend WithEvents Label3 As System.Windows.Forms.Label
Public Imindex As Short '声明一个整数
#Region " Windows Form Designer generated code "
Sub New(Optional ByVal strImage As String = Nothing)
'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
'注意注意beta2这里的变化
'构造函数NEW在beta2现在是在#Region的内部
'构造函数NEW在beta2中不支持重载方法,但是我用一个Optional 参数很快解决了问题
'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
MyBase.New() '直接调用父类的new过程
Dim form1 As Form1 = form1
'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
'注意注意beta2这里的变化
'直接使用form1等于me会出错,默认的form1是一个类,不是一个实例
'使用前要dim form1 as form1=form使声明为一个实例才能赋值
'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
form1 = Me '设定me关键字
InitializeComponent() '下面是初始化组件,你也可以在下面使用call方法呼叫一个子过程(见前面的文章)
If Not strImage Is Nothing Then
'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
'注意注意beta2这里的变化
'strImage<> Nothing 会出错
'请用 Not strImage Is Nothing
'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
lbExit.Visible = False : lbShow.Visible = False : lbPre.Visible = False : Label3.Visible = False '新窗体不显示控制
Me.Top = Me.Top + 150 '新窗体的位置,top是距离屏幕顶部的高度
Call SkinRegion(form1, strImage) '为窗体改变skin(外观)
Else
AxAgent1.Characters.Load("MERLIN", DATAPATH) '装载动画数据
Genie = AxAgent1.Characters("MERLIN") '把Agent对象赋于声明的对象,简化书写的过程
Genie.LanguageID = &H409S '设定语音ID
Call SkinRegion(form1) '为窗体改变skin(外观)
End If
End Sub
'上面使用overloads定义了两个不同的new过程,在new过程中使用重载可以间接地使一个类产生很好的可重用性,如果你不明白为什么不写一个新的过程,而一定要使用重载
'那么你看看这里的用法,一定会有所启发的。
Public Overloads Sub Dispose() '释放资源,终止程序
MyBase.Dispose() '调用父类的方法
Region1.Dispose() '释放GDI资源
Genie = Nothing '释放动画占用的资源
'components.Dispose() '释放组件占用的资源
End Sub
'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
'注意注意beta2这里的变化
'Dispose现在是在#Region的内部
'在程序中调用components.Dispose()会出错,可能beta2需要这个对象直到最终销毁
'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
'Required by the Windows Form Designer
Private components As System.ComponentModel.Container
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
1<system.diagnostics.debuggerstepthrough()> Private Sub InitializeComponent()
2Dim resources As System.Resources.ResourceManager = New System.Resources.ResourceManager(GetType(Form1))
3Me.Label3 = New System.Windows.Forms.Label()
4Me.lbExit = New System.Windows.Forms.Label()
5Me.lbShow = New System.Windows.Forms.Label()
6Me.lbPre = New System.Windows.Forms.Label()
7Me.AxAgent1 = New AxAgentObjects.AxAgent()
8CType(Me.AxAgent1, System.ComponentModel.ISupportInitialize).BeginInit()
9Me.SuspendLayout()
10'
11'Label3
12'
13Me.Label3.BackColor = System.Drawing.Color.FromArgb(CType(255, Byte), CType(255, Byte), CType(192, Byte))
14Me.Label3.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D
15Me.Label3.Location = New System.Drawing.Point(200, 16)
16Me.Label3.Name = "Label3"
17Me.Label3.Size = New System.Drawing.Size(168, 88)
18Me.Label3.TabIndex = 4
19'
20'lbExit
21'
22Me.lbExit.BackColor = System.Drawing.Color.FromArgb(CType(192, Byte), CType(192, Byte), CType(255, Byte))
23Me.lbExit.Location = New System.Drawing.Point(80, 72)
24Me.lbExit.Name = "lbExit"
25Me.lbExit.Size = New System.Drawing.Size(56, 16)
26Me.lbExit.TabIndex = 1
27Me.lbExit.Text = "退出程序"
28'
29'lbShow
30'
31Me.lbShow.BackColor = System.Drawing.Color.FromArgb(CType(192, Byte), CType(192, Byte), CType(255, Byte))
32Me.lbShow.Location = New System.Drawing.Point(80, 24)
33Me.lbShow.Name = "lbShow"
34Me.lbShow.Size = New System.Drawing.Size(56, 16)
35Me.lbShow.TabIndex = 3
36Me.lbShow.Text = "散散心吧"
37'
38'lbPre
39'
40Me.lbPre.BackColor = System.Drawing.Color.FromArgb(CType(192, Byte), CType(192, Byte), CType(255, Byte))
41Me.lbPre.Location = New System.Drawing.Point(80, 48)
42Me.lbPre.Name = "lbPre"
43Me.lbPre.Size = New System.Drawing.Size(56, 16)
44Me.lbPre.TabIndex = 2
45Me.lbPre.Text = "外观应用"
46'
47'AxAgent1
48'
49Me.AxAgent1.Enabled = True
50Me.AxAgent1.Location = New System.Drawing.Point(224, 176)
51Me.AxAgent1.Name = "AxAgent1"
52Me.AxAgent1.OcxState = CType(resources.GetObject("AxAgent1.OcxState"), System.Windows.Forms.AxHost.State)
53Me.AxAgent1.Size = New System.Drawing.Size(56, 40)
54Me.AxAgent1.TabIndex = 0
55'
56'Form1
57'
58Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14)
59Me.BackColor = System.Drawing.Color.FromArgb(CType(192, Byte), CType(192, Byte), CType(255, Byte))
60Me.BackgroundImage = CType(resources.GetObject("$this.BackgroundImage"), System.Drawing.Bitmap)
61Me.ClientSize = New System.Drawing.Size(432, 287)
62Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.Label3, Me.lbShow, Me.lbPre, Me.lbExit, Me.AxAgent1})
63Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None
64Me.MaximizeBox = False
65Me.MinimizeBox = False
66Me.Name = "Form1"
67Me.StartPosition = System.Windows.Forms.FormStartPosition.Manual
68Me.Text = "Form1"
69CType(Me.AxAgent1, System.ComponentModel.ISupportInitialize).EndInit()
70Me.ResumeLayout(False)
71
72End Sub
73
74#End Region
75
76Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
77'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
78'注意注意beta2这里的变化
79'默认的给了你一个VB6中的load过程
80'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
81End Sub
82
83'上面的是非编辑模块,就不用看了
84Protected Sub lbExit_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lbExit.Click
85'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
86'注意注意beta2这里的变化
87'Click的参数不一样了
88'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
89If Not frmpre Is Nothing Then '如果加载了新窗体
90'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
91'请用Not frmpre Is Nothing 不要使用frmpre<>nothing
92'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
93frmpre.Dispose() '终止新窗体
94frmpre = Nothing '释放占用的资源
95End If
96Me.Dispose() '终止程序
97End '彻底终止程序(如果程序无法退出,请使用此关键字)
98End Sub
99
100
101'下面是动画过程,在前面的文章中很详细,可以不用看了!
102Protected Sub lbshow_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lbShow.Click
103
104Genie.Left = 500 '设定agent的位置
105Genie.Show() '使用show方法显示agent
106Genie.MoveTo(12, 180) 'moveto方法是移动agent到一个位置,如果加上定时器,你可以很容易地让他在屏幕上 乱跑()
107MessageBox.Show("如果你是MM,请按Ctrl+Alt+Del关闭 " & Chr(10) & Chr(13) & "您真的要继续吗, 等到我不 动再说!")
108Genie.Speak("ni hao") '发出声音
109MessageBox.Show("你好") '对话框,更多的参数请看以前的相关文章
110Genie.Speak("WO SHI HAO KAN DI") '发出声音
111MessageBox.Show("我是好看的") '对话框,更多的参数请看以前的相关文章
112Genie.Speak("NI SHI NAN KAN DI") '发出声音
113MessageBox.Show("你是难看的") '对话框,更多的参数请看以前的相关文章
114Genie.Speak("ZIA JIE MIMI ") '发出声音
115MessageBox.Show("再见 MM") '对话框,更多的参数请看以前的相关文章
116Genie.Play("Wave") '挥手致意
117'众MM请勿生气
118'上面是开一个小玩笑,如果要真正的读中文,就用下面的
119'Genie.Speak("CNstring ",CNstring.wav) '这里的CNstring就是中文的语音文件
120Genie.Hide() '使用hide方法隐藏agent
121End Sub
122
123Protected Sub lbpreClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lbPre.Click
124
125If Not frmpre Is Nothing Then frmpre.Dispose() '如果新窗体已经存在,清除之
126Dim strIm As String '定义一个字符类型变量
127If Imindex <> 6 Then '反过来想,就是说如果到了6就从头开始,因这我只有这么几张图片了
128Imindex = Imindex + 1
129Else
130Imindex = 1 '从头开始
131End If
132strIm = "SK" & Imindex.ToString 'tostring的意思是从字符类型转为数字类型
133'在VB.net中label控件有image控件一样的作用,不但可以显示文本而且可以显示图片,而在VB6中是只能显示图片的
134Label3.Image = Label3.Image.FromFile(System.Windows.Forms.Application.StartupPath & "\" & strIm & ".GIF") 'formfile是从一个路径装载图片
135'System.WinForms.Application.StartUpPath的意思是当前目录,同VB6中的App.Path
136'请注意调试过程中使用的当前目录是在bin目录下,在下一个版本有可能更改
137frmpre = New Form1(strIm) '初始化一个实例(对象)
138frmpre.Visible = True '显示新窗体,如果没有这个只怕你什么也看不到!
139End Sub
140
141'下面是移动窗体的代码,请参考前面的文章
142Private Sub Form1_MouseDown(ByVal eventSender As System.Object, ByVal eventArgs As System.Windows.Forms.MouseEventArgs)
143Me.Capture = False '释放鼠标捕获
144' Me.SendMessage(&HA1S, 2, 0) '这是VB6中最有名的API消息函数
145'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
146'注意注意beta2这里的变化
147'sendmessage以前的用法不能用了,看了一下MSDN,居然全是Beta1的内容,我倒!
148'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
149End Sub
150'下面是鼠标移动_MouseMove时发生的事件了
151Public Sub lbpre_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles lbPre.MouseMove
152lbPre.BackColor = System.Drawing.Color.Black '设置颜色
153lbPre.ForeColor = System.Drawing.Color.AliceBlue '设置颜色
154End Sub
155Public Sub lbExit_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles lbExit.MouseMove
156lbExit.BackColor = System.Drawing.Color.Black '设置颜色
157lbExit.ForeColor = System.Drawing.Color.AliceBlue '设置颜色
158End Sub
159Public Sub lbshow_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles lbShow.MouseMove
160lbShow.BackColor = System.Drawing.Color.Black '设置颜色
161lbShow.ForeColor = System.Drawing.Color.AliceBlue '设置颜色
162End Sub
163'下面是鼠标按下_MouseMove时发生的事件了
164Public Sub lbpre_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles lbPre.MouseDown
165lbPre.BackColor = System.Drawing.Color.Blue '设置颜色
166lbPre.ForeColor = System.Drawing.Color.AliceBlue '设置颜色
167End Sub
168Public Sub lbExit_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles lbExit.MouseDown
169lbExit.BackColor = System.Drawing.Color.Blue '设置颜色
170lbExit.ForeColor = System.Drawing.Color.AliceBlue '设置颜色
171End Sub
172Public Sub lbShow_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles lbShow.MouseDown
173lbShow.BackColor = System.Drawing.Color.Blue '设置颜色
174lbShow.ForeColor = System.Drawing.Color.AliceBlue '设置颜色
175End Sub
176
177Public Sub lbpre_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles lbPre.MouseUp
178lbPre.BackColor = System.Drawing.Color.Black '设置颜色
179lbPre.ForeColor = System.Drawing.Color.AliceBlue '设置颜色
180End Sub
181Public Sub lbExit_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles lbExit.MouseUp
182lbExit.BackColor = System.Drawing.Color.Black '设置颜色
183lbExit.ForeColor = System.Drawing.Color.AliceBlue '设置颜色
184End Sub
185Public Sub lbShow_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles lbShow.MouseUp
186lbShow.BackColor = System.Drawing.Color.Black '设置颜色
187lbShow.ForeColor = System.Drawing.Color.AliceBlue '设置颜色
188End Sub
189'下面是鼠标离开_MouseLeave时发生的事件了
190Public Sub lbShow_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles lbShow.MouseLeave
191lbShow.BackColor = System.Drawing.Color.BlanchedAlmond '设置颜色
192lbShow.ForeColor = System.Drawing.Color.Black '设置颜色
193End Sub
194Public Sub lbExit_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles lbExit.MouseLeave
195lbExit.BackColor = System.Drawing.Color.BlanchedAlmond '设置颜色
196lbExit.ForeColor = System.Drawing.Color.Black '设置颜色
197End Sub
198Public Sub lbpre_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles lbPre.MouseLeave
199lbPre.BackColor = System.Drawing.Color.BlanchedAlmond '设置颜色
200lbPre.ForeColor = System.Drawing.Color.Black '设置颜色
201End Sub
202
203End Class
204
205'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
206'注意注意beta2这里的变化
207'大家注意到没有?只有这个我写的这个千变万化窗体的模块不需要任何修改,呵呵,可以骄傲一下了
208'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
209
210'###################################################################################################################
211'!!!0001!!!04!!!26!!!!!!
212'建议不要修改此模块 以免产生不必要的错误(此代码已相当完美) 如欲修改请先备份 _______VB.Net中文站 hejianzhong
213'此模块可真接粘贴到您的程序中使用。
214'不要删除此信息,我免费为您提供此代码,想得到的回报就是最起码的尊重,虽然最终用户并不能看到,我仍感到欣慰
215'!!!0001!!!04!!!26!!!!!!
216Public Module SKin
217Declare Function SendMessage Lib "user32" Alias _
218"SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, _
219ByVal wParam As Long, ByVal lParam As Long) As Long
220
221
222Public Rect1 As New Rectangle(0, 0, 0, 0)
223Public Region1 As New System.Drawing.Region(Rect1)
224Public Sub SkinRegion(ByVal SKform As Form, Optional ByVal skinNaSKform As String = Nothing)
225Dim X, Y, transPix, opaciPix, BgWidth, BgHeight As Integer
226Dim rect2 As New Rectangle()
227Dim FirARGB As Integer = Getpixel(SKform, 1, 1)
228Dim Region1 As New System.Drawing.Region(Rect1)
229Rect1 = Nothing
230'SKform.Visible = False
231If skinNaSKform <> Nothing Then SKform.BackgroundImage = SKform.BackgroundImage.FromFile(System.Windows.Forms.Application.StartupPath & "\" & skinNaSKform & ".gif")
232BgWidth = SKform.BackgroundImage.Width
233BgHeight = SKform.BackgroundImage.Height
234SKform.Height = BgHeight
235SKform.Width = BgWidth
236For Y = 1 To BgHeight - 1 '这里参考了VB6中的扫描方法,请参考相关资料
237X = 0
238Do
239X = X + 1
240While (Getpixel(SKform, X, Y) = FirARGB) And (X < BgWidth)
241X = X + 1
242End While
243transPix = X
244While (Getpixel(SKform, X, Y) <> FirARGB) And (X < BgWidth)
245X = X + 1
246End While
247opaciPix = X - 1
248If transPix <= opaciPix Then
249rect2 = rect2.FromLTRB(transPix - 1, Y - 1, opaciPix, Y)
250Region1.Union(rect2)
251rect2 = Nothing
252End If
253Loop Until X >= BgWidth
254Next Y
255SKform.Region = Region1
256SKform.Refresh()
257'SKform.Visible = True
258End Sub
259Public Function Getpixel(ByVal SKform As Form, ByVal x As Integer, ByVal y As Integer) As Integer
260Dim pm As Bitmap = SKform.BackgroundImage
261Try
262Return pm.GetPixel(x, y).ToArgb
263Catch
264Exit Function
265End Try
266End Function
267End Module
268'###################################################################################################################
269
270'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
271'借光借光,转载请不要删了我的网址
272'CNET中文网 ◇ VB.NET中文网
273'主站:
274'http://www.yescnet.com
275'镜像:
276'http://user.7host.com/yescnet
277'http://perso.kilio.com/yescnet
278'http://www.yescnet.net
279'http://www.websamba.com/yescnet
280'请到我的网站下载本文章的示例源码
281
282'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
283
284全文(完)
285
286* * *
287
288** 附:走近VB.Net(Beta1之十一) 随心所欲窗体外观(skin精彩源码) **
289
290这是beta1的源码,大家比较吧
291
292前几天因为应付约稿,答应的这个源码推迟了几天,今天熬夜把他写出来,请见谅。另外我想说一些题外话,前时我曾在文章中说过,说VB.Net的面向对象抄袭java,delphi没有实际根据(你总不能把面象对象理解成linux核心一样的源码技术,他主要还是一种指导思想),这句话本身就有了逻辑性的错误,请问java与delphi是谁抄谁呢?答案只能是SmallTalk的面向对象更早(见王国荣的文章)。 VC的面向对象大家闭口不提,然而我个人认为在windows编程上(不包括网络应用)VC仍是最强大的语言,而VC的程序员几乎没有人出来说这些无聊的话。那么是谁在说呢......
293
294这个说法最早源于国外的文章(指在网络应用上有涉嫌模仿Java,如果是编写windows程序则毫无根据),而作者在后来的撰文中很清楚的告诉大家纠正此说法。我也一再提到过。可有 人视若无睹。大家现在就说VB.Net如何如何太早了一点,我们都是在实践摸索,用都不会用,就毫无根据的揣测有些不智。很多学java的告诉你先学java再学VB.Net.这有些不可思议,起码到目前,没有看到java程序员写出我们可以拿来学的VB.Net程序。因为有了面象对象的思想不等于有了一切。
295
296现在面向对象真有些神化了,这不可思议,程序员不是哲人,是要通宵达旦的工作学习创造,好象一点也不浪漫!而现在竟被一部分人浪漫了。
297
298不论微软如何的称颂他的网络功能,我相信在不久的将来,VB.Net必将成为最快速,最重要,也最适用windows平台的应用程序编程语言(我没有涉及网络应用)。当然决不可能是最强大的,这世界好象没有谁最强大!而且我对他的网络应用不感兴趣。每个人都有自已的路。正如大家都说VB如何的适宜于开发数据库。但是你相不相信一个人从不接触数据库可以写出让人很看好的程 序,每个人有权利选择自已的路! 如果你对网络应用毫无兴趣,java还会是一个好的选择吗?
299
300我个人认为无论是java,delphi,还是VB.Net甚至C++,各有各的长处。各有各的用途。无优劣之分,编程最重要的是灵感,是广博的视野,是宽大的襟怀。任何想贬低别人的人,正暴露自已的浅见与无知。我虽然是学VB的,但我在进入delphi的论坛以后,我亦为之感动,这里也有很多兢兢业业,无私奉献的值得尊敬与学习的人。工具永远不能征服人性!外国人没有因这纸是中国人造的而不用,亦没有因火药是中国人发明的而羞愧,也没有因这二进制的起源于中国而牢骚,科学是跨越国界的,不应被蒙上政治色彩。
301
302我曾在一个专门介绍比尔盖茨的网站看了一下他的生平,想来看过的人不少。看了他一生的奋斗历程,我们还能说什么呢?
303
304以上是个人的浅见(鉴于本人对delphi,java的无知,对VB.Net的初识以及对面象对象技术的部分误解),只是谈谈感受,请勿借题发挥,大作文章。我写这些是防止一些错得离谱的歪论误导初学者。另外我一再鼓励大家研究一下,弄出一些实际的心得来。我因为自身的限制与没有相互的研讨,所以每一篇文章写出来所付出的努力不亚于写一个工程。所以请转载文章的在跟我联系以后 在文中明确按本文结尾处样式注明我的网站名,网址 。这里先向您致谢了!
305
306另外鉴于一些初学者的要求,以及前辈的指点,我在源码中对入门级的知识进行了注解,如果您认为这些对您是多余的,请谅解还有很多人看不懂。
307
308
309
310' 本源码出自VB.Net中文站 http://vbnetcn.126.com hejianzhong 请尊重作者劳动不要修改此信息(ai.....................)
311
312'
313
314' -------------------------------------------------------------------------------------------------------------------
315
316' 请首先清添加lable(lbExit,lbPre,lbShow)控件
317
318' 请在属性栏设置这三个lable控件的BackColr(背景色)为system.desktop 即在出现的取色对话框中选择system标签下的desktop颜色
319
320' 下一步,添加AxAgent控件这个请参考拙作《走近VB.Net(九) AxAgent动画窗体的实现》
321
322' 设置窗体背景图片为SK1.GIF 请在 BackgroundImage 属性栏设置
323
324' 所有需要的图片用photoshop做出来,如果你不会做可到《VB.Net中文论坛》去找我帮你做。
325
326' 设置lbExit的Text属性(指在标签上显示的文本)为“退出”
327
328' 设置lbPre的Text属性(指在标签上显示的文本)为“窗体”
329
330' 设置lbShow的Text属性(指在标签上显示的文本)为“动画”
331
332' 设置所有label的 TextAlign(文本的排列方式)为center(居中)
333
334Option Strict Off '关闭Option Strict
335
336Imports System.ComponentModel '引用族名
337
338Imports System.Drawing '引用族名
339
340Imports System.WinForms '引用族名
341
342Public Class Form1
343
344Inherits System.WinForms.Form '继承一个窗体的类
345
346Dim Genie As AgentObjects.IAgentCtlCharacterEx '声明一个agent的对象
347
348Const DATAPATH As String = "MERLIN.ACS" '加载动画数据
349
350Public frmpre As Form1 '声明一个新的窗体,请不要在这里使用初始化的方法或使用New方法
351
352Public Imindex As Short '声明一个整数
353
354Public Overloads Sub New() '每一个类一般都有一个new过程,在新建一个对象(使用new方法)时调用
355
356MyBase.New() '直接调用父类的new过程
357
358Form1 = Me '设定me关键字
359
360InitializeComponent() '下面是初始化组件,你也可以在下面使用call方法呼叫一个子过程(见前面的文章)
361
362axAgent1.Characters.Load("MERLIN", DATAPATH) '装载动画数据
363
364Genie = axAgent1.Characters("MERLIN") '把Agent对象赋于声明的对象,简化书写的过程
365
366Genie.LanguageID = &H409S '设定语音ID
367
368Call SkinRegion(form1) '为窗体改变skin(外观)
369
370End Sub
371
372Overloads Sub new(ByVal strImage As String)
373
374MyBase.New() '直接调用父类的new过程
375
376Form1 = Me '设定me关键字
377
378InitializeComponent() '下面是初始化组件,你也可以在下面使用call方法呼叫一个子过程(见前面的文章)
379
380lbExit.Visible = False : lbShow.Visible = False : lbpre.Visible = False : label3.Visible = False '新窗体不显示控制
381
382Me.top = Me.top + 150 '新窗体的位置,top是距离屏幕顶部的高度
383
384Call SkinRegion(form1, strImage) '为窗体改变skin(外观)
385
386End Sub
387
388'上面使用overloads定义了两个不同的new过程,在new过程中使用重载可以间接地使一个类产生很好的可重用性,如果你不明白为什么不写一个新的过程,而一定要使用重载
389
390'那么你看看这里的用法,一定会有所启发的。
391
392Public Overrides Sub Dispose() '释放资源,终止程序
393
394MyBase.Dispose() '调用父类的方法
395
396Region1.Dispose() '释放GDI资源
397
398genie = Nothing '释放动画占用的资源
399
400components.Dispose() '释放组件占用的资源
401
402End Sub
403
404'下面的是非编辑模块,就不用看了
405
406#Region " Windows Form Designer generated code "
407
408'Required by the Windows Form Designer
409
410Private components As System.ComponentModel.Container
411
412Private WithEvents lbShow As System.WinForms.Label
413
414Private WithEvents Label3 As System.WinForms.Label
415
416Private WithEvents LinkLabel3 As System.WinForms.LinkLabel
417
418Private WithEvents lbExit As System.WinForms.Label
419
420Private WithEvents lbpre As System.WinForms.Label
421
422Private WithEvents AxAgent1 As AxAgentObjects.AxAgent
423
424Dim WithEvents Form1 As System.WinForms.Form
425
426'NOTE: The following procedure is required by the Windows Form Designer
427
428'It can be modified using the Windows Form Designer.
429
430'Do not modify it using the code editor.
431
432Private Sub InitializeComponent()
433
434Dim resources As System.Resources.ResourceManager = New System.Resources.ResourceManager(GetType(Form1))
435
436Me.components = New System.ComponentModel.Container()
437
438Me.lbpre = New System.WinForms.Label()
439
440Me.lbShow = New System.WinForms.Label()
441
442Me.Label3 = New System.WinForms.Label()
443
444Me.AxAgent1 = New AxAgentObjects.AxAgent()
445
446Me.LinkLabel3 = New System.WinForms.LinkLabel()
447
448Me.lbExit = New System.WinForms.Label()
449
450AxAgent1.BeginInit()
451
452'@design Me.TrayHeight = 90
453
454'@design Me.TrayLargeIcon = False
455
456'@design Me.TrayAutoArrange = True
457
458lbpre.Location = New System.Drawing.Point(32, 72)
459
460lbpre.Text = "窗体"
461
462lbpre.Size = New System.Drawing.Size(64, 24)
463
464lbpre.TabIndex = 10
465
466lbpre.BackColor = System.Drawing.SystemColors.Desktop
467
468lbpre.TextAlign = System.WinForms.HorizontalAlignment.Center
469
470lbShow.Location = New System.Drawing.Point(32, 24)
471
472lbShow.Text = "动画"
473
474lbShow.Size = New System.Drawing.Size(64, 24)
475
476lbShow.TabIndex = 17
477
478lbShow.BackColor = System.Drawing.SystemColors.Desktop
479
480lbShow.TextAlign = System.WinForms.HorizontalAlignment.Center
481
482Label3.Location = New System.Drawing.Point(176, 16)
483
484Label3.Text = " "
485
486Label3.Size = New System.Drawing.Size(176, 88)
487
488Label3.BorderStyle = System.WinForms.BorderStyle.Fixed3D
489
490Label3.TabIndex = 16
491
492AxAgent1.Size = New System.Drawing.Size(56, 40)
493
494AxAgent1.OcxState = CType(resources.GetObject("AxAgent1.OcxState"), System.WinForms.AxHost.State)
495
496AxAgent1.TabIndex = 1
497
498AxAgent1.Location = New System.Drawing.Point(232, 216)
499
500LinkLabel3.Text = "LinkLabel3"
501
502LinkLabel3.Size = New System.Drawing.Size(0, 16)
503
504LinkLabel3.TabIndex = 15
505
506LinkLabel3.TabStop = True
507
508LinkLabel3.Location = New System.Drawing.Point(352, 88)
509
510lbExit.Location = New System.Drawing.Point(32, 48)
511
512lbExit.Text = "退出"
513
514lbExit.Size = New System.Drawing.Size(64, 24)
515
516lbExit.TabIndex = 11
517
518lbExit.BackColor = System.Drawing.SystemColors.Desktop
519
520lbExit.TextAlign = System.WinForms.HorizontalAlignment.Center
521
522Me.Text = "Form1"
523
524Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14)
525
526Me.BorderStyle = System.WinForms.FormBorderStyle.None
527
528Me.BackgroundImage = CType(resources.GetObject("$this.BackgroundImage"), System.Drawing.Image)
529
530Me.ClientSize = New System.Drawing.Size(392, 288)
531
532Me.Controls.Add(lbShow)
533
534Me.Controls.Add(Label3)
535
536Me.Controls.Add(LinkLabel3)
537
538Me.Controls.Add(lbExit)
539
540Me.Controls.Add(lbpre)
541
542Me.Controls.Add(AxAgent1)
543
544AxAgent1.EndInit()
545
546End Sub
547
548#End Region
549
550'上面的是非编辑模块,就不用看了
551
552Protected Sub lbExit_Click(ByVal sender As Object, ByVal e As System.EventArgs)
553
554If frmpre <> Nothing Then '如果加载了新窗体
555
556frmpre.Dispose() '终止新窗体
557
558frmpre = Nothing '释放占用的资源
559
560End If
561
562Me.Dispose() '终止程序
563
564End '彻底终止程序(如果程序无法退出,请使用此关键字)
565
566End Sub
567
568'下面是动画过程,在前面的文章中很详细,可以不用看了!
569
570Protected Sub lbshow_Click(ByVal sender As Object, ByVal e As System.EventArgs)
571
572genie.Left = 500 '设定agent的位置
573
574Genie.Show() '使用show方法显示agent
575
576genie.MoveTo(12, 180) 'moveto方法是移动agent到一个位置,如果加上定时器,你可以很容易地让他在屏幕上 乱跑()
577
578messagebox.Show("如果你是MM,请按Ctrl+Alt+Del关闭 " & chr(10) & chr(13) & "您真的要继续吗, 等到我不 动再说!")
579
580Genie.Speak("ni hao") '发出声音
581
582messagebox.Show("你好") '对话框,更多的参数请看以前的相关文章
583
584Genie.Speak("WO SHI HAO KAN DI") '发出声音
585
586messagebox.Show("我是好看的") '对话框,更多的参数请看以前的相关文章
587
588Genie.Speak("NI SHI NAN KAN DI") '发出声音
589
590messagebox.Show("你是难看的") '对话框,更多的参数请看以前的相关文章
591
592Genie.Speak("ZIA JIE MIMI ") '发出声音
593
594messagebox.Show("再见 MM") '对话框,更多的参数请看以前的相关文章
595
596genie.Play("Wave") '挥手致意
597
598'众MM请勿生气
599
600'上面是开一个小玩笑,如果要真正的读中文,就用下面的
601
602'Genie.Speak("CNstring ",CNstring.wav) '这里的CNstring就是中文的语音文件
603
604genie.Hide() '使用hide方法隐藏agent
605
606End Sub
607
608Protected Sub lbpre_Click(ByVal sender As Object, ByVal e As System.EventArgs)
609
610If frmpre <> Nothing Then frmpre.Dispose() '如果新窗体已经存在,清除之
611
612Dim strIm As String '定义一个字符类型变量
613
614If Imindex <> 6 Then '反过来想,就是说如果到了6就从头开始,因这我只有这么几张图片了
615
616imindex = Imindex + 1
617
618Else
619
620IMINDEX = 1 '从头开始
621
622End If
623
624strIm = "SK" & imindex.ToString 'tostring的意思是从字符类型转为数字类型
625
626'在VB.net中label控件有image控件一样的作用,不但可以显示文本而且可以显示图片,而在VB6中是只能显示图片的
627
628Label3.image = label3.Image.FromFile(System.WinForms.Application.StartUpPath & "\" & strim & ".GIF") 'formfile是从一个路径装载图片
629
630'System.WinForms.Application.StartUpPath的意思是当前目录,同VB6中的App.Path
631
632'请注意调试过程中使用的当前目录是在bin目录下,在下一个版本有可能更改
633
634frmpre = New form1(strim) '初始化一个实例(对象)
635
636frmpre.Visible = True '显示新窗体,如果没有这个只怕你什么也看不到!
637
638End Sub
639
640'下面是移动窗体的代码,请参考前面的文章
641
642Private Sub Form1_MouseDown(ByVal eventSender As System.Object, ByVal eventArgs As System.WinForms.MouseEventArgs)
643
644Me.Capture = False '释放鼠标捕获
645
646Me.SendMessage(&HA1S, 2, 0) '这是VB6中最有名的API消息函数
647
648End Sub
649
650'下面是鼠标移动_MouseMove时发生的事件了
651
652Public Sub lbpre_MouseMove(ByVal sender As Object, ByVal e As System.WinForms.MouseEventArgs) Handles lbpre.MouseMove
653
654lbpre.BackColor = system.drawing.Color.Black '设置颜色
655
656lbpre.ForeColor = system.Drawing.Color.AliceBlue '设置颜色
657
658End Sub
659
660Public Sub lbExit_MouseMove(ByVal sender As Object, ByVal e As System.WinForms.MouseEventArgs) Handles lbExit.MouseMove
661
662lbExit.BackColor = system.drawing.Color.Black '设置颜色
663
664lbExit.ForeColor = system.Drawing.Color.AliceBlue '设置颜色
665
666End Sub
667
668Public Sub lbshow_MouseMove(ByVal sender As Object, ByVal e As System.WinForms.MouseEventArgs) Handles lbshow.MouseMove
669
670lbshow.BackColor = system.drawing.Color.BLack '设置颜色
671
672lbshow.ForeColor = system.Drawing.Color.AliceBlue '设置颜色
673
674End Sub
675
676'下面是鼠标按下_MouseMove时发生的事件了
677
678Public Sub lbpre_MouseDown(ByVal sender As Object, ByVal e As System.WinForms.MouseEventArgs) Handles lbpre.MouseDown
679
680lbpre.BackColor = system.drawing.Color.Blue '设置颜色
681
682lbpre.ForeColor = system.Drawing.Color.AliceBlue '设置颜色
683
684End Sub
685
686Public Sub lbExit_MouseDown(ByVal sender As Object, ByVal e As System.WinForms.MouseEventArgs) Handles lbExit.MouseDown
687
688lbExit.BackColor = system.drawing.Color.Blue '设置颜色
689
690lbExit.ForeColor = system.Drawing.Color.AliceBlue '设置颜色
691
692End Sub
693
694Public Sub lbShow_MouseDown(ByVal sender As Object, ByVal e As System.WinForms.MouseEventArgs) Handles lbShow.MouseDown
695
696lbshow.BackColor = system.drawing.Color.Blue '设置颜色
697
698lbshow.ForeColor = system.Drawing.Color.AliceBlue '设置颜色
699
700End Sub
701
702Public Sub lbpre_MouseUp(ByVal sender As Object, ByVal e As System.WinForms.MouseEventArgs) Handles lbpre.MouseUp
703
704lbpre.BackColor = system.drawing.Color.Black '设置颜色
705
706lbpre.ForeColor = system.Drawing.Color.AliceBlue '设置颜色
707
708End Sub
709
710Public Sub lbExit_MouseUp(ByVal sender As Object, ByVal e As System.WinForms.MouseEventArgs) Handles lbExit.MouseUp
711
712lbExit.BackColor = system.drawing.Color.Black '设置颜色
713
714lbExit.ForeColor = system.Drawing.Color.AliceBlue '设置颜色
715
716End Sub
717
718Public Sub lbShow_MouseUp(ByVal sender As Object, ByVal e As System.WinForms.MouseEventArgs) Handles lbShow.MouseUp
719
720lbshow.BackColor = system.drawing.Color.BLack '设置颜色
721
722lbshow.ForeColor = system.Drawing.Color.AliceBlue '设置颜色
723
724End Sub
725
726'下面是鼠标离开_MouseLeave时发生的事件了
727
728Public Sub lbShow_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles lbShow.MouseLeave
729
730lbshow.BackColor = system.drawing.Color.BlanchedAlmond '设置颜色
731
732lbshow.ForeColor = system.Drawing.Color.Black '设置颜色
733
734End Sub
735
736Public Sub lbExit_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles lbExit.MouseLeave
737
738lbExit.BackColor = system.drawing.Color.BlanchedAlmond '设置颜色
739
740lbExit.ForeColor = system.Drawing.Color.Black '设置颜色
741
742End Sub
743
744Public Sub lbpre_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles lbpre.MouseLeave
745
746lbpre.BackColor = system.drawing.Color.BlanchedAlmond '设置颜色
747
748lbpre.ForeColor = system.Drawing.Color.Black '设置颜色
749
750End Sub
751
752End Class
753
754'##############################################################
755
756'!!!0001!!!04!!!26!!!!!!
757
758'建议不要修改此模块 以免产生不必要的错误(此代码已相当完美) 如欲修改请先备份 _______VB.Net中文站 hejianzhong
759
760'此模块可真接粘贴到您的程序中使用。
761
762'不要删除此信息,我免费为您提供此代码,想得到的回报就是最起码的尊重,虽然最终用户并不能看到,我仍感到欣慰
763
764'!!!0001!!!04!!!26!!!!!!
765
766Public Module SKin
767
768Public Rect1 As New Rectangle(0, 0, 0, 0)
769
770Public Region1 As New System.Drawing.Region(Rect1)
771
772Public Sub SkinRegion(ByVal SKform As Form, Optional ByVal skinNaSKform As String = Nothing)
773
774Dim X, Y, transPix, opaciPix, BgWidth, BgHeight As Integer
775
776Dim rect2 As New Rectangle()
777
778Dim FirARGB As Integer = getpixel(SKform, 1, 1)
779
780Dim Region1 As New System.Drawing.Region(Rect1)
781
782Rect1 = Nothing
783
784'SKform.Visible = False
785
786If skinnaSKform <> Nothing Then SKform.BackgroundImage = SKform.BackgroundImage.FromFile(System.WinForms.Application.StartUpPath & "\" & skinNaSKform & ".gif")
787
788BgWidth = SKform.BackgroundImage.Width
789
790BgHeight = SKform.BackgroundImage.Height
791
792SKform.Height = BgHeight
793
794SKform.Width = BgWidth
795
796For Y = 1 To BgHeight - 1 '这里参考了VB6中的扫描方法,请参考相关资料
797
798X = 0
799
800Do
801
802X = X + 1
803
804While (getpixel(SKform, X, Y) = FirARGB) And (X < BgWidth)
805
806X = X + 1
807
808End While
809
810transPix = X
811
812While (getpixel(SKform, X, Y) <> FirARGB) And (X < BgWidth)
813
814X = X + 1
815
816End While
817
818opaciPix = X - 1
819
820If transPix <= opaciPix Then
821
822rect2 = rect2.FromLTRB(transPix - 1, Y - 1, opaciPix, Y)
823
824Region1.Union(rect2)
825
826rect2 = Nothing
827
828End If
829
830Loop Until X >= BgWidth
831
832Next Y
833
834SKform.Region = Region1
835
836SKform.Refresh()
837
838'SKform.Visible = True
839
840End Sub
841
842Public Function Getpixel(ByVal SKform As Form, ByVal x As Integer, ByVal y As Integer) As Integer
843
844Dim pm As Bitmap = SKform.BackgroundImage
845
846Try
847
848Return pm.GetPixel(x, y).ToARGB
849
850Catch
851
852Exit Function
853
854End Try
855
856End Function
857
858End Module
859
860'#################################################</system.diagnostics.debuggerstepthrough()>