更新时间:2015-12-26 20:50:27浏览次数:1+次
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
GetMessage函数如果从消息队列中获取的消息是WM_QUIT就表示程序退出,就返回0,这样whille循环就结束,然后主程序就执行完毕而退出,程序就退出了。while (TRUE)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if (msg.message==WM_QUIT)
{
break;//退出循环,结束程序
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
//执行空闲处理代码
}
}
PeekMessage函数的前面四个参数和GetMessage的一样,最后一个是指明是否移除消息。因为PeekMessage是去查看消息,查看的话不一定要处理。如果你只是查看而不处理当前的消息,就使用PM_NOREMOVE。如果你要和GetMessage函数一样处理的话,就要指定PM_REMOVE。然而,PeekMessage的返回值只代表消息队列是否有消息,所以对于WM_QUIT没有特别的待遇了。WM_QUIT就是其中一个消息而已。然而它实际上却代表了退出程序的意思。所以我们要单独来处理WM_QUIT,处理的方式就是退出循环即可。下面看看我们利用空闲来输出的提示的效果:
#include "windows.h"
#include <tchar.h>
// - 项目是Unicode字符集
LRESULT CALLBACK WinProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
TCHAR Info[100]=_T("【C++技术网http://www.cjjjs.com】");
PAINTSTRUCT ps;
switch (message)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrev,LPSTR lpCmd,int iShow)
{
TCHAR ClassName[] = _T("MyClass");
TCHAR title1[] = _T("C++技术网http://www.cjjjs.com");
WNDCLASS wndClass;
wndClass.cbClsExtra=0;
wndClass.cbWndExtra=0;
wndClass.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH);
wndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndClass.hInstance = hInstance;
wndClass.lpfnWndProc = WinProc;
wndClass.lpszClassName = ClassName;
wndClass.lpszMenuName=NULL;
wndClass.style=CS_HREDRAW|CS_VREDRAW;
if(!RegisterClass(&wndClass)) return 0;
HWND hwnd = CreateWindow(ClassName,title1,WS_OVERLAPPEDWINDOW,0,0,600,500,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,SW_SHOWNORMAL);
MSG msg;
while (TRUE)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if (msg.message==WM_QUIT)
{
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
#define COUNT 8
static int iCount=0;
static TCHAR Dot[COUNT][10]={_T("→"),_T("↘"),_T("↓"),_T("↙"),_T("←"),_T("↖"),_T("↑"),_T("↗")};
//空闲扫面
HDC hdc = GetDC(hwnd);
SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));
TCHAR Tip[100]=_T("");
wsprintf(Tip,_T("正在执行空闲时扫描病毒%s"),Dot[iCount++%COUNT]);
RECT rect;
GetClientRect(hwnd,&rect);
TextOut(hdc,rect.right/4,rect.bottom/3,Tip,lstrlen(Tip));
ReleaseDC(hwnd,hdc);
Sleep(150);
InvalidateRect(hwnd,NULL,TRUE);
}
}
return msg.wParam;
}