Windows程序设计——第三章《窗口和事件》

本文详细介绍了Windows程序设计中的窗口和事件处理,包括窗口类别的创建、stdcall与cdecl的调用约定、窗口类别的样式、MSG结构、匈牙利命名法、WM_PAINT消息的触发条件以及DrawText API的使用。同时,解释了消息循环和窗口消息处理程序的执行顺序,以及窗口消息处理程序如何处理并发消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.窗口通常是在「窗口类别」的基础上建立的。窗口类别标识了处理窗口消息的窗口消息处理程序。使用窗口类别使多个窗口能够属于同一个窗口类别,并使用同一个窗口消息处理程序。

2.__stdcall:被这些修饰关键字修饰的函数,其参数都是从右向左通过堆栈传递的(__fastcall的前面部分由ecx,edx传),函数调用在返回前要清理堆栈,但由调用者还是被调用者清理不一定。此种调用方式被API使用   __cdecl: C调用约定(即用__cdecl关键字说明)(The C default calling convention)按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于传送参数的内存栈是由调用者来维护的(正因为如此,实现可变参数vararg的函数(如printf)只能使用该调用约定)。(所以在上一章的代码中使用CDECL方式调用,又因为此种调用在C++中默认,故直接定义为空(#define CDECL))

3.窗口类别样式:

#define     CS_VREDRAW               0x0001        

#define     CS_HREDRAW           0x0002        

#define     CS_KEYCVTWINDOW          0x0004        

#define     CS_DBLCLKS           0x0008        

#define     CS_OWNDC             0x0020        

#define     CS_CLASSDC           0x0040        

#define     CS_PARENTDC          0x0080        

#define     CS_NOKEYCVT         0x0100        

#define     CS_NOCLOSE           0x0200        

#define     CS_SAVEBITS          0x0800        

#define     CS_BYTEALIGNCLIENT       0x1000        

#define     CS_BYTEALIGNWINDOW       0x2000        

#define     CS_GLOBALCLASS        0x4000        

#define     CS_IME                0x00010000

4.MSG类别定义: typedef struct tagMSG         {            

HWND   hwnd ;            

UINT   message ;            

WPARAM wParam ;//word            

LPARAM lParam ;//long            

DWORD  time ;  //dword            

POINT  pt ;         }        

MSG, * PMSG ;

5.匈牙利命名法前缀:

前缀  数据型态  

c  char或WCHAR或TCHAR  

by  BYTE (无正负号字符)  

n  short  

i  int  

x, y  int分别用作x坐标和y坐标  

cx, cy  int分别用作x长度和y长度;

C代表「计数器」  

b或f  BOOL (int);

f代表「旗标」  

w  WORD (无正负号短整数)  

 l  LONG (长整数)  

dw  DWORD (无正负号长整数)  

 fn  function(函数)  

s  string(字符串)  

sz  以字节值0结尾的字符串  

h  句柄  

p  指标

6.WM_PAINT产生的时机:窗口内容无效时,分为以下几种情况:窗口新建,CS定义的方式发生(CS_HREDRAW|CS_VREDRAW),最小化后还原,遮挡发生

7.DrawText API中的nCount参数:文档:Specifies the number of characters in the string. If nCount is -1, then the lpString parameter is assumed to be a pointer to a null-terminated string and DrawText computes the character count automatically. 所以该参数指定为-1即可

8.消息循环和窗口消息处理程序不是并发执行的。当一个消息循环从其消息队列中接收一个消息,然后呼叫DispatchMessage将消息发送给窗口消息处理程序时,直到窗口消息处理程序将控制传回给Windows,DispatchMessage才能结束执行。

9.窗口消息处理程序能呼叫给窗口消息处理程序发送另一个消息的函数。这时,窗口消息处理程序必须在函数呼叫传回之前完成对第二个消息的处理。那时窗口消息处理程序将处理最初的消息。例如,当窗口过程调用UpdateWindow时,Windows将呼叫窗口消息处理程序来处理WM_PAINT消息。窗口消息处理程序处理WM_PAINT消息结束以后,UpdateWindow呼叫将把控制传回给窗口消息处理程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值