1.程序进入点
windows程序的进入点是WinMain函数,它有四个参数,形式如下:
int WINAPI WinMain ( HINSTANCE hInst,
HINSTANCE hPrevInst,
LPSTR lpCmdLine,
int nCmdShow )
参数说明:
hInst 为当前实例句柄,Windows 环境下用于区别同一应用程序的不同实例;hPrevInst表示应用程序先前实例的句柄(如果有的话),否则为 NULL,可以用来确定当前实例是否为应用程序的第一个实例;
lpCmdLine是以NULL结尾的命令行字符串长指针;nCmdShow指定窗口初始显示方式的整型常量(1 = 通常;7 = 最小化) 。
2.注册窗口类
一个窗口在建立以前,必须进行一些初始化,比如窗口的大小、标题及边框的颜色等,完成这些工作我们还必须一个API函数RegisterClass来注册窗口类:
函数功能:该函数注册在随后调用CreateWindow函数和CreateWindowEx函数中使用的窗口类。 RegisterClass函数己经由函数RegisterClassEx函数来代替,但是,如果不需要设置类的小目标则仍然可以使用RegisterClass函数
函数原型:ATON RegisterClass(CONST WNDCLASS *lpWndClass);
参数:
lpWndClass:指向一个WNDCLASS结构的指针。在将它传递给函数之前,必须在该结构中填充适当的类属性。
返回值:如果函数成功,返回值是唯一标识已注册的类的一个原子;如果函数失败,返回值为0。若想获得更多错误信息,请调用GetLastError函数。
下面是WNDCLASS的一个结构说明:
结构WNDCLASS包含一个窗口类的全部信息,也是Windows编程中使用的基本数据结构之一,应用程序通过定义一个窗口类确定窗口的属性,定义如下:
typedef struct _WNDCLASS {
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
} WNDCLASS, *LPWNDCLASS;
例子:
WNDCLASS wndclass;
//初始化窗口的属性
…………….
//注册窗口类
if(!RegisterClass(&wndclass))
{
MessageBeep(0);
return FALSE;
}
3.创建窗口
窗口属性设置好并且注册了窗口类之后,我们就要建立一个窗口了,CreateWindow函数会完成这个工作,如:
hwnd=CreateWindow(
lpszClassName,
lpszTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
建立好窗口之后就要显示窗口了,如下:
//显示窗口
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
然后进步消息循环,程序出于一直等待的状态(除非你退出程序)。
//消息循环
while(GetMessage(&Msg,NULL,0,0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
4.窗口函数
这是窗口的生命中枢,因为它是处理各种消息的地方。上面消息循环中DispatchMessage就是将消息分派到窗口处理函数。
所谓的窗口函数。窗口函数形如:
LRESULT CALLBACK WndProc( HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch ( message ) {
case WM_LBUTTONDOWN:
…
case WM_MOUSEMOVE:
…
case WM_DESTROY:
PostQuitMessage ( 0 );
default:
return DefWindowProc ( hWnd, message, wParam, lParam );
}
return ( 0 );
}
CALLBACK是一种函数调用习惯,被定义为__stdcall,说明此函数为回调函数,由系统(Windows)自动调用的,当MYAPP.EXE接收到消息并DispatchMessage之后,系统(Windows)就自动调用窗口函数WndProc了(DispatchMessage函数又将消息传回了Windows系统,然后Windows系统通过消息中的窗口据柄找到对应的WndProc)。
注意窗口函数中消息的分支结构中default分支必须是return DefWindowProc ( hWnd, message, wParam, lParam );因为不论什么消息都必须被处理,DefWindowProc是windows内部预设的消息处理函数。以上就是windows程序的精要所在!
5.举例说明
#include <windows.h>
//包含应用程序中数据类型和数据结构的定义
long CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
//窗口说明
//WinMain函数是所有Windows应用程序的入口,类似c语言中的main函数其功能是完成//一系列的定义和初始化,并产生消息循环
/* WinMain函数实现以下功能:注册窗口类,建立窗口及执行其他必要的初始化工作;进入消息循环,根据从应用程序消息队列接受的消息,调用相应的处理过程;当消息循环检
测到WM_QUIT消息时终止程序运行
WinMain函数有三个基本部分组成:函数说明、初始化和消息循环*/
//函数说明
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
//初始化
//初始化包括窗口类的定义、注册、创建窗口实例和显示窗口四部分
{
HWND hwnd;
MSG Msg;
WNDCLASS wndclass;
char lpszClassName[]="窗口";//窗口类名
char lpszTitle[]="徐新坡"; //窗口标题名
//窗口类定义
//窗口类定义了窗口的形式与功能窗口类定义通过给窗口类数据结构WNDCLASS赋值完成
//该数据结构中包含窗口类的各种属性
wndclass.style =0; // 窗口类型为缺省类型
wndclass.lpfnWndProc=WndProc; //定义窗口处理函数
wndclass.cbClsExtra=0; //窗口类无扩展
wndclass.cbWndExtra=0; //窗口实例无扩展
wndclass.hInstance=hInstance; //当前实例句柄
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//窗口的最小化图标为缺省图标
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW); //窗口采用箭头光标
wndclass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH)); //窗口背景为白色
wndclass.lpszMenuName=NULL; //窗口无菜单
wndclass.lpszClassName=lpszClassName; //窗口类名为“窗口”
//////////////// 以下是窗口类的注册 Windows系统本身提供部分预定义的窗口类,程序员也可以自定义窗口类//窗口类必须先注册后使用
if(!RegisterClass(&wndclass)) //如果注册失败发出警告
{MessageBeep(0); return FALSE;}
///////////////创建窗口创建一个窗口的实例由函数CreateWindow()实现
hwnd=CreateWindow( lpszClassName, //窗口类名
lpszTitle, //窗口标题名
WS_OVERLAPPEDWINDOW, //窗口的风格
CW_USEDEFAULT,
CW_USEDEFAULT, //窗口左上角坐标值为缺省值
CW_USEDEFAULT, CW_USEDEFAULT, //窗口的高和宽为缺省值
NULL, //此窗口无父窗口
NULL, //此窗口无子菜单
hInstance, //创建此窗口的应用程序的当前句柄
NULL //不使用该值
);
/////////////显示窗口
ShowWindow(hwnd,nCmdShow);
//绘制用户区
UpdateWindow(hwnd);
/////////////消息循环
while(GetMessage(&Msg,NULL,0,0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);}
return Msg.wParam; //消息循环结束即程序结束时将信息返回系统
}
/////////////窗口函数
//窗口函数定义了应用程序对接收到的不同消息的响应,其中包含了应用程序对各种可能接受到的消息的
//处理过程,时消息处理分支控制语句的集合
long CALLBACK WndProc(
HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam
)
{
switch(message)
{
case WM_DESTROY:
PostQuitMessage(0);
default: //缺省时采用系统消息缺省处理函数
return DefWindowProc(hwnd,message,wParam,lParam);
}
return (0);
}