1.消息结构体
<4>设置光标:LoadCursor和LoadIcon的用法很接近.
<5>设置画刷的句柄:
typedef struct tagMSG { // msg
HWND hwnd; //标识消息与哪个窗口相关
UINT message; //指示消息本身
WPARAM wParam; //消息的附加消息
LPARAM lParam; //消息的附加消息
DWORD time; //消息产生的时间
POINT pt; //消息产生时光标的位置
} MSG
3.WinMain函数
Windows程序的入口函数
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance应用程序实例句柄
HINSTANCE hPrevInstance, // handle to previous instance应用程序先前的实例句柄
// This parameter is always NULL在Win32下总是为空
LPSTR lpCmdLine, // command line命令行参数
int nCmdShow // show state指定程序窗口的显示状态
);
注:VC++6.0下设置命令行参数的方法:
Projects->Settings->Debug->Program arguments
4.窗口的创建
创建一个完整的窗口需要经过下面四个操作步骤:
(1)设计一个窗口类;
typedef struct _WNDCLASS {
UINT style; //指定窗口类的类型,如:CS_HREDRAW-窗口水平尺寸
//或水平大小发生变化时,窗口重绘,CS_VREDRAW-窗口
//垂直尺寸或垂直大小发生变化时,窗口重绘
WNDPROC lpfnWndProc; //函数指针,指向窗口函数
int cbClsExtra; //类风格的额外的数据,通常设置为0
int cbWndExtra; //窗口类的额外数据,通常设置为0
HANDLE hInstance; //当前应用程序的实例号
HICON hIcon; //图标的句柄,设置标题栏使用的图标
HCURSOR hCursor; //光标的句柄
HBRUSH hbrBackground; //画刷的句柄
LPCTSTR lpszMenuName; //指定菜单的名字
LPCTSTR lpszClassName; //设置窗口的名字
} WNDCLASS;
<1>"winuser.h"
#define CS_VREDRAW 0x0001
#define CS_HREDRAW 0x0002
#define CS_DBLCLKS 0x0008
假如:style=CS_HREDRAW | CS_VREDRAW | CS_NOCLOSE
如果需要在style中去掉CS_NOCLOSE,可以使用style & ~CS_NOCLOSE
<2>函数名可以表示函数代码的首地址.
<3>hIcon,使用LoadIcon函数来赋值:
HICON LoadIcon( HINSTANCE hInstance, //This parameter must be NULL when
//a standard icon is being loaded.
//微软已经为我们设置好了标准的图标,所以这里
//的值设置为NULL
LPCTSTR lpIconName
);
<4>设置光标:LoadCursor和LoadIcon的用法很接近.
<5>设置画刷的句柄:
wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);//由于
GetStockObject返回的是HGDIOBJ类型,所以需强制转换为HBRUSH类型
(2)注册窗口类;
RegisterClass(&wndcls);//注册窗口类
(3)创建窗口;
首先定义一个窗口句柄:HWND hwnd;
使用API函数CreateWindow创建窗口:
HWND CreateWindow( LPCTSTR lpClassName, //注册的窗口类名,如果指定的类名没有注册,应用 //程序依然可以运行,只不过不会产生窗口 LPCTSTR lpWindowName, //窗口的名字,即窗口标题栏的文字 DWORD dwStyle, //窗口的类型 int x, //窗口显示的时候的水平坐标 int y, //窗口显示的时候的垂直坐标 int nWidth, //窗口的宽度 int nHeight, //窗口的高度 HWND hWndParent, //指向父窗口的句柄 HMENU hMenu, //窗口菜单的句柄 HINSTANCE hInstance, //应用程序实例的句柄 LPVOID lpParam //WM_CREATE消息的附加参数 );
hwnd=CreateWindow("Weixin2003","北京维新科学技术培训中心",WS_OVERLAPPEDWINDOW,
0,0,600,400,NULL,NULL,hInstance,NULL);
#define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED | / //产生层叠的窗口,具有标题栏和边框
WS_CAPTION | / //具有标题栏
WS_SYSMENU | / //具有系统菜单
WS_THICKFRAME | / //具有可调边框的窗口
WS_MINIMIZEBOX | / //具有最小化,最大化按钮,此时必须同时
//设置WS_SYSMENU
WS_MAXIMIZEBOX)
同理,如果要在WS_OVERLAPPEDWINDOW中去掉最大化按钮,可以使用
WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX
如果将x设置为CW_USEDEFAULT,系统将为窗口左上角选择缺省的坐标,同时忽略y坐标
如果将nWidth设置为CW_USEDEFAULT,同上nHeight被忽略.
(4)显示窗口:
ShowWindow(hwnd,SW_SHOWNORMAL);
(5)更新窗口UpdateWindow(hwnd);
5.消息循环:
GetMessage(&msg,NULL,0,0); BOOL GetMessage( //从消息队列中取出一条消息 LPMSG lpMsg, //消息结构体的指针 HWND hWnd, //指示获取哪一个窗口的消息 UINT wMsgFilterMin, //指定消息的最小值,指定消息的范围 UINT wMsgFilterMax //指定消息的最大值,指定消息的范围,设置为0表示没有消息过滤 );
TranslateMessage(&msg);转换消息/翻译消息 比如它可以将WM_KEYDOWN和WM_KEYUP消息转换为WM_CHAR消息,然后重新投递到消息队列 DispatchMessage(&msg);将消息分发给窗口的回调函数,
6.窗口过程回调函数
LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
函数名可以更改,函数参数的类型不能改变.