“以消息为基础,以事件为驱动。”Windows程序依靠外部发生的事件来驱动,也就是说:程序不断的等待消息,外部事件以消息的形式进入系统后放入相应的队列,然后程序调用Getmessage取得相应的消息并做出相应的处理。窗口是用来接受并处理消息的,每个窗口都对应一个函数来处理消息。
对于win32应用程序来说Winmain函数和CALLBACK WndProc()以及消息机制组成了一个完整的整体,WinMain是应用程序的入口函数,它的主要工作时注册一耳光窗口结构和加载各种资源把窗口显示出来并进入消息循环; 程序消息函数CALLBACK WndProc()也就是回调函数主要工作是对各种消息进行分析和处理,而windows的消息队列中心就是对一切消息进行处理。Windows的消息队列中心也就是Windows内核再回调函数和WinMain之间传递消息
建立主窗口应用程序的主要步骤
1.注册好窗体结构,MyRegisterClass()装入窗口程序要用到的各种资源
2.建立窗口对象,CreateWindow把上一步的窗体结构建立一个对象
3.显示窗口对象,ShowWindow();
4.更新窗口对象,UpdateWindow()
5.进入窗口消息循环(GetMessage, TranslateMessage, DispatchMessage)
附:Win32应用程序源码
#include <windows.h>
#include <mmsystem.h>
#include <stdio.h>
#include <string.h>
LRESULT CALLBACK WindowProc(HWND hwnd,UINT message,WPARAM wParam, LPARAM lParam);
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
/*
注:_stdcall(WINAPI)是新标准C/C++函数的调用方法.从底层上说,使用这种调用方法参数的进栈顺序和
标准C调用(_cdecl方法)是一样的,都是从右到左,但是_stdcall采用自动清栈的方式,而_cdecl是手工清栈.
windows规定,凡事有它来负责调用的函数必须定义为_stdcall类型.比如回调函数.*/
static TCHAR szAppName[] = TEXT("HelloWorld");
HWND hwnd;//窗口句柄
MSG msg;//消息
//声明一个窗口类
WNDCLASS wndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WindowProc ;//窗口类别的窗口消息处理程序
wndclass.cbClsExtra = 0 ; //窗口类别结构和Windows内部保存的窗口结构中预留一些额外空间
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon(NULL,IDI_QUESTION) ;
wndclass.hCursor = LoadCursor(NULL,IDC_CROSS) ;
wndclass.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ; //窗口类别菜单
wndclass.lpszClassName= szAppName ; //窗口类别名称
//注册窗口类
if (!RegisterClass(&wndclass))
{
MessageBox( NULL, TEXT("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
//创建窗口
hwnd = CreateWindow( szAppName,
TEXT ("Hello World"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL) ;
//显示窗口
ShowWindow(hwnd,SW_SHOW);
//刷新窗口
UpdateWindow(hwnd);
//处理消息循环
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg) ; //翻译消息
DispatchMessage(&msg) ; //派发消息
}
return 0 ;
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE: //程序创建的消息号
break;
case WM_PAINT: //程序执行画的消息号
break;
case WM_DESTROY://程序销毁的消息号
PostQuitMessage (0) ;
break;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}