首先说明下,本文只对那些喜欢windows编程而又没有入门的朋友,高手跳过,一天学习三天游戏的也可以路过...
准备工作:至少要有C语言功底;开发环境Visual C++ 6.0;帮助文档MSDN;这里不提供下载,自己找去.
用VC提供向导本身虽然简单,但是代码结构比较复杂,不利于学习,这里会带着大家纯手写代码.
/
进入VC后新建一个空的win32 Application工程,然后新建一个CPP文件,取名为main.cpp吧,代码先都写在这里.
任何一个程序都有一个入口点,而且只能有一个,win32 Application程序的入口函数为 WinMain()函数,原型声明为
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int); 其中WINAPI 被预定义为 _stdcall,这是一个调用约定,在
编译时候会用到.第一个参数是操作系统分配的当前实例的句柄,第二个参数是前一个实例句柄,对于WIN32 程序来说,
它的值是NULL,第三个值是保存的是从命令行中调用程序时的附加字符串,比如你的程序名叫demo.exe,你在CMD中
打入 路径/demo hello ;lpCmdLine就是指向"hello"字符串的指针,第四个参数是窗口显示方式,比如最大化SW_MAXIMIZE,
正常SW_SHOWNORMAL等等...当WinMain()函数执行到最后或遇到return语句,整个程序就结束了..
在一个windows程序中,另一个重要的函数就是窗口处理函数,它负责处理各种消息;在一个窗口类中要指明它的窗口处理
函数地址;该函数的类型必须是 LRESULT CALLBACK (HWND,UINT,WPARAM,LPARAM),函数名称可以自己取;其中
LRESULT 即为long型,CALLBACK为_stdcall,上面已经说过了.HWND是窗口的句柄,UINT 即为unsigned int 是消息号,WPARAM 即word型,LPARAM 即long型,这两个都是消息附加参数,对于不同的消息,它们的值不同.对于程序不关心的消息,我们可以调用DefWindowProc(HWND,UINT,WPARAM,LPARAM)函数,让系统处理;
要显示一个窗口,首先得设计一个窗口结构WNDCLASS,然后用RegisterClass()注册,成功后调用CreateWindow()创建窗口,成功后再调用ShowWindow()显示窗口.
WNDCLASS 的定义如下:
typedef struct _WNDCLASS {
UINT style; // 窗口风格
WNDPROC lpfnWndProc; //窗口处理函数名称
int cbClsExtra; //分配给窗口结构的额外空间
int cbWndExtra; //分配给窗口实例的额外空间
HINSTANCE hInstance; //当前实例
HICON hIcon; //窗口图标
HCURSOR hCursor; //窗口指针
HBRUSH hbrBackground;//窗口背景画刷
LPCTSTR lpszMenuName; //菜单名称
LPCTSTR lpszClassName; //要注册的名称,创建窗口的时候要用到
} WNDCLASS, *PWNDCLASS;
RegisterClass函数声明如下:
ATOM RegisterClass( CONST WNDCLASS *lpWndClass // class data );只有一个参数,就是刚刚填写的WNDCLASS 结构的地址;如果出错返回0;
CreateWindow()函数的声明如下:
HWND CreateWindow(
LPCTSTR lpClassName, // 已注册的窗口类的名称
LPCTSTR lpWindowName, // 窗口的名称
DWORD dwStyle, // 窗口风格
int x, // 窗口左上角的X坐标
int y, // 窗口左上角的Y坐标
int nWidth, // 窗口的宽
int nHeight, // 窗口的高
HWND hWndParent, // 如果是子窗口的话指明父窗口的句柄,否则为NULL
HMENU hMenu, // 窗口菜单句柄
HINSTANCE hInstance, // 当前实例句柄
LPVOID lpParam // 窗口数据指针,特殊用途,一般为NULL;
);这个函数的参数比较多,开始时大家也不要硬记,不会的时候查下MSDN,用得多了自然就熟悉了..
如果成功则返回创建的窗口的句柄,否则返回NULL;
如果都成功了就要可以显示窗口了,ShowWindow(HWND,int),第一个参数是要显示或隐藏的窗口的句柄,
具体由第二个参数决定;
当上面的工作完成后就可以就进入消息循环让程序响应用户的各种操作;
典型的消息循环如下:
while(GetMessage(&msg,NULL,0,0)) //GetMessge函数从调用线程的消息队列里获取消息,并放入msg
{ TranslateMessage(&msg); //结构里,第二个参数为HWND类型,指明要获取哪个窗口的消息,如果
DispatchMessage(&msg); //为NULL则获取当前线程所属的所有窗口的消息;后两个参数用于消息过虑
} //分别指明要获取的消息的最小和最大值,都为0时不过虑;
TranslateMessage()函数将一个按键消息翻译成一个字符消息,如果可以的话.
DispatchMessage()函数调用窗口的消息处理函数,并将消息传给它.
OK,这节就到这里,多了大家也不奈烦了吧...祝大家编程愉快!
最后给出本节的参考代码(已经运行通过了):
/
#include"windows.h"
long _stdcall WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPreInst,LPSTR lpCmdLine,int nCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASS wc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hInstance=hInst;
wc.lpfnWndProc=WndProc;
wc.lpszClassName="MyWndClass";
wc.lpszMenuName=NULL;
wc.style=CS_VREDRAW|CS_HREDRAW;
if(!RegisterClass(&wc))
return 0;
hwnd=CreateWindow("MyWndClass","Hello",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,
hInst,
NULL);
if(hwnd==NULL)
return 0;
ShowWindow(hwnd,SW_SHOWNORMAL);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 1;
}
long _stdcall WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_COMMAND:break;
case WM_QUIT:PostQuitMessage(0);break;
default:
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
}
/