对于WINDOWS程序的内部运行机制,主要学习知识点如下。
1.MSDN 的全称是 Microsoft Developer Network。这是微软公司面向软件开发者的一种信息服务。MSDN 实际上是一个以 Visual Studio 和 Windows 平台为核心整合的开发虚拟社区,包括技术文档、在线电子教程、网络虚拟实验室、微软产品下载(几乎全部的操作系统、服务器程序、应用程序和开发程序的正式版和测试版,还包括各种驱动程序开发包和软件开发包)、Blog、BBS、MSDN WebCast、与 CMP 合作的 MSDN 杂志等等一系列服务。
用户接触到的最多关于 MSDN 的信息可能是来自于 MSDN Library。MSDN Library 就是通常人们眼中的 MSDN,涵盖了微软全套可开发产品线的技术开发文档和科技文献(部分包括源代码),也包括过刊的 MSDN 杂志节选和部分经典书籍的节选章节。MSDN Library 有 1.8 GB 左右。
2.MSG结构是操作系统通过消息机制将感知到事件传递给应用程序的,操作系统将每个事件都包装成一个称为消息的结构体MSG来传递给应用程序.
typedef struct tagMSG {
HWND hwnd; //这个消息所在的窗口句柄
UINT message; //消息标识符,如WM_SIZE、WM_COMMAND、WM_QUIT等等
WPARAM wParam; //32位消息的特定附加信息
LPARAM lParam; // 32位消息的特定附加信息
DWORD time; // /消息创建时的时间
POINT pt; //消息创建时的鼠标位置
} MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;
3.WinMain是一个函数,该函数的功能是被系统调用,作为一个32位应用程序的入口点。WinMain函数应初始化应用程序,显示主窗口,进入一个消息接收一发送循环,这个循环是应用程序执行的其余部分的顶级控制结构。
int WINAPI WinMain(HINSTANCE hInstance, //程序当前实例的句柄,以后随时可以用GetModuleHandle(0)来获得
HINSTANCE hPrevInstance, //这个参数在Win32环境下总是0,已经废弃不用了
char * lpCmdLine, //指向以/0结尾的命令行,不包括EXE本身的文件名,
//以后随时可以用GetCommandLine()来获取完整的命令行
int nCmdShow //指明应该以什么方式显示主窗口
);
4.WNDCLASS是一个由系统支持的结构,用来储存某一类窗口的信息,如ClassStyle,消息处理函数,Icon,Cursor,背景Brush等。也就是说,CreateWindow只是将某个WNDCLASS定义的窗体变成实例。
5.在注册完窗口类后就需要进行窗口的创建,用到的函数理所当然就是CreateWindow(), 而这个函数是基于窗口类的,所以还需要指定几个参数来制定特定的窗口。
API 函数原型:
HWND WINAPI CreateWindow(
_In_opt_ LPCTSTR lpClassName, // 窗口类名称
_In_opt_ LPCTSTR lpWindowName, // 窗口标题
_In_ DWORD dwStyle, // 窗口风格,或称窗口格式
_In_ int x, // 初始 x 坐标
_In_ int y, // 初始 y 坐标
_In_ int nWidth, // 初始 x 方向尺寸
_In_ int nHeight, // 初始 y 方向尺寸
_In_opt_ HWND hWndParent, // 父窗口句柄
_In_opt_ HMENU hMenu, // 窗口菜单句柄
_In_opt_ HINSTANCE hInstance, // 程序实例句柄
_In_opt_ LPVOID lpParam // 创建参数
);
注:_In_ 说明该参数是输入的,_opt_ 说明该参数是可选参数(不是说没有参数,而是可以利用宏搭配参数)。
返回值: 如果函数成功,返回值为新窗口的句柄。 如果函数失败,返回值为 NULL。
6.函数GetMessage 是 从调用线程的消息队列里取得一个消息并将其放于指定的结构。此函数可取得与指定窗口联系的消息和由PostThreadMesssge寄送的线程消息。此函数接收一定范围的消息值。GetMessage不接收属于其他线程或应用程序的消息。获取消息成功后,线程将从消息队列中删除该消息。函数会一直等待直到有消息到来才有返回值。
BOOL GetMessage(
LPMSG lpMsg, // address of structure with message
HWND hWnd, // handle of window
UINT wMsgFilterMin, // first message
UINT wMsgFilterMax // last message
);
GetMessage函数接收到除WM_QUIT外的消息均返回非零值。对于WM_QUIT消息,该函数返回零。如果出现了错误,该函数返回-1,例如,当参数hWnd是无效的窗口句柄或lpMsg是无效的指针时。
7.WindowProc是一个应用程序定义的函数。它处理发送给窗口的消息。WINDPROC类型定义了一个指向该回调函数的指针。WindowProc是用于应用程序定义函数的占位符。
8.Win32asm源程序风格采用匈牙利表示法,是由Microsoft公司的程序设计人员Charles Simonyi首创的。在匈牙利表示法中,变量名以一个或多个小写字母开始,代表变量的类型。后面附以变量的名字,变量名以意义明确的大小写混合字母序列所构成。这种方案允许每个变量都附有表征变量类型的信息。如:WORD wParam1;LONG lParam2;HANDLE hInstance。其优点:通过给每个变量名加上表示所属数据类型的前缀,从而在编译前即可防止许多常见的错误。
前缀 | 隐含的数据类型 | 说明 |
b
|
BOOL | 实际为整型 |
by | BYTE | 无符号字符 |
c | char | 字符 |
dw | DWORD | 无符号长型 |
fn | function | 函数 |
h | HANDLE | 无符号整型 |
i | integer | 整数 |
l | LONG | 长型 |
lp | Long pointer | 远指针 |
n | Short(integer) | 整型 |
np | Near pointer | 近指针 |
p | pointer | 指针 |
s
|
string | 字符串 |
sz | Zero terminated string | 以0结尾的字符串 |
w | WORD | 整数或字 |
x,y | short | X坐标和y坐标 |
cx,cy | short | x方向长和y方向长,c代表count(量度) |