做了个无边框的对话框,最小化时,右击任务栏的任务按钮(不是托盘区域)无法弹出菜单,现在我想通过获得右击任务按钮的事件,来添加菜单。
请问右击任务栏的事件是什么呢?还有无边框对话框的最大化问题,我最大化时候是通过SendMessage(WM_SYSCOMMAND, SC_RESTORE, MAKELPARAM(point.x, point.y))的,但是对话框不是最大化,而是全屏了,将任务栏都覆盖了~!

解决方案 »

  1.   

    在实现该功能的时候:
    图标属性 m_tnid.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;//图标属性
    m_tnid.uCallbackMessage=MYWM_NOTIFYICON;//应用程序定义的回调消息ID
    然后调用系统托盘的消息映射:
    LRESULT CXXXXDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
    {
    switch(message)
    {
            case MYWM_NOTIFYICON:
        //如果是用户定义的消息
            if(lParam==WM_LBUTTONDBLCLK)
    {
            //鼠标双击时主窗口出现
       // AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOW);
    this->ShowWindow(SW_SHOW);
    }
            else if(lParam==WM_RBUTTONDOWN)    //鼠标右键单击弹出选单

                CMenu menu;
                menu.LoadMenu(IDR_MENU1); //载入事先定义的选单
                CMenu *pMenu=menu.GetSubMenu(0);
                CPoint pos;
            GetCursorPos(&pos);
                pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,pos.x,pos.y,AfxGetMainWnd());
    }
            break;
            case WM_SYSCOMMAND:
            //如果是系统消息
            if(wParam==SC_MINIMIZE)
    {
                //接收到最小化消息时主窗口隐藏
                AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE);
                return 0;
    }
            break;
    }
    return CDialog::WindowProc(message, wParam, lParam);
    }
    ///////////////////处理系统托盘的消息///////////////////////最重要的是添加一个头文件: #define MYWM_NOTIFYICON WM_USER+1
      

  2.   

    http://www.vckbase.com/document/viewdoc/?id=1470
      

  3.   

    会有WM_NCPAINT、WM_NCACTIVATE等消息,不过你用不着处理消息,没有边框的窗口也可以有系统菜单,你在对话框资源中加入系统菜单风格就可以了。
      

  4.   

    在对话框资源的属性中Style页面将System Menu勾上就有任务栏按钮的菜单了
    将Minimize Box和Maximize Box勾上就有最大化和最小化的按钮了
    另外,SC_MAXIMIZE才是最大化窗口,SC_RESTORE是还原到正常状态,也就是你在资源编辑器里调整的对话框大小。
      

  5.   


    将System Menu勾上就有任务栏按钮的菜单了 ?
    将Minimize Box和Maximize Box勾上就有最大化和最小化的按钮了 ?
    怎么钩啊?我都将边框设置为无了,System Menu,Minimize Box和Maximize Box 都变灰了?怎么钩?
      

  6.   


    也可以有的,在你的对话框OnInitDialog中加入一句ModifyStyle(0, WS_SYSMENU)就可以了如果你的系统菜单中有“关于”菜单项,要加在在CMenu* pSysMenu = GetSystemMenu(FALSE)前 ModifyStyle(0, WS_SYSMENU);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
    CString strAboutMenu;
    strAboutMenu.LoadString(IDS_ABOUTBOX);
    if (!strAboutMenu.IsEmpty())
    {
    pSysMenu->AppendMenu(MF_SEPARATOR);
    pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    }
    }
      

  7.   

    另外如果是没有边框的对话框,又需要有最大化和最小化的功能可以改为 ModifyStyle(0, WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX);
    因为没有边框,所以最大化时会盖住整个屏幕如果不想盖住任务栏,在OnGetMinMaxInfo中设置最大尺寸,应该可以(这个没有测试过)
      

  8.   

    对于第一个问题,只要在对话框的OnInitDialog里加一句话就可以了,如下:
    ModifyStyle(0,WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX);最大化问题,你响应OnSize,加如下代码即可:
    if (nType == 2)
    {
    CRect rect;   
    SystemParametersInfo(SPI_GETWORKAREA,0,(RECT*)rect,NULL);   
            rect.bottom -= 1;
    MoveWindow(rect);
    }
      

  9.   

    具有WS_SYSMENU风格的窗口就有系统菜单。
      

  10.   

    呵呵,系统菜单有了。可是我现在的问题成这样了:
    我的程序是无边框、无标题栏、的对话框。此时对话框已经是不能进行拖动大小的,
    为了实现拖动改变大小,是我通过判断鼠标的位置,等让它实现了此功能。
    代码是这样的:
    ::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_SIZENS)); 
    PostMessage(WM_NCLBUTTONDOWN,HTTOP,MAKELPARAM(point.x,   point.y));由于点击任务栏按钮没系统菜单,我在OnInitDialog()加入了ModifyStyle(0, WS_SYSMENU);系统菜单有了,OK了。
    可是我现在进行拖动对话框改变大小的时候,大小改变不了了。
    呵呵。这个怎么办??- -!
      

  11.   

    可以判断鼠标是否落在窗口上了,然后MoveWindow
      

  12.   

    ModifyStyle(0, WS_SYSMENU  ¦ WS_MINIMIZEBOX  ¦ WS_MAXIMIZEBOX); 
      

  13.   

    LZ的问题很容易解决的,你发帖提到的问题按我上面说的做就可以了想要拖动对话框改变大小,在对话框的属性里,Style,Border,选择Resizing就好了,按右下角就可以了拖动了,如果你想只要是在边框上都可以拖,那就需要判断鼠标位置了,根据鼠标的前后位置,然后MoveWindow,应该可以做到。顺便说一下,要限制对话框的大小,可以响应OnGetMinMaxInfo,设置最小和最大.
      

  14.   


    因需求我不能使用MoveWindow
    恩,我也是通过判断鼠标是否落在窗口上,然后模拟消息WM_NCLBUTTONDOWN进行移动的。
    但是我的对话框Border一定需要None,无边框的,选择了Resizingde不就右边框了?
      

  15.   

    改变对话框大小最简单的方法应该是重载OnNcHitTest
    afx_msg UINT OnNcHitTest( CPoint point );
    if(point 在左边)
      return HTLEFT;
    else if(point.x 在右边)
      return HTRIGHT;
    else if(point 在下边)
      return HTBOTTOM;
    else
      return CWnd::OnNcHitTest(point);
      

  16.   

    改变对话框大小我会啊,现在的问题是加了ModifyStyle(0, WS_SYSMENU)  我之前判断位置,然后改变对话框大小 都没有用了啊~!
      

  17.   

    你把边框设置为Resizing,然后响应WM_NCPAINT消息自己画边框(或者直接返回)。
      

  18.   

    郁闷啦,没的解决吗?总的来说我现在是这样的:
    我的对话框Border一定需要None,无边框的。
    我改变大小的方法是,通过判断,模拟发送PostMessage(WM_NCLBUTTONDOWN,HTTOP,MAKELPARAM(point.x,   point.y))消息,不用movewindow()。不能ModifyStyle(0, WS_SYSMENU),因为ModifyStyle(0, WS_SYSMENU)之后我的WM_NCLBUTTONDOWN消息就没用了,就不能改变对话框的大小了如何右键任务栏任务按钮弹出菜单?左键任务栏任务按钮最小化与最大化的切换?
      

  19.   

    或者换种方法,学MSN,有标题栏和边框,只是把标题栏和边框与边框隐藏掉,不是去掉。大家可以去看下MSN,右键MSN任务栏任务按钮时,标题栏与边框就显示出来了。如何隐藏标题栏与边框?只是是隐藏,不是去掉。
      

  20.   

    你总是想着用自己的方法的同时,也试试别人建议的方法,先把问题理清楚,又想这样,又想那样,结果就是都弄乱了。如何右键任务栏任务按钮弹出菜单?左键任务栏任务按钮最小化与最大化的切换?
    -----------------------------------------------------------------------------------------
    ModifyStyle(0,WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX);这句话人家都说了N遍了,你用没有试过啊?
    这里又有个最大化的问题,最大化时会遮盖任务栏
    最大化问题,你响应OnSize,加如下代码即可: 
    if (nType == 2)
        {
            CRect rect;   
            SystemParametersInfo(SPI_GETWORKAREA,0,(RECT*)rect,NULL);   
            rect.bottom -= 1;
            MoveWindow(rect);
        }
    我的程序是无边框、无标题栏、的对话框。此时对话框已经是不能进行拖动大小的, 
    为了实现拖动改变大小,是我通过判断鼠标的位置,等让它实现了此功能。 
    代码是这样的: 
    SetCursor(AfxGetApp()->LoadStandardCursor(IDC_SIZENS)); 
    PostMessage(WM_NCLBUTTONDOWN,HTTOP,MAKELPARAM(point.x,   point.y));
    ---------------------------------------------------------------------------------
    无边框,设置对话框Border->None。实现拖动的建议如下:
    响应OnMouseMove,当鼠标移到边框上时,显示可以拖动,m_bCanMove = TRUE
    响应OnLButtonDown,当m_bCanMove为TRUE是记录下鼠标按下的位置
    响应OnLButtonUp,当是拖动窗口的时候,MoveWindow到新的位置
    如果要有拖动的效果,在OnMouseMove中可以画拖动过程另:系统可以重载的消息最好别用PostMessage之类的来发送消息吧