我们学校(哦,是我住在学校,这个学校是个中专,我就是通过这里的局域网免费上的网:) 有栋楼房要拆了,于是网线要重新拉。所以很长时间没有网上了,不过那些人的办事效率还真是低呀。不过50米的网线,既然改了3次还没有拉好。没有网上了,,就老老实实看书咯,不过对于我这种没有什么动力的人,要我一动不动看上个小时的书,还没有网上,怎么可能呀。只好天天在家单机,在IE的临时目录里面拉了两个FLASH小游戏,就这样玩了7天。。。。。。。怨念呀
算了,把这个星期看的回忆一下发来好了。不过,在写得时候才发现,有些东西在看到后面再回过头来看,就根本没有循序渐进可言了,有些内容在现在看来理所当然的,那时根本没有办法看懂。可能这就是一本好的初学者学习用书和一本需要看上10遍的进阶读物的不同吧。
好了,进入正题。前面基本都是些基础内容,除了消息机制以外,如果学习过一点语言的话,这个都是讲过的内容。而第一个程序也只不过是再合适的地方调用了一个可以说是外部的,和它本身那个窗口没有什么关系的MessageBox而已。那这节的目的就是要学会在Windows下的输出方法了。
----------------------------------------------------------------------------------------
既然是Windows下的编程,自然就不能停留在Printf的方式上了,不过说起来printf的好处就是简单,由于它是基于行的,不用考虑输出的位置。而Windows下,编程是基于像素,输出的位置就要自己考虑了。而最简单的方法就是自己模仿printf,把行转化为像素。
看标题就知道,文字输出最简单的就是TextOut了,他是这么用的:TextOut (hdc, x, y, psText, iLength) ;这个看起来简单,实际上的却很简单。先是设备内容句柄(等会会说到怎么得到它)然后是文字输出的起始位置坐标,接着是字符串还有长度。不过呢,这里的字符串不能包含任何ASCII控制字符(如回车、换行、制表或退格),Windows会将这些控制字符显示为实心块。所有要换行之类的就只能靠自己了。
那么,按顺序,先看如何取得hdc,其实,要得到它有很多办法,不过常见得就2种,其他的不是说没有用,而是现在没有用。。。。。。到时候自然会知道,慢慢来嘛。
方法一:用现成的,说起来这个TextOut就是在画画,画画当然要在WM_PAINT消息里面处理啦,这个在以前用DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;的时候就有说,不过这个DrawText比较麻烦而已,在这个消息处理函数里面不是就有hdc了嘛!
//InvalidateRect (hWnd, NULL, TRUE) ; //加入了这个函数之后,所有的区域都会被画刷改变,也就是说,所有内容会在BeginPaint的时候被背景清除
hdc = BeginPaint(hWnd, &ps);
//TODO: 在此添加任意绘图代码:
MessageBox(NULL,TEXT ("我重绘窗口了!"),TEXT ("Hei here"), 0); //MessageBox函数应该会CUT程序运行.....这样就可以看到那些字被擦除了
/*开始的时候绘制,大小改变的时候绘制,甚至有东西覆盖也要重新绘制。运行一下就知道了。*/
EndPaint(hWnd, &ps);
break;
hdc=BeginPaint(hWnd,&ps);就是在取得hdc句柄,所以在EndPaint之前的绘图代码都是可以直接使用的。
方法二:自己拿!不过呢,如果不是在这个消息中使用,就要用这个方法了。后面也会被用到的。
//加入绘图代码
ReleaseDC(hWnd,hdc);
不过这个的区别是,它不会将已经改变的区域设为无效区域(后面说),也就是说如果不手动更新他是不会画出来的。所以你要呼叫这个函数让它更新:
如果仔细观察就会发现,这两个都是有始有终的,最后都会(而且是必须)释放这个句柄。至于为什么,我也不知道。。。。。
好了,先实践一下吧,因为用第一种方法比较简单,所以就用这个了。在//TODO后面加上TextOut(hdc,0,0,TEXT("Hello XP"),8);哦,最后一个长度就是字符的个数,这个是我数出来的。运行一下,是不是很有成就感能?!
当然也可以用第二种方法试试,不过不能在WM_PAINT里面,会有各种各样的问题的。