windows api编程,为什么当我按下关闭按钮时会弹出2个messagebox ??
ID_FILE_EXIT 是菜单栏中的关闭菜单项,为什么当我点击后::MessageBox(NULL, "自定义消息!", "hello", MB_OK);这个函数会调用2次,WM_MYSELF是个自定义消息。
#define WM_MYSELF WM_USER + 0x12
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
// str对象用于保存窗口客户区显示的字符串
// 为了使用string类,应该包含头文件:“#include <string>”
static std::string str;
switch (message)
{
case WM_CREATE:
{
// 设置窗口的标题
::SetWindowText(hwnd, "最简陋的打字程序");
//::SendMessage(hwnd, WM_SETTEXT, 0, (long)"最简陋的打字程序");
return 0;
}
case WM_COMMAND:
switch(LOWORD(wParam))
{
case ID_FILE_EXIT:
// 向hwnd指定的窗口发送一个WM_CLOSE消息。
::SendMessage(hwnd, WM_MYSELF, 0, 0);
// ::PostMessage(hwnd, WM_CLOSE, 0, 0);
break;
}
case WM_MYSELF:
::MessageBox(NULL, "自定义消息!", "hello", MB_OK);
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = ::BeginPaint(hwnd, &ps);
// 设置输出文本的背景颜色和文字颜色
::SetTextColor(hdc, RGB(255, 0, 0));
//::SetBkColor(hdc, ::GetSysColor(COLOR_3DFACE));
::TextOut(hdc, 0, 0, str.c_str(), str.length ());
::EndPaint(hwnd, &ps);
return 0;
}
case WM_CHAR:
{
// 保存ansi码
str = str + char(wParam);
// 使整个客户区无效
::InvalidateRect(hwnd,NULL,0);
return 0;
}
case WM_LBUTTONDOWN:
{
char szPoint[56];
// 保存坐标信息
wsprintf(szPoint,"X =%d,Y =%d",LOWORD(lParam),HIWORD(lParam));
str = szPoint;
if(wParam & MK_SHIFT)
str = str + " Shift Key is down";
::InvalidateRect(hwnd,NULL,1);
return 0;
}
case WM_DESTROY: // 正在销毁窗口
// 向消息队列投递一个WM_QUIT消息,促使GetMessage函数返回0,结束消息循环
::PostQuitMessage(0) ;
return 0 ;
}
// 将我们不处理的消息交给系统做默认处理
return ::DefWindowProc(hwnd, message, wParam, lParam);
}