在windows环境下用VC++进行可视化的程序设计,需要了解windows的消息机制。我们编写的程序的目的其实就是响应windows传递给我们的程序的消息。想要了解windows的内部运行机制需要整整一本书的容量,想要学好windows程序设计必须掌握好消息机制。下面是一个简单的windows程序,它只处理了几个简单的消息。
/*---------------------------------------------------
WinMain.c -- Windows programs Demo Program No. 1
(c) sixing, 2012.7.12
---------------------------------------------------*/
#include <windows.h>
#include <stdio.h>
LRESULT CALLBACK WinSunProc(//回调函数的声明
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
int WINAPI WinMain(//程序的入口函数,和main一样的效果
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{
WNDCLASS wndcls;//窗口类型的结构体
wndcls.cbClsExtra=0;
wndcls.cbWndExtra=0;//两个额外的数值
wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);//窗口客户区的颜色
wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);//加载光标
wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);//加载图标
wndcls.hInstance=hInstance;//程序的实例
wndcls.lpfnWndProc=WinSunProc;//指向回调函数
wndcls.lpszClassName="sixing";//窗口的名字
wndcls.lpszMenuName=NULL;//指向要调用的菜单地址
wndcls.style=CS_HREDRAW | CS_VREDRAW;//窗口的风格,发生水平和垂直改变时重新绘制窗口
RegisterClass(&wndcls);//注册窗口
HWND hwnd;//定义一个窗口句柄
hwnd=CreateWindow("sixing","思行",WS_OVERLAPPEDWINDOW,//创建窗口
0,0,600,400,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,SW_SHOWNORMAL);//显示窗口,产生WM_CREATE消息
UpdateWindow(hwnd);//更新窗口,会产生WM_PAINT消息
MSG msg;//定义消息结构体
while(GetMessage(&msg,NULL,0,0))//设定消息循环
{
TranslateMessage(&msg);//把消息进行转换,如把WM_KEYDOWN,WM_KEYUP转换成WM_CHAR消息
DispatchMessage(&msg);//向应用程序投递消息
}
return 0;
}
LRESULT CALLBACK WinSunProc(//回调函数
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
switch(uMsg)
{
case WM_CHAR://程序接受的键盘消息时显示按下键的ASCII码值
TCHAR szChar[20];
wsprintf(szChar,"char is %d",wParam);
MessageBox(hwnd,szChar,"思行",0);
break;
case WM_LBUTTONDOWN://左键按下消息
MessageBox(hwnd,"mouse clicked","思行",0);
HDC hdc;
hdc=GetDC(hwnd);//获取设备环境句柄,向客户区显示内容时
TextOut(hdc,0,50,"努力学习软件设计技术",strlen("努力学习软件设计技术"));
ReleaseDC(hwnd,hdc);//释放设备环境句柄,必须有
break;
case WM_PAINT://窗口重绘消息
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hwnd,&ps);//获取设备环境句柄
TextOut(hDC,0,0,"多抽出一分钟学习 生命更加精彩",strlen("多抽出一分钟学习 生命更加精彩"));
EndPaint(hwnd,&ps);//释放设备环境句柄,必须有
break;
case WM_CLOSE://窗口关闭消息
if(IDYES==MessageBox(hwnd,"是否真的结束?","weixin",MB_YESNO))
{
DestroyWindow(hwnd);//会产生销毁窗口的消息WM_DESTROY
}
break;
case WM_DESTROY://窗口销毁消息
PostQuitMessage(0);
break;
default://对于程序不关心的消息默认的归宿
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}
由于时间限制,注释不是太详细,详见MSDN.
对于那些API函数不需要记忆,用时查看MSDN就行了,用的多了就会记住了。
当然MSDN都是英文的,要培养自己阅读英文技术文档的能力!