分享
 
 
 

《Windows 程序设计》学习笔记(四)

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

第四章 输出文本

需要非常清楚一个概念----窗口的客户区(Client Area):整个应用程序窗口中未被标题栏,窗口边框以及可选的菜单栏,工具栏,状态栏和滚动条占据的部分。

在Windows中,我们能在窗口的客户区绘制文本和图形,而当窗口的客户区被变动时,Windows不能保留原来绘制的文本和图形,如果要恢复原来的文本和图形就必须进行重新绘制,这个过程叫刷新。如果当Windows向窗口过程发送WM_PAINT消息,窗口的客户区就需要‘刷新’。

Windows什么时候向窗口过程发送WM_PAINT消息,或者说什么时候窗口的客户区被变动呢?主要是一下几种情况:

1) 在用户移动窗口或显示窗口时,窗口中先前隐藏的区域重新可见;

2) 用户改变窗口的大小。

3) 程序使用ScrollWindow或ScrollDC函数滚动客户区的一部分;

4) 程序使用InvalidateRect或InvalidateRgn函数显式产生WM_PAINT消息

5) 覆盖了部分窗口的对话框或消息框被移开;

6) 菜单下拉出来,然后被释放;

7) 显示工具提示;

8) 鼠标光标在客户区移动;

9) 图标在客户区中托动。

上面的各种情况实际上都是使窗口客户区的全部或一部分原有的文本和图形信息被‘覆盖’,变为‘无效’的窗口客户区,当窗口客户区的全部或一部分‘无效’时,Windows就向窗口过程发送WM_PAINT消息,是窗口‘有效’,再重新绘制窗口。

在窗口的客户区绘制,要使用Windows的图形设备接口(GDI)函数,上一章用到的DrawText就是一个GDI函数,它可以在窗口中绘制相应的一行文字。几乎每个图形设备接口函数都需要设备环境(DC:Device Context)句柄作为参数,DC是一个保存绘制时所需各种属性(比如文本字体,文本颜色,线的粗细等)的数据结构,我们可以用一些GDI函数改变这些属性。

我们只有获得DC的句柄才能在屏幕上绘制文字或图形。获得DC句柄的方法有两个。

一种是在处理WM_PAINT消息时(出现无效矩形(窗口)的情况),使用BeginPaint和EndPaint两个函数:

case WM_PAINT:

HCD hdc;//定义一个DC句柄变量

PAINTSTRUCT ps;

hdc = BeginPaint(hwnd, &ps);使无效窗口变为有效,并获得一个DC句柄

[使用 GDI 函数 ]

EndPaint(hwnd, &ps); 释放DC句柄

在处理WM_PAINT消息必须按上面的方法进行,否则程序将出错!这是因为BeginPaint函数是窗口‘有效’,然后可以绘制窗口。如果没有BeginPaint函数,则窗口还是‘无效’的,Windows将不断向窗口过程发送WM_PAINT消息,有可能造成系统崩溃!

另一种方法可以随时获得一个DC句柄:

DHC hdc;

hdc = GetDC(hwnd); 获得一个DC句柄

[使用GDI函数]

ReleaseDC(hwnd, hdc); 释放DC句柄

现在我们就可以用GDI函数在窗口的客户区绘制文本或图形了,本章举了一个例子:输出文本。

书中的例子运用GetSystemMetrics函数取得用户界面构件大小的信息(比如:屏幕宽度和高度,窗口中标题栏的高度等),并用TextOut这个GDI函数把这些信息按行显示在窗口的客户区中。书中通过三个步骤逐渐的把这个程序的功能扩充加强,最后得到一个比较完美而有意义的程序。这个过程在我们的实际工作中是非常有用的,开发一个软件可以先实现软件的主要功能,然后再根据需要把这个软件的功能逐步扩充,同时也是我们的编程知识和能力不断增加的过程。

滚动条(Scroll Bars)是图形用户界面最好的功能之一,当显示的文本,图形等所需的空间超出了窗口的客户区所能提供的空间,就可以使用滚动条。在应用程序中包含水平或垂直滚动条,只需在CreateWindow函数的第三个参数中包含窗口风格WS_VSCROLL(垂直)或WS_HSCROLL(水平)即可。用鼠标单击滚动条或托动滚动小块时,Windows向窗口过程发送WM_VSCROLL和WM_HSCROLL消息,在消息参数wParam中的低16位字节中保存指示鼠标操作的“通知码”(Notification Code)。通过通知码,我们就可以对鼠标的各种操作进行相应的处理。

....

case WM_VSCROLL:

switch(LOWORD(wParam)) 取得wParam中的低16位字节的值

{

case SB_LINEUP: “通知码”通知我们鼠标让滚动条向上滚动一行

... 相应的处理

case SB_LINEDOWN: “通知码”通知我们鼠标让滚动条向下滚动一行

... 相应的处理

}

return 0;

如何对滚动条进行相应的处理呢?利用SetScrollInfo,GetScrollInfo和ScrollWindow三个函数可以对滚动条进行各种处理,这些函数的意义和使用方法可以参照书中的第三个例子以及MSDN。

值得注意的是:Windows自动处理滚动条的所有鼠标操作,但不处理键盘的操作,这就需要加入相应的代码来支持键盘的操作,在下一章会学到。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有