关于模态/非模态对话框不响应菜单的UPDATE_COMMAND_UI消息

本文介绍如何使模态对话框响应菜单的UPDATE_COMMAND_UI消息。通过处理WM_INITMENUPOPUP消息,可以实现在模态对话框中更新菜单项状态的功能。

对于模态非模态对话框默认是不响应菜单的UPDATE_COMMAND_UI消息的,需要增加对WM_INITMENUPOPUP消息的处理以后,才可以响应UPDATE_COMMAND_UI。

void CXXXDlg::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) 
{ 
    CDialog::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu); 

    // TODO: Add your message handler code here 
    if(!bSysMenu && pPopupMenu) 
    { 
        CCmdUI cmdUI; 
        cmdUI.m_pOther = NULL; 
        cmdUI.m_pMenu = pPopupMenu; 
        cmdUI.m_pSubMenu = NULL; 

        UINT count = pPopupMenu->GetMenuItemCount(); 
        cmdUI.m_nIndexMax = count; 

        for(UINT i=0; i<count; i++)
        {
          UINT nID = pPopupMenu->GetMenuItemID(i);
          if(-1 == nID || 0 == nID) { continue; } 

          cmdUI.m_nID = nID; 
          cmdUI.m_nIndex = i; 
          cmdUI.DoUpdate(this, FALSE); 
        } 
    }
}

 

#include<winsock2.h> #include<ws2tcpip.h> #include<windows.h> #include<thread> #include<queue> #include"resource.h" #pragma comment(lib,"ws2_32.lib") INT_PTR CALLBACK Dialog_one(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//开始对话框// { static UINT_PTR TimeID = 0;//启用定时器// static HBRUSH hBackgroundBrush = NULL;//背景画刷// static HBITMAP hBmp = NULL;//位图句柄// switch (uMsg) { case WM_INITDIALOG: TimeID = SetTimer(hwndDlg, 1, 4000, NULL);//显示第一个对话框的内容,延迟4秒// hBackgroundBrush = CreateSolidBrush((RGB(200, 230, 255)));//设置背景为淡蓝色// hBmp = (HBITMAP)LoadImage(NULL, L"image_one.bmp", IMAGE_BITMAP, 200, 170, LR_LOADFROMFILE);//加载图片位置// if (hBmp) { SendDlgItemMessage(hwndDlg, IDC_MY_IMAGE_ONE, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBmp); } else { MessageBox(hwndDlg, L"image lost", L"QQ", MB_ICONERROR); } return (INT_PTR)TRUE;//设置焦点// case WM_DRAWITEM: { DRAWITEMSTRUCT* pdis = (DRAWITEMSTRUCT*)lParam; if (pdis->CtlID == IDC_CUSTOM_TEXT) { SetTextColor(pdis->hDC, RGB(255, 0, 0)); DrawText(pdis->hDC, L"Welcome to QQ's server", -1, &pdis->rcItem,//对话框标题// DT_CENTER | DT_VCENTER); } return (INT_PTR)TRUE; } case WM_CTLCOLORDLG: return (INT_PTR)hBackgroundBrush; case WM_COMMAND: if (LOWORD(wParam) == IDSTART) { EndDialog(hwndDlg, IDOK);//关闭对话框// } return (INT_PTR)TRUE; /*case WM_TIMER: if (wParam == 1) { EndDialog(hwndDlg, IDOK);//关闭对话框// } return (INT_PTR)TRUE; */ case WM_DESTROY: KillTimer(hwndDlg, TimeID);//销毁定时器// DeleteObject(hBackgroundBrush);//释放画刷// DeleteObject(hBmp);//释放位图资源// EndDialog(hwndDlg, IDCANCEL);//关闭对话框// break; case WM_CLOSE: EndDialog(hwndDlg, IDEND);//关闭对话框// break; } return (INT_PTR)FALSE; } INT_PTR CALLBACK Dialog_end(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//结束对话框// { static UINT_PTR TimeID = 0;//启用定时器// static HBRUSH hBackgroundBrush = NULL;//背景画刷// static HBITMAP hBmp = NULL;//位图句柄// switch (uMsg) { case WM_INITDIALOG: TimeID = SetTimer(hwndDlg, 1, 4000, NULL);//显示第一个对话框的内容,延迟3秒// hBackgroundBrush = CreateSolidBrush((RGB(200, 230, 255)));//设置背景为淡蓝色// return (INT_PTR)TRUE;//设置焦点// case WM_DRAWITEM: { DRAWITEMSTRUCT* pdis = (DRAWITEMSTRUCT*)lParam; if (pdis->CtlID == IDC_CUSTOM_TEXT_TWO) { SetTextColor(pdis->hDC, RGB(255, 0, 0)); DrawText(pdis->hDC, L"Goodbye", -1, &pdis->rcItem,//对话框标题// DT_CENTER | DT_VCENTER); } return (INT_PTR)TRUE; } case WM_CTLCOLORDLG: return (INT_PTR)hBackgroundBrush; case WM_TIMER: if (wParam == 1) { KillTimer(hwndDlg, TimeID);//销毁定时器// DeleteObject(hBackgroundBrush);//释放画刷// EndDialog(hwndDlg, IDOK);//关闭对话框// } return (INT_PTR)TRUE; case WM_CLOSE: EndDialog(hwndDlg, IDEND);//关闭对话框// break; } return (INT_PTR)FALSE; } HWND g_hInfoDialog = NULL;//对话框句柄// std::queue<std::wstring>g_msgQueue;//消息队列// CRITICAL_SECTION g_csMsgQueue;//线程同步锁// //消息更新函数// void UpdateDialogContent(HWND hwndDlg) { EnterCriticalSection(&g_csMsgQueue);//加锁// if (!g_msgQueue.empty())//队列非空// { std::wstring msg = g_msgQueue.front();//取队首元素// g_msgQueue.pop();//将队首元素弹出// SetDlgItemText(hwndDlg, IDC_INFORMATION, msg.c_str());//更新消息// } LeaveCriticalSection(&g_csMsgQueue);//解锁// } INT_PTR CALLBACK Dialog_information(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)//消息对话框// { switch (uMsg) { case WM_INITDIALOG: SetDlgItemText(hwndDlg, IDC_INFORMATION,L"你好");//更新消息// return (INT_PTR)TRUE; case WM_APP_UPDATE_MSG: UpdateDialogContent(hwndDlg); return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDCANCEL) { DestroyWindow(hwndDlg); g_hInfoDialog = NULL; return (INT_PTR)TRUE; } } return (INT_PTR)FALSE; } void HandleClient(SOCKET client_server) { WCHAR received[36]; int x = 0; while(true) { int rec = recv(client_server, (char*)received, sizeof(received) - sizeof(WCHAR), 0); if (rec <= 0) { break; } received[rec/sizeof(WCHAR)] = L'\0'; EnterCriticalSection(&g_csMsgQueue);//加锁// g_msgQueue.push(std::wstring(received));//创建副本// LeaveCriticalSection(&g_csMsgQueue);//解锁// if (x == 0) { MessageBox(NULL, L"服务器已成功接收来自客户端的信息", L"QQ", MB_ICONINFORMATION);//只提示一次// x = 1; } if(g_hInfoDialog == NULL)//创建消息对话框// { g_hInfoDialog = CreateDialog( GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_MYDIALOG_INFORMATION), NULL, Dialog_information ); ShowWindow(g_hInfoDialog, SW_SHOW); PostMessage(g_hInfoDialog, WM_APP_UPDATE_MSG, 0, 0); } else { //通知现有对话框更新内容// PostMessage(g_hInfoDialog, WM_APP_UPDATE_MSG, 0, 0); } } MessageBox(NULL, L"服务器已无法接收来自客户端的信息", L"QQ", MB_ICONERROR); closesocket(client_server); } int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE, LPSTR, int nCmdShow) { InitializeCriticalSection(&g_csMsgQueue);//初始化// INT_PTR result_one = DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_ONE), NULL, Dialog_one);//开始框// if (result_one == IDOK)//一级判断// { WSADATA wsaData; int result = WSAStartup(MAKEWORD(2, 2), &wsaData); if (result) { MessageBox(NULL, L"Winsock初始化失败", L"QQ", MB_ICONERROR); WSACleanup(); exit(1); } if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) { MessageBox(NULL, L"支持Winsock2.2", L"QQ", MB_ICONERROR); WSACleanup(); exit(1); } MessageBox(NULL, L"Winsock初始化成功", L"QQ", MB_ICONINFORMATION); SOCKET server_socket = INVALID_SOCKET; server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建套接字// if (server_socket == INVALID_SOCKET) { MessageBox(NULL, L"服务器套接字创建失败", L"QQ", MB_ICONERROR); exit(1); } else { MessageBox(NULL, L"服务器套接字创建成功", L"QQ", MB_ICONINFORMATION); } //设置服务器地址// sockaddr_in serverAddr; serverAddr.sin_family = AF_INET;//设置为IPv4// serverAddr.sin_port = htons(8080); serverAddr.sin_addr.s_addr = INADDR_ANY;//监听所有网卡,即本机的所有IP地址// bind(server_socket, (sockaddr*)&serverAddr, sizeof(serverAddr));//将套接字与指定的IP地址和端口号关联// listen(server_socket, 50);//开始监听// while (true) { SOCKET client_server = accept(server_socket, NULL, NULL);//创建新的套接字// if (client_server == INVALID_SOCKET) { MessageBox(NULL, L"无法创建新的套接字与客户端进行通信", L"QQ", MB_ICONINFORMATION); continue; } MessageBox(NULL, L"成功创建新的套接字与客户端进行通信", L"QQ", MB_ICONINFORMATION); std::thread(HandleClient, client_server).detach();//创建线程// } } else if (result_one == IDEND)//一级判断// { DialogBox(hinstance, MAKEINTRESOURCE(IDD_MYDIALOG_END), NULL, Dialog_end);//结束框// } } 为什么能弹出消息框,但是无法响应,无法加载出内容?
07-10
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值