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

2016-01-29 11:53 14 1 收藏

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

【 tulaoshi.com - C语言心得技巧 】

《Windows 程序设计》学习笔记(四)
作者:i_doit

提交者:eastvc 发布日期:2004-1-2 20:42:21
原文出处:http://www.csdn.net/


第四章 输出文本

需要非常清楚一个概念----窗口的客户区(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;

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)


如何对滚动条进行相应的处理呢?利用SetScrollInfo,GetScrollInfo和ScrollWindow三个函数可以对滚动条进行各种处理,这些函数的意义和使用方法可以参照书中的第三个例子以及MSDN。
值得注意的是:Windows自动处理滚动条的所有鼠标操作,但不处理键盘的操作,这就需要加入相应的代码来支持键盘的操作,在下一章会学到。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)

来源:http://www.tulaoshi.com/n/20160129/1483726.html

延伸阅读
VisualBasic中通信控件及其在windows平台下的通信软件设计方法,并结合具体实例给出了基本的通信程序。 1992年crescentsoftwareinc.公司专为vb设计了mscomm.vbx用户通信控件,它提供了通过串口发送和接收数据的串行通信能力,不但包括了全部windowsapi中关于串行通信的16个函数所完成的功能,而且开拓了更多的使用户设计方便的对...
标签: Web开发
一、使用Ajax的主要原因 1、通过适当的Ajax应用达到更好的用户体验; 2、把以前的一些服务器负担的工作转嫁到客户端,利于客户端闲置的处理能力来处理,减轻服务器和带宽的负担,从而达到节约ISP的空间及带宽租用成本的目的。 二、引用 Ajax这个概念的最早提出者Jesse James Garrett认为: Ajax是Asynchronous JavaScript and XML的缩...
标签: Java JAVA基础
一:理解多线程 多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立。 线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单。 ...
   Java Applet 是用Java 语言编写的一些小应用程序,这些程序是直接嵌入到页面中,由支持Java的浏览器(IE 或 Nescape)解释执行能够产生特殊效果的程序。它可以大大提高Web页面的交互能力和动态执行能力。包含Applet的网页被称为Java-powered页,可以称其为Java支持的网页。 当用户访问这样的网页时,Applet被下载到用户的计算机上...
本节主要介绍Turbo C程序设计的基本步骤及如何编译、调试和运行源程序。并给出Turbo C的常用编辑命令。最后介绍Turbo C编译、连接和运行时的常见错误。 一、Turbo C程序设计基本步骤 程序设计方法包括三个基本步骤: 第一步: 分析问题。 第二步: 画出程序的基本轮廓。 第三步: 实现该程序。 3a. 编写程序 3b. 测试和调试程...

经验教程

921

收藏

86
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部