消息
Q:什么是消息?
A:消息是窗口感应用户动作的一种机制。
Q:消息有什么用?
A:消息的用处是可以让窗口根据用户的动作来实施相应的回应和动作
消息循环
处理消息的循环机制,通常有一处理函数来处理消息,消息处理函数就放在在之前的
wc.lpfnWndProc=/*消息处理函数*/;
消息处理函数
LRESULT CALLBACK WndProc(HWND hwnd, //是哪个窗口发来的消息。
UINT Message, //消息是什么?
WPARAM wParam, //附加的消息
LPARAM lParam)//附加的消息2
{
return DefWindowProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam);
}
...
wc.lpfnWndProc=WndProc();
...
细心的人发现了,这儿的WndProc,不就是返回了一个名字叫DefWindowProc的东西吗,但这DefWindowProc又是什么呢,它翻译过来即“缺省的消息处理函数”,它会按照先前设定的来执行,不需我们再去管他。有人要问了:“那就直接把他放到‘wc.lpfnWndProc’里去么。”这也是可以的,所以有代码:
...
wc.lpfnWndProc=DefWndProc();
...
不过我还是推荐额外写一个函数,因为我们将来会“省”一些消息的,所以,现在的代码成了这样:
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, //是哪个窗口发来的消息。
UINT Message, //消息是什么?
WPARAM wParam, //附加的消息
LPARAM lParam)//附加的消息2
{
return DefWindowProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
WNDCLASSEX wc;//一个窗口类
HWND hwnd;//还记得这个是什么吗?对,就是窗口句柄
MSG Msg;//消息
memset(&wc,0,sizeof(wc));
wc.cbSize = sizeof(WNDCLASSEX);
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;//他要你传一个应用程序实例句柄
wc.hCursor = LoadCursor(NULL, IDC_ARROW);//他说要个鼠标句柄
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);//请告诉它窗口的颜色,可以不要加1,也可以加2、加3都可以
wc.lpszClassName = "WindowClass";//窗口类名,注意不是窗口标题、窗口名
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); //他说他要一个图标
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); //emm...这个就跟上面的填一样的
/*
LoadIcon会传回一个图标句柄
LoadCursor会传回一个鼠标句柄
*/
if(!RegisterClassEx(&wc)) {
MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
return 0;
}//注册窗口,如果注册失败,则弹出对话框
hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,//EX窗口风格
"WindowClass",//刚才所说的窗口类名
"Caption",//这个就是窗口标题啦
WS_VISIBLE|WS_OVERLAPPEDWINDOW,//普通窗口风格,WS_VISIBLE它指的是窗口初始是否可见;WS_OVERLAPPEDWINDOW指的是一般窗口风格,剧透一下,将来的控件窗口就不需要了。
CW_USEDEFAULT,CW_USEDEFAULT,//窗口左上角的xy坐标
640,480,//窗口的宽和高,不知道为什么它不是长和宽,而是宽和高(长)
NULL,//这个是个窗口句柄,NULL为桌面
NULL,//HMENU昨天忘记讲了,它不仅代表了一个菜单,还是一个窗口标识,将来控件会用到
hInstance,//填空题:HINSTANCE代表了_____,答案:应用程序实例句柄
NULL);//附加参数(没什么卵用)
if(hwnd == NULL) {
MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
return 0;
}//与上面一样,窗口创建失败则弹出一个对话框
while(GetMessage(&Msg, NULL, 0, 0) > 0){//获取消息Get得到
TranslateMessage(&Msg);//翻译消息,甭管它是什么,照做就行
DispatchMessage(&Msg);//与上面同理,要真有兴趣可以一搜
}//~~这就是我们传说中的消息循环~~
return Msg.wParam;
}
现在就可以编译成功了,然后
DevC++还是有便捷方式!!!
还是点插入,点击MainProc,注意鼠标要在,头文件与WinMain之间,这样它会把你的光标放到一个地方,你就在那个里面填入WM_CREATE就可以了(当然也可以直接把那个case删掉),下片我将会说到WM_CREATE以及插入代码段中第二个case中WM_DESTROY是什么意思,以及有什么用。
另外,如果用DevC++的话,那么一定要创建项目哦,用源码的话,它会额外创建一个控制台窗口。