第二章:WIN32窗体程序设计 ITjob就业培训
第二章:WIN32 窗体程序设计
学习目标
? Win32编程中需要掌握的一些重要概念 ? 详解Win32程序
? 理解Win32程序的消息机制 ? Win32程序对鼠标和键盘的控制
1
第二章:WIN32窗体程序设计 ITjob就业培训
Win32编程中需要掌握的一些重要概念
学习windows编程是一个比较难的过程,主要的障碍是因为windows程序中很多新的东西,我们一下子不能适应,下面我们就来扫清这些障碍: ? 我们在上一章中看到了一个简单的windows程序,大家会发现windows
程序中有很多全大写定义的东西,这就是我们的障碍之一,因为,太多的东西我们以前没有见过,windows程序中全大写的东西可以分为这样三种:
第一种是:windows定义的变量 比如这句:
LRESULT CALLBACK WinProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
这是一个方法的定义,这和我们以前的程序就有太多的不同。下面的列表是从相应windows的头文件中摘下来的,看完这个后,你是否可以理解上面这句话的意思。
#define FAR far #define NEAR near #define CONST const #define CALLBACK __stdcall #define WINAPI
__stdcall
__cdecl
#define WINAPIV
#define APIENTRY WINAPI #define APIPRIVATE __stdcall #define PASCAL
typedef unsigned long DWORD; typedef int BOOL; typedef unsigned char BYTE;
__stdcall
2
第二章:WIN32窗体程序设计 ITjob就业培训
typedef unsigned short WORD; typedef float FLOAT; typedef FLOAT *PFLOAT; typedef BOOL near *PBOOL; typedef BOOL far *LPBOOL; typedef BYTE near *PBYTE; typedef BYTE far *LPBYTE; typedef int near *PINT; typedef int far *LPINT; typedef WORD near *PWORD; typedef WORD far *LPWORD; typedef long far *LPLONG; typedef DWORD near *PDWORD; typedef DWORD far *LPDWORD; typedef void far *LPVOID; typedef CONST void far *LPCVOID;
typedef int INT; typedef unsigned int UINT; typedef unsigned int *PUINT;
typedef UINT typedef LONG typedef LONG
其实,windows程序把很多变量进行了重新定义,还记得typedef这个类型定义关键字吧!其实上面的UINT、WPARAM、LPARAM,其实都是unsigned int(无符号整数),其实HWND也是无符号整数,后面我们详细介绍HWND,
WPARAM; LPARAM; LRESULT;
3
第二章:WIN32窗体程序设计 ITjob就业培训
今后,如果大家见到了一个类型是全大写的,那么它一定是在windows的头文件中重新定义了。
还有就是:LRESULT CALLBACK,从上面的表中,大家可以看到他们是返回类型和宏定义,其中,LRESULT是long,而CALLBACK是函数的调用方式__stdcall。
第二种是windows的宏定义:
在前面,大家看到了__stdcall是一个宏定义,在windows程序中有大量的宏定义,宏定义用于这样几个地方:
? 常量
所有的消息都是常量,比如前面看到的 WM_KEYDOWN、WM_PAINT等,所有的键盘标识,如VK_ESCAPE,还有就是我们在函数调用中用到的 一些参数:如WS_OVERLAPPEDWINDOW, WHITE_BRUSH、IDI_APPLICATION等都是常量
? 简单函数用宏 如:
#define MAKEWORD(a, b)
((WORD)(((BYTE)(a)) | ((WORD)((BYTE)(b))) << 8)) #define MAKELONG(a,b)
((LONG)(((WORD)(a)) | ((DWORD)((WORD)(b))) << 16)) #define LOWORD(l) ((WORD)(l))
#define HIWORD(l) ((WORD)(((DWORD)(l) >> 16) & 0xFFFF)) #define LOBYTE(w) ((BYTE)(w))
#define HIBYTE(w) ((BYTE)(((WORD)(w) >> 8) & 0xFF)) 以上的都是简单的函数,如LOWORD是表示取一个DWORD(32位整数)的低16位,而HIWORD取高16位
? 程序结构中用到宏,今后,我们要学习的消息映射中的
4
第二章:WIN32窗体程序设计 ITjob就业培训
BEGIN_MESSAGE_MAP、DECLARE_MESSAGE_MAP等就是在程序结构中用到的宏。
第三中是windows中的结构:
windows程序中大量使用结构,对这些结构的掌握程度,可以作为衡量一个程序员对windows程序的熟悉程度,windows程序的结构难,而且结构 中的成员非常多,是我们学习的难点。在上一章的程序中,我们看到的结构有:WNDCLASS、MSG等,学习中,大家应该掌握这些常用结构的常用成员的用法,我们来看看这两个结构 typedef struct tagWNDCLASSA {
UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCSTR lpszMenuName; LPCSTR lpszClassName;
} WNDCLASSA;
typedef struct tagMSG {
HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time;
5