VB鼠标绘图基础资料总结
鉴于上半年编写过鼠标绘图的程序,在此将以前搜集的资料总结一下,给那些以前和我一样到处搜索的VB爱好者们一点方便,同时欢迎交流和指正。
这里我尽量写的罗嗦又罗嗦一些,希望大家不要怪我。因为我们很多的资料都是理论性太强了,实用性或者说教人怎么用,太弱了。我希望能够罗嗦明白一点。
我也是一个VB刚刚入门的人,把有限的经验写出来和大家分享。
前言
鼠标绘图可以说是每一个VB编程者都想必定要尝试和锻炼的一个项目。学会了鼠标绘图,你就学会了Windows的鼠标操作,屏幕模映射模式,绘图模式,Windows的GDI(图形设备接口)。
你会知道,计算机的设备都是有限的,也就是说资源是有限的,这里的资源,就是说的内存,计算机屏幕,鼠标还有键盘,还有一些GDI对象,比如说画笔,画刷,调色板。
有些资源,你用了别人(这里说的是别的应用程序)就不能够用,比如说你的应用程序捕捉了鼠标(至于为什么要捕捉鼠标,后面再说),却不释放鼠标,这样别人的应用程序就得不到鼠标消息(不懂Windows消息机制的人应该稍微学习一下Windows的消息,和消息响应机制。鼠标绘图不就是Windows把消息传给我们的程序,然后有我们的程序处理么。。。)了,别人的应用程序就没有办法用鼠标操作了。所以独占系统资源的应用程序,应该是一个程序员竭力避免的。也是操作系统不允许的。操作系统就是一个调剂应用程序的大程序,也是一个管理硬件,分配资源的底层程序,它的级别比你的程序的级别高,所以它能够管你的应用程序。你要使用系统资源,就必须向操作系统请求,得到分配之后,你才可以使用。
鼠标绘图,就是在一个画布(你的应用程序的客户区),上使用鼠标画画。画出来的是矢量模式的图形,你也可以转换为栅格模式的图像。这里,你要理解的是:什么是客户区,相信很多人编程序很久了,都不知道什么是客户区。什么是矢量模式的图形,什么又是栅格模式的图像,等等相关问题。
VB编程有一个好处,就是起点高,不像VC那样什么都要你自己弄,一点东西不会,你就会卡得死死的。控件拖放是多么的惬意啊,每一个程序员都应该站在别人的肩膀上,写自己的程序。
我在写程序的过程中,就是在别人的程序基础上,通过改进或者修改,运用综合和分析的基本思想,编自己的程序。这就叫做“拿来主义”。当然,同样作为一个程序员,在使用了别人的东西之后,要对别人保有基本的尊重,比如保留别人的版权声明(如果有的话,或者你知道的话);发邮件给他本人,告诉他你用了他的东西,向他请教问题;在程序的关于对话框中,对无偿或者有偿提供了各种帮助的人,表示感谢;同时也声明自己的版权,保留权利,提出警告等等。
下面,我就把自己以前收集的关于鼠标绘图的资料进行一个汇总,并把自己在编程序的过程中得到的经验总结一下。
首先,给大家一个目录索引。
1、界面制作
2、鼠标功能和操作
3、客户区,窗口,屏幕
4、滚动绘图区
5、屏幕映射模式,绘图模式
、橡皮筋框的原理
、GDI和绘图函数
、画笔,画刷,填充模式
、绘图步骤
、绘图结果的保存
、结语
界面制作
界面的制作永远令人心烦,你有可能用一天就写完了你的代码,但是你的界面你可能会消耗你一个星期的时间。所以这里我提了一下界面制作的问题。同样,制作好的界面,可以在别人的基础上做,也可以自己做(如果你有时间和耐性的话)。由于制作界面不是一篇文字能够说明的,所以这里我提供自己的界面给大家。很简单,不要见笑。同时也提供源代码,不要给我发邮件,因为我可能没有时间回复你要源代码的要求。请登陆我的邮箱:@.com,密码是:。登陆之后进入送件箱,在邮件地址中写下你自己的邮箱,转发到你自己的邮箱即可。不过拜托你不要修改密码,毕竟不是你一个人要用的。
我的界面如下图:
鼠标功能和操作
鼠标一般有两个键,中键滚轮可以不考虑,因为在鼠标绘图过程中几乎不用。
正是由于有两个键,所以就要动动脑子,想想怎样把它们全部派上用场。在程序里,我们使用取色工具的时候,就用左键点击取得前景色,右键点击取得背景色,很好的利用了这两个键。
它的功能就是点击,拖拉,移动。
你点击,可能是要画点,点多大,就看你的画笔,画刷的大小了。拖拉,一般用于画直线,矩形,和椭圆之类。你移动它,是要改变你绘图的位置,绘制图形的大小或者使用鼠标随意绘图。
鼠标的的操作当然是看使用者的意图了,点击可能是要选择,要绘图,拖拉可能就是要选择范围,绘制图形;移动就是你要干点别的。所以你在使用的过程中,当然不希望你的鼠标不听你的话,你要点的时候,就是什么也点不出来,你松开了鼠标,但是程序却还在绘图(只要你移动鼠标的话)。所以我们要在应用程序中完全控制自己的鼠标,按自己的意愿工作,就得判断鼠标的状态,是按下了,哪个键按下了,有没有移动,松开了没有,等等,对这些情况,然后正确响应鼠标消息。不过由于绘图有很多工具,所以我们要设置一些变量来标志我们正在使用的工具,从而在响应鼠标的各种消息时,根据工具的不同,绘出不同的效果来。比如画点,喷枪效果,取色工具,填充工具,选择工具等等。
之所以谈谈鼠标操作,是因为每一次绘图都是按照一定的步骤进行的,每个步骤响应的消息也不一样。在我的程序中,我觉得应该是在鼠标按下的状态下进行绘图操作。对于画直线,就有三个步骤。第一步,先单击(响应鼠标按下,松开的消息)确定一个起点,第二步移动到目的位置(响应鼠标移动的消息),第三步单击确定终点(响应鼠标按下,松开的消息)。可见,单单这样一个简单的绘直线操作中,就对鼠标的几种消息都有响应。所以我们在选中了每一个绘图工具之后,都应该详细考虑在每一个步骤中如何响应鼠标的三个基本消息(按下,移动,松开),这可是个比较重要的问题。
鼠标光标的问题:相信有些人还是有疑惑的,所以这里罗嗦一下。如果你想在你的窗口的某个控件上使用不同于Windows的默认光标,请这样做:把这个控件的MousePointer=vbCustom(它的值为99,表示是用户自定义的,所以你也可以在程序中使用MousePointer=99),然后再把MouseIcon的Icon改为你自定义的光标文件(点旁边的"Icon..."按钮,然后选择一个光标文件)。当然你也可以响应此控件的MouseMove消息来改变:
MousePointer=vbCustom
MouseIcon=LoadPicture("cursor.cur")
同时不要忘记在Form的MouseMove消息中改回来,只要这一句就够了:MousePointer=vbDefault,不然的话,你的Form上面就老是只有你自己定义的光标了。
题外话:如果你有四个鼠标的话,你怎么响应你的鼠标消息,Windows需要你自己响应吗?(个人认为不会,不过可能需要互斥的处理每个鼠标的消息)说不定有一天,你可能会和别人(或许是你的Lover)一起画画呢,那样就不用抢鼠标了。。。
客户区,窗口,屏幕
在VB程序中,一般使用PictureBox控件来做绘图区。由于有工具条,状态栏等控件还有绘图工具箱,颜料盒的存在,PictureBox一般不会占满所有的客户区。
就我个人的理解,客户区就是用户可以自由使用的窗口部分。也就是除了标题栏,菜单,滚动条,边框,工具条,状态栏之外的区域。之所以除了这些区域,是因为你在绘图程序中怎么绘图,Windows也不会让你把图形画到这些窗口部分的上面的。文字处理程序也是这样的。因为这些范围不属于用户可以自由操作的区域,所以除了这些区域之外的窗口部分,就叫做客户区。有时候,客户区还可能包括工具条,和状态栏占用的那部分区域,这是因为一般的程序中工具条和状态栏占用的区域,会由于二者的隐藏而重新给用户使用,所以我觉得客户区应该包括工具条和状态栏占用的那部分窗口,因为这些是可以给用户自由使用的,毕竟没有工具条和状态栏,我们也照样使用程序,而且绘图的区域更大一点。
理解了客户区,窗口的理解就很容易了,就是你的应用程序占用屏幕的那一部分,你的窗口中的任何内容都不会绘制到别的应用程序的窗口中去。别人的也不会绘制到你的窗口中去。也就是说你在你的应用程序的窗口中看不到别的应用程序的窗口中的内容。
至于屏幕,这个就不用解释了吧,你只用一个屏幕(显示器的显示部分),你肯定不可能看到屏幕之外的东西吧。不过你要是有两个显示器的话,你把窗口移动到屏幕边缘,你会在另一个屏幕中看到在这一个屏幕中看不到的那部分窗口。你要是有三个屏幕的话,hoho,那就爽死了!!!罗嗦了这么多,宗旨就是,系统资源是有限的,每个窗口会占用一部分屏幕,客户区和每个控件(可见的)也会占用一部分窗口。