右键点击托盘图标再点关闭,如何实现弹出确认的功能?
下面三个函数实现了将程序最小化到托盘并且单价右键能实现关闭的功能,我现在想实现点击关闭后能弹出一个权限对话框,输入密码正确则退出,否则程序继续运行。
void CGpsudpDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
if (nID == SC_MINIMIZE)
{
ShowWindow(SW_HIDE);
ZeroMemory(&nid, sizeof(nid));
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
nid.hWnd = m_hWnd;
strcpy(nid.szTip, "服务器程序");
nid.uCallbackMessage = WM_NOTIFY_ICON;
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
Shell_NotifyIcon(NIM_ADD, &nid);
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
}
void CGpsudpDlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam)
{
switch(lParam)
{
case WM_RBUTTONUP: // 右键起来时弹出菜单
{
LPPOINT lpoint = new tagPOINT;
::GetCursorPos(lpoint); // 得到鼠标位置
CMenu menu;
menu.CreatePopupMenu(); // 声明一个弹出式菜单
menu.AppendMenu(MF_STRING, WM_DESTROY, "关闭");
menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x ,lpoint->y, this);
HMENU hmenu = menu.Detach();
menu.DestroyMenu();
delete lpoint;
}
break;
case WM_LBUTTONDBLCLK: // 双击左键的处理
{
this->ShowWindow(SW_SHOWNORMAL); // 显示主窗口
}
break;
}
}
BOOL CGpsudpDlg::DestroyWindow()
{
Shell_NotifyIcon(NIM_DELETE, &nid);
return CDialog::DestroyWindow();
}
我在BOOL CGpsudpDlg::DestroyWindow() 增加了如下代码,使之成为:
BOOL CGpsudpDlg::DestroyWindow()
{
LOGIN dlg ;
int reg=dlg.DoModal();
if (reg==IDCANCEL)
return FALSE;
if(reg==IDOK)
{
if((dlg.m_sUser=="维护工程师"&&dlg.m_lPassword==321)||(dlg.m_sUser=="系统工程师"&&dlg.m_lPassword==123))
{
Shell_NotifyIcon(NIM_DELETE, &nid);
return CDialog::DestroyWindow();
}
else
{
AfxMessageBox("密码错误");
return FALSE;
}
}
}
在我点击关闭时,能弹出这个对话框,可是无论我输进去的密码正确与否,程序都是退出了。然后我将这个函数里的语句全部清除,分别只留一句return FALSE和return TRUE进行调试,程序还是退出了,请大家帮我分析下是哪的问题?是不是权限对话框不应该放在这个函数里? 托盘,?关闭对话框
[解决办法]
menu.AppendMenu(MF_STRING, WM_DESTROY, "关闭"); // 这里最好不要用WM_DESTOY,自己定义一个ID吧(比如IDM_CLOSE) #define IDM_CLOSE 0x11
一般的,应该添加为你右键弹出菜单中的"关闭"菜单项添加菜单命令响应WM_COMMAND,在菜单响应函数中弹出对话来确定程序是否退出还是继续运行。
afx_msg void OnCloseDialog();
ON_COMMAND(IDM_CLOSE, &CGpsudpDlg::OnCloseDailog)
void CGpsudpDlg::OnCloseDialog()
{
if(IDOK == AfxMessageBox(_T("Exit"), MB_OKCANCEL
[解决办法]
MB_ICONQUESTION))
{
CDialog::OnOK();
}
}