现在我们要学的是Windows32的编程,与DOS不同的是,实现的目标是一个具有你所需要的功能的“窗口”。这个“窗口”时时刻刻都在与操作系统之间,通过一个称之为“消息队列”的东西传送数据。因此处理好各种消息便成了Win32编程的核心。
SDK编程是相对于MFC来说的,也就是用C和C++来调用WindowsAPI,这API是操作系统的东西,其他语言(如VB)也可以调用。因此,以前也有人将这种编程称为API编程。当然,这儿对C或C++进行了一些扩展,所谓扩展,就是增加了许多宏定义、模板,让你看了之后大吃一惊,真不知“何方神圣”倒底有何神通。
如果你C或C++还不会的话,请先学习C语言和C++语言,否则,你再刻苦也等于看电影,也许你看懂了但你肯定不会演电影。学习窗口编程之前,你要知道几个概念。
WinMain()函数是窗口程序的入口函数,在这个函数中你就可以调用各种API函数来完成你的目标。①一般是先调用RegisterClassEx()函数用当前窗口句柄去向操作系统申请(或称登录)将要创建一个什么样的窗口,申请成功后,②再调用CreateWindowEx()函数创建一个窗口对象,这仅仅是一个外观,③还要调用ShowWindow()函数设置初期表示,即最大或最小或普通等。④最后还要调用UpdateWindow()函数向窗口传送WM_PAINT消息来画出窗口里面的内容。
窗口创建完后,这是一个“静止”的窗口,⑤因此还要在WinMain()函数的最后添加消息循环,最后才return。WinMain()函数完了之后,⑥还要再编写一个“窗口消息处理”函数。上面讲了一大堆API函数的调用也许有点昏头,但那些全是固定的,基本上不要编程。在你理解之后,只要修改少量参数便可,真正要编程的是这个“窗口消息处理”函数。
下面我们从简单入手,先不创建窗口,而只是调用一下通用对话框。主要是了解WinMain()函数。
![]()
#include
<windows.h>int
APIENTRY WinMain(HINSTANCE hInstance, //当前窗口实例句柄 HINSTANCE hPrevInstance, //前一个实例句柄,Win32下为NULL LPSTR lpCmdLine, //命令行参数字符int
nCmdShow //窗口的显示方式 ) { MessageBox(NULL,"劝学网欢迎您!", "http://www.quanxue.cn/", MB_OK); //通用对话框return
0; //函数返回值 }
初学者不明白的地方还很多,但大都可以就这样先用,以后慢慢理解,小雅当初问了很多“高手”,答案却让我更不明白,只好“慢慢理解”。这样拖了几年,现在小雅就一一解说,如有不对,上论坛指摘2句。
下面是生成一个窗口的最基本的程序,也是后面要介绍的内容,大家看了之后能找到上面讲的①-⑥,那就OK了。
![]()
#include
<windows.h> TCHAR szTitle[32]="小雅的劝学网"; //窗口的标题 TCHAR szWindowClass[32]="Simple"; //窗口的名称 ATOM MyRegisterClass(HINSTANCE); BOOL InitInstance(HINSTANCE,int
); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int
APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int
nCmdShow) { MSG msg; MyRegisterClass(hInstance); //注册窗口类if
(!InitInstance (hInstance, nCmdShow)) //初始化窗口 {return
FALSE; }while
(GetMessage(&msg, NULL, 0, 0)) //消息循环 { TranslateMessage(&msg); //消息解释 DispatchMessage(&msg); //消息发送 } //注意:不能用“return 0;”,因为有非正常退出的可能性return
(int
)msg.wParam; } //注册窗口类 ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wc; //定义一个窗口类,其实是一个结构体 wc.cbSize =sizeof
(WNDCLASSEX); //结构体的字节长度 wc.style = CS_HREDRAW | CS_VREDRAW; //窗口式样 wc.lpfnWndProc = (WNDPROC)WndProc; //窗口处理函数 wc.cbClsExtra = 0; //分配给窗口类结构之后的额外字节数,一般为0 wc.cbWndExtra = 0; //分配给窗口实例之后的额外字节数,一般为0 wc.hInstance = hInstance; //实例句柄 wc.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); //光标 wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //背景 wc.lpszMenuName = NULL; //菜单 wc.lpszClassName = szWindowClass; //窗口名 wc.hIconSm = LoadIcon(wc.hInstance, (LPCTSTR)IDI_APPLICATION);return
RegisterClassEx(&wc); } //初始化窗口 BOOL InitInstance(HINSTANCE hInstance,int
nCmdShow) { HWND hWnd; //创建窗口 hWnd = CreateWindow( szWindowClass, //窗口名 szTitle, //窗口标题 WS_OVERLAPPEDWINDOW, //窗口式样 100, //窗口左上角的x坐标 100, //窗口左上角的y坐标 220, //窗口的宽度 80, //窗口的高度 NULL, //父窗口句柄 NULL, //菜单句柄 hInstance, //实例句柄 NULL); //创建参数if
(!hWnd) {return
FALSE; } ShowWindow(hWnd, nCmdShow); //显示窗口 UpdateWindow(hWnd); //立即显示return
TRUE; } //窗口消息处理 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {switch
(message) {case
WM_DESTROY: //关闭窗口 PostQuitMessage(0); //发送关闭消息break
;default
:return
DefWindowProc(hWnd, message, wParam, lParam); //缺省窗口处理函数 }return
0; }