对话框程序初始时窗口隐藏的,可是托盘上图标右击时菜单显示不出来。
而初始时窗口显示出来则托盘上图标右击时菜单能显示出来,为什么呢?
capp::initinstance()
{
CServerDlg dlg;
m_pMainWnd = &dlg;
dlg.Create(IDD_SERVER_DIALOG);
}
CServerDlg::OnInitDialog()
{
//加图标到托盘功能
m_hsysIcon=::LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_SYSDISH));//can only load an icon whose size conforms to the SM_CXICON and SM_CYICON system metric values.
tnid.cbSize=sizeof(NOTIFYICONDATA);
tnid.hWnd=this->m_hWnd;
tnid.uID=IDI_SYSDISH;
tnid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
tnid.uCallbackMessage=WM_ICONNOTIFY;
tnid.hIcon=m_hsysIcon;
strcpy(tnid.szTip,"服务已启动");
Shell_NotifyIcon(NIM_ADD,&tnid);
ShowWindow(SW_HIDE);
}//wParam接收的是图标的ID,而lParam接收的是鼠标的行为
LRESULT CServerDlg::OnIconClick(WPARAM wParam, LPARAM lParam)
{
UINT uMouseMsg=(UINT)lParam;
UINT uId=(UINT)wParam;
if(uId!=IDI_SYSDISH)
return 1;
CMenu menu,*pmenu;
POINT pos;
switch(uMouseMsg)
{
case WM_RBUTTONUP:
menu.LoadMenu(IDR_POPMENU);
GetCursorPos(&pos);
SetForegroundWindow();
pmenu=menu.GetSubMenu(0);
if(pmenu!=NULL)
pmenu->TrackPopupMenu(0,pos.x,pos.y,this);
this->SendMessage(WM_NULL,0,0);
pmenu->DestroyMenu();
break;
default:
break;
}
return 0;
}
而初始时窗口显示出来则托盘上图标右击时菜单能显示出来,为什么呢?
capp::initinstance()
{
CServerDlg dlg;
m_pMainWnd = &dlg;
dlg.Create(IDD_SERVER_DIALOG);
}
CServerDlg::OnInitDialog()
{
//加图标到托盘功能
m_hsysIcon=::LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_SYSDISH));//can only load an icon whose size conforms to the SM_CXICON and SM_CYICON system metric values.
tnid.cbSize=sizeof(NOTIFYICONDATA);
tnid.hWnd=this->m_hWnd;
tnid.uID=IDI_SYSDISH;
tnid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
tnid.uCallbackMessage=WM_ICONNOTIFY;
tnid.hIcon=m_hsysIcon;
strcpy(tnid.szTip,"服务已启动");
Shell_NotifyIcon(NIM_ADD,&tnid);
ShowWindow(SW_HIDE);
}//wParam接收的是图标的ID,而lParam接收的是鼠标的行为
LRESULT CServerDlg::OnIconClick(WPARAM wParam, LPARAM lParam)
{
UINT uMouseMsg=(UINT)lParam;
UINT uId=(UINT)wParam;
if(uId!=IDI_SYSDISH)
return 1;
CMenu menu,*pmenu;
POINT pos;
switch(uMouseMsg)
{
case WM_RBUTTONUP:
menu.LoadMenu(IDR_POPMENU);
GetCursorPos(&pos);
SetForegroundWindow();
pmenu=menu.GetSubMenu(0);
if(pmenu!=NULL)
pmenu->TrackPopupMenu(0,pos.x,pos.y,this);
this->SendMessage(WM_NULL,0,0);
pmenu->DestroyMenu();
break;
default:
break;
}
return 0;
}
LRESULT CBlueChatDlg::OnTrayNotification(UINT wParam,LONG lParam)
{
if (wParam == tid.uID)
{
if (!tid.hWnd)
return 0L;
if (LOWORD(lParam) == WM_RBUTTONUP)
{
HMENU hMenu = LoadMenu(hInst, MAKEINTRESOURCE(tid.uID));
if (!hMenu) return 0;
HMENU hSubMenu = GetSubMenu(hMenu, 0);
if (!hSubMenu) return 0;
POINT pos;
GetCursorPos(&pos);
::SetForegroundWindow(tid.hWnd);
TrackPopupMenu(hSubMenu, 0, pos.x, pos.y, 0, tid.hWnd, NULL);
::PostMessage(tid.hWnd, WM_NULL, 0, 0);
DestroyMenu(hMenu);
}
else if (LOWORD(lParam) == WM_LBUTTONDBLCLK)
::SendMessage(tid.hWnd, WM_COMMAND, IDM_ABOUT, 0);
return 1;
}
return 0;
}
int nResponse = dlg.DoModal();
则托盘上图标右击时菜单是能显示出来的
1. 如何有效地使初始窗口不显示
当我们想让窗口初始时不显示时,通常会用ShowWindow(SW_HIDE) ,但实际上还是在启动是可以看到窗口一闪而过的痕迹。所以,可以使用下面的方法来实现它:
(1.1)先在构造函数中设置布乐变量 visible值为false. visible = false;
(1.2)重载 WM_WINDOWPOSCHANGING,并添加下面代码:void CTest_deleteDlg::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
{
if(!visible)
lpwndpos->flags &= ~SWP_SHOWWINDOW; CDialog::OnWindowPosChanging(lpwndpos);
}(1.3)然后设布尔visible变量值为true,并在要显示窗口时,再用ShowWindow(SW_SHOW)既可。visible = true;
ShowWindow(SW_SHOW);
对话框窗口这样创建可以把:
CServerDlg dlg;
m_pMainWnd = &dlg;
dlg.Create(IDD_SERVER_DIALOG);