对话框程序初始时窗口隐藏的,可是托盘上图标右击时菜单显示不出来。
而初始时窗口显示出来则托盘上图标右击时菜单能显示出来,为什么呢?
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;
}

解决方案 »

  1.   

    我觉得你处理托盘的时候有问题,下面是我的
    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;
    }
      

  2.   

    处理托盘的时候没有问题,因为如果对话框是显示的:
    int nResponse = dlg.DoModal();
    则托盘上图标右击时菜单是能显示出来的
      

  3.   

    标准的隐藏DIALOG的方法如下
    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);
      

  4.   

    运行到这句时会出现异常:lpwndpos->flags &= ~SWP_SHOWWINDOW;
    对话框窗口这样创建可以把:
    CServerDlg dlg;
    m_pMainWnd = &dlg;
    dlg.Create(IDD_SERVER_DIALOG);
      

  5.   

    zhuwenzheng(我是谁)大侠:我的程序很简单,你能帮我看看吗,我给你发过去.谢谢
      

  6.   

    to zhuwenzheng(我是谁):我一给你发过去了,谢谢