1.在Windows里定义数据类型的一些标准前缀
前缀 | 数据类型 |
c | 字符(char) |
cb | 用于定义对象(一般为一个结构)尺寸的整数 |
s | 短整数(short) |
n | 整数(integer) |
sz | 以’/ 0’ 结尾的字符串 |
b | 字节 |
i | int(整数) |
x | 短整数(坐标x) |
y | 短整数(坐标y) |
f | bool |
w | 字(WORD,无符号短整数) |
l | 长整数(LONG) |
h | HANDLE(无符号int)(UINT) |
m_ | 类成员变量 |
fn | 函数(function) |
dw | 双字(DWORD,无符号长整数) |
2.Windows程序采用Pascal的调用规则,当参数传递给过程时,它们被从左到右依次压入栈中,因为这种方式更快一些。传统的C程序则使用相反的顺序(从右至左)。
3 . Windows 是一个面向消息或事件的环境,这是什么意思?在DOS环境中,用户直接与程序通信。但是在Windows环境中用户的行为首先被操作系统获取,然后以消息或事件的方式传给应用。这个Windows系统给了Windows应用某种自主和独立性(在DOS环境中完全不具备)。
4.BeginPaint和GetDC获取设备描述表,应用场合的不同:
在WM_PAINT消息处理函数中,要使用BeginPaint来获取设备描述表。而不要使用GetDC,这样可能会引起一些不可预料的问题,比如:当你的窗口从别的窗口下面调到桌面最上层时,或者你的窗口需要重绘时,窗口可能不能正常恢复。
当你不是在处理WM_PAINT消息,但要访问设备描述表时要使用GetDC
5.确定字符串长度的方法:
C语言中可以用内部函数 strrlen
Windows有自己的库函数 lstrlen。用法:lstrlen(String)
6.分析函数:
GetClientRect(hwnd,&Rect);
DrawText(PaintDC,”Show Text”,-1,&Rect,DT_CENTER);
DrawText中的RECT参数Rect指定了显示字符串的区域,在这个例程中,使用了GetClientRect函数来取得整个客户区。
第五天 鼠标和键盘
1. WM_CHAR和WM_KEYDOWN消息之间的区别:
要用WM_CHAR消息来读取字母数字键,不要用它来检测用户是否按下了功能键或方向键。
要用WM_KEYDOWN消息来确定是否按下了功能键或方向键,不要用它来读取字母数字键。
每当一个键被按下的时候,都会发送一条WM_KEYDOWN消息,然而当这条消息被送往窗口过程的时候,Windows还没有翻译被按下的键。因此不能确切的知道到底按下了那个键。WM_CHAR消息是能够确切的找出用户按下了哪个字母数字键的最理想的方法。
2.在Windows环境中,系统键是Alt。当你按下了Alt键,你便按下了系统键。
3.大多数消息都有两个宏与之相关,第一个宏被称为消息处理函数(WM_XXX),第二个宏的形式为:FORWARD_WM_XXX,其目的是:将消息返还给缺省的窗口过程。
要从一个消息处理函数中把消息继续传递给DefWndProc,就要使用FORWARD_WM_XXX宏。如下面处理系统键消息的响应函数:KeyMouse_OnSysKey(HWND hwnd,UINT vk,BOOL fDown,int cRepeat,UINT flags)中,
if(fDown)
{ ……
FORQWARD_WM_SYSKEYDOWN(hwnd,vk,cRepeat,flags,KeyMouse_DefProc);
}else{……}
第11天 各种控制通信,使用EnumFontFamilies回调函数
1.SendMessage 和PostMessage
二者看起来很相似,其最基本的目的是通知一个指定的窗口去完成一项工作。但实际上它们是不同的。
如果时间是关键因素,也就是说你要确保在SendMessage函数结束之前消息已被处理,要使用SendMessage函数。要记住,直到消息处理完毕以后,SendMessage函数才返回。 如果可以推迟消息的处理,可以使用PostMessage函数。它把消息放入消息队列。
SendMessage将消息直接传递给适当的窗口过程,而PostMessage将消息放入应用的消息队列,因此,PostMessage比SendMessage慢一些。
2.回调函数
回调函数是由Windows直接调用的函数,而不是由你的应用程序中的其他例程调用的,通常你需要用MakeProcInstance函数把回调函数的地址传给Windows,以保证该回调函数能访问你的程序中的数据。
3.每一个控制都有两类常数与之相关,一类帮助你定义它的风格和它的表现形式,这一类常数通常在CreateWindow函数中使用。第二类帮助你与控制通信,这些常数通常在SendMessage和PostMessage函数中使用。
以列表框(ListBox)为例,在你设计对话框时可以给CreateWindow函数传递列表框风格(LBS,LBStyle),如LBS_STANDARD或LBS_MULTIPLSEL。然而当你欲与列表框通信时,应使用本章所列出的列表框消息(LB):LB_GETSEL,LB_GETTEXT,LB_SETSEL。
第14天 窗口风格
1. GetClientRect和GetWindowRect函数之间的区别是什么?
GetClientRect函数获取用窗口左上方的坐标表示的一个窗口的尺寸,其左上方的坐标总是表示为(0,0)。
GetWindowRect查询用窗口左上角表示的窗口位置,窗口左上角用其相对于整个屏幕的位置表示。
2. WS_OVERLAPPEDWINDOW风格的作用是什么?
用于定义一个标准窗口,这个窗口有一个边框、一个标题栏、一个系统菜单以及最小化和最大化框。
第15天 对话框与映像模式
1. 映像模式:
是定义设备单位与逻辑单位之间的关系,以及x轴和y轴的方向。例如,缺省时使用MM_TEXT映像模式,其约定内容是,窗口中的每个计量单位,等于一个像素。
2. 逻辑坐标系统:
监视器上的物理坐标系统总是以像素为计量单位的,它们是屏幕上实有的物理存在。
由于屏幕上的像素数目是可变的,程序员有时不想使用MM_TEXT坐标系统,而想使用一种更稳定的计量单位,为此,Windows提供了几种逻辑坐标系统。
Windows逻辑坐标系统不使用像素,而以英寸、厘米和缇来计量屏幕。缇是用来计量字体的单位。1缇 = 1/ 20 磅 , 1 磅 = 1/72英寸,1缇 = 1/20 * 1/72 = 1/1440英寸。
3.映像模式的设置
通过修改映射模式和显示原点,可以改变坐标系统。Windows应用程序可通过调用SetMapMode函数来设定映射模式,通过调用SetViewPortOrg函数,可以把坐标系统原点移到任何位置。默认的映射模式为MM_TEXT,即默认的坐标系统。当前设备描述表的映射方式可通过调用GetMapMode函数得到。
① SetMapMode函数
int SetMapMode(HDC hdc,int nMapMode);
说明:参数nMapMode是映射模式。映射共有8种映射模式,取值及含义如下
② GetMapMode函数
DWORD GetMapMode (HDC hDC)
映像模式
值 | 含义 |
MM_ANISOTROPIC | 逻辑单位被映射成任意的物理单位, X轴和Y轴成任意比例 |
MM_HIENGLISH | 一个逻辑单位被映射成 0.001 英寸 , 正X向右,正Y向上 |
MM_HIMETRIC | 一个逻辑单位被映射成 0.01 英寸 , 正X向右,正Y向上 |
MM_ISOTROPIC | 逻辑单位被映射成任意的物理单位,X轴和Y轴的变换变换比例相同 |
MM_LOENGLISH | 一个逻辑单位被映射成 0.01 英寸 , 正X向右,正Y向上 |
MM_LOMETRIC | 一个逻辑单位被映射成 0.1 毫米 , 正X向右,正Y向上 |
MM_TEXT | 一个逻辑单位被映射成一个设备像素, 正X向右,正Y向下 |
MM_TWIPS | 一个逻辑单位被映射成打印机点的1/20,正X向右,正Y向上 |
4.设置设备坐标系统原点:
Windows坐标原点可以在屏幕上任意地方移动。使用SetViewportOrg函数。
③ SetViewPortOrg函数
DWORD SetViewPortOrg(HDC hDC,int x,int y)
下列一组命令把原点移到屏幕中心。
GetClientRect(hwnd, &Rect);
SetViewportOrg(PaintDC, Rect.right/2, Rect.bottom/2);
设置逻辑坐标系统原点:
③ SetWindowOrg函数
DWORD SetViewPortOrg(HDC hDC,int x,int y)