精易论坛

标题: lionking1990 对象编程:一切皆对象【扫盲贴】 [打印本页]

作者: 3721    时间: 2011-5-14 11:53
标题: lionking1990 对象编程:一切皆对象【扫盲贴】
VB是面向对象的编程工具,这里引用《Thinking In Java》里面的一句话:一切皆对象。

很多人并不明白什么是面向对象,即使他也能写出想要的东西,因为VB一开始就已经是这样了。

一打开VB,就是一个窗体,这就是一个对象。在上面画一个按钮,一个文本框……都是在创建对
象,只是这个过程被VB封装了。

但是从使用中可以切实地感受到对象编程的方便性,这可以举出很多例子:

如果想设置文本颜色,应该怎么做?

在VB中,可以这么写:Me.Text1.ForeColor = vbRed

正因为是对象编程,所以文本框可以有各种属性,很简单地就能调用它。

那么看一下其他情况下应该怎么做?

应当调用这个API,传入文本框的设备场景,设置颜色。
Declare Function SetTextColor Lib "gdi32" Alias "SetTextColor" (ByVal hdc As Long,  
ByVal crColor As Long) As Long

当然,这个API太简单了,很难体现出对象的方便性。那我们再来看看一个特殊的控件<Label>
这个是一个什么东西?没有句柄,没有场景,MS系统控件应有的东西都没有,它是一个对象。

我个人认为这个只是VB中的一个类,因为它有属性,可以设置它的文本,颜色,背景,大小,对
齐方式等等,在我眼中,它只是几个API的封装。

接下来我们来讨论一下它为什么效率不高,而且刷新时还会闪?

首先,它可以换行,这样就可以知道它不是用TextOut这个API,而是用了DrawText这个API,我
本人也比较喜欢这个API。

其次,它可以设置背景色,可以知道它用了FillRect来填充背景,这是指背景不透明时候。透明
时它是调用SetBKMode来设置透明,此时就不用填充了。

另外,每个Label都可以有不同的字体,颜色等等属性,这样就造就了它的不足。

为什么呢?
正因为上面所说的,它不是真正的控件,所以它所依赖的是所在的父控件,可以是窗体,也可以
是PictureBox。它把这些文字直接绘制到父控件中,所以每次绘制之前,它都要先设置父控件的
字体,字色,背景等等,绘制完毕后还要再还原为原来的属性。所以在移动或者重绘时能明显感
觉到闪烁,如果它没这么多属性也就不会了。
顺便提一下,那个不闪的方法是让系统绘制完毕后再显示,绘制完再显示自然不闪,但是效率嘛
……

********************** 华丽的分割线 **********************

大概说了一下对象,就要说一下在VB中如何创建自己的对象 —— 类 [类模块(Class)]


一个类中最基本的应该算是
Private Sub Class_Initialize()
     '构建
End Sub

Private Sub Class_Terminate()
     '清除
End Sub

要创建属性可以自己写,也可以用类生成器或者工具->添加过程,其他的跟在窗体中写差不多了,
下次再有空再谈谈事件的触发,毕竟VB是事件驱动嘛!

使用类的方法需要两步,定义+初始化.
dim ** as 类名 '这一步只是定义了类,没有初始化的是不能用的,会显示*** with 什么未设置
之类的
set ** = new 类名 '这一步就初始化了,会触发Class_Initialize事件.

之后使用它,只要像控件一样用就行了,所以有些很复杂但是经常用到的,属于一类的就可以写在
类中,这样就是你的对象了.

********************************************************


作者: 3721    时间: 2011-5-14 11:54
【lionking1990 最简单的皮肤:区分焦点和非焦点状态 】

这个贴子中有人提到,皮肤不能随窗体改变而改变,当然,都说了是最简单的
如果想自己研究,也可以参考这编:改进的VB无边框窗体,可调大小,可换皮肤……

本来是想再写一个<最简单的皮肤升级版>,也用最简单的方法来做.
这次可以调节大小,顺便把对象编程用上.
不过想了一想,有些话不能说得太明白,要不做皮肤的人会跟我拼命的...

看过这<最简单的皮肤>编文章的人就应该知道了,做一个皮肤不难,特别是窗体大小固定的时候.
所以不明白为什么网上开源的一些怎么会如此复杂,是不想让人看懂还是什么的目的


作者: 夜色无边    时间: 2011-6-7 11:51
搞不清楚 对象有什么用 。 能出个视频教程吗 ?
作者: lijintai110    时间: 5 天前
谢谢分享谢谢分享




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4