先说明,以后不特别说明,程序都是用VB.NET 2005写.....学VB 或C#的看起来应该不费劲...
很久没写了......一直在学习托管D3D,写一个3D分子模型编辑器写了好几个月还没完工,幸亏是自己做着用的...准备再重新写1遍,估计就成型了....放假放的时间也不少,,,不过没干什么,,,,主要是陪老婆,,有空在联众上玩游戏,,,平台上干CS,,,,,,玩联众的时候发现有一个方向的东西也应该学一点...就是2D图象识别再把基本的平面几何计算用.NET按自己的想法实现出来....于是抓住一个最最最最最简单的:台球游戏.......
下面几篇先写写关于这个台球瞄准的问题,刚想做的时候以为有多简单呢,没想到哇,实际上也很简单...嘎嘎..........写完以后把学D3D时学的东西逐渐复习逐渐写出来,,,希望能给初学者一些帮助,,,少走弯路多体会编程的乐趣.
先简单认识一下.NET里面几个和图形处理有关的对象,个人认为比较关键..
画布对象:这个,怎么说呢,就是一个画布,可以是内存画布也可以是显示器上显示的画布....描述可能不确切
BITMAP对象:这个,从显示的角度看是一个"实体"
IMAGE对象:这个对象和BITMAP对象没有什么大的区别
PICTUREBOX控件:这个,可以用来创建画布,有一个IMAGE属性,,,是一个"集合体"
介绍一下他们的特点:
[画布对象]
通常用这个对象的FROM*****(OBJ)方法来创建一个实例,该实例就关联到OBJ对象,例如,通过PICBOX的句柄创建,那么你调用GR.DRAW******方法时,就可以直接在PICBOX上显示相应的东西,但是只是显示,,,,,,,,当被挡上或刷新PICBOX时就消失了,不过效率非常好
[BMP]
通常来说,这个家伙就是内存中的图象了,支持的格式好象不少.......也有多个FROM*****方法,不过这里有一个非常有用的共享方法,用来代替BITBLT实现从屏幕到内存的图象传输:屏幕图象块传输方法,使用方法和那个API一样,但是呢,这个是直接传到内存了,可以用SAVE方法直接保存.如果画布对象创建在BMP上,那么调用DRAW方法时,将改变内存数据.....
[PICBOX]的基本用途
1.可以创建一个GR对象,然后在上面画东西,速度非常快,想重绘制时,只需要调用刷新方法即可.
2.可以将IMAGE属性关联到(按址引用)一个BMP对象,这样就可以得到一个持久图象,
最后明确两个问题:
当需要在PICBOX上绘制持久图象时,有多条途径,一般可以首先创建一个画布对象-GRP,而后在GRP上绘制图,绘图后,调用刷新方法,这时被改变的BMP对象将被显示到"表面"
在台球程序中,我们为了实现实时显示瞄准线,采用这样的方法:
获取台球子窗体句柄,利用这个句柄获取台面信息并创建一个画布GS
1、创建一个BMP对象,调用屏幕块传输方法,获取台布图象,此时图象位于内存(BMP对象)中
2、创建一个新的BMP对象,作为前面图象的副本,这里涉及到效率问题,我们从前面的BMP中创建,而不是再传输
3、在副本上绘制线段,并将副本绘制到GS(使用DRAWIMAGE方法)。
当鼠标移动时重复2、3两个步骤
这就是基本的思路,存在一些不影响最终使用的问题,但实现了我们的想法。为了实现不移动鼠标时线段的持久显示以及提高显示速率减少闪动,我们启动一个新线程,这里涉及到一个线程锁和效率的问题,很简单;为了使操作最简化——达到鼠标点一下就显示全部线段的目的,采用鼠标钩子引发事件的事件驱动模式;关于具体的细节和效率问题逐渐解释。
希望这个系列的程序能对初学图形处理的有帮助,能起到抛砖引玉的作用。