MFC工程怎么去掉左上角的菜单:还原               还原
移动               移动
大小               大小
最小化             最小化
最大化             最大化
关闭               关闭
                   下一个

解决方案 »

  1.   

    GetSystemMenu
      函数功能:该函数允许应用程序为复制或修改而访问窗口菜单(系统菜单或控制菜单)。
      函数原型:HMENU GetSystemMenu(HWND hWnd,BOOL bRevert);
      参数:
      hWvd:拥有窗口菜单拷贝的窗口的句柄。
      BPevert:指定将执行的操作。如果此参数为FALSE,GetSystemMenu返回当前使用窗口菜单的拷贝的句柄。该拷贝初始时与窗口菜单相同,但可以被修改。
      如果此参数为TRUE,GetSystemMenu重置窗口菜单到缺省状态。如果存在先前的窗口菜单,将被销毁。
      返回值:如果参数bRevert为FALSE,返回值是窗口菜单的拷贝的句柄:如果参数bRevert为TRUE,返回值是NULL。
      备注:任何没有用函数GetSystemMenu来生成自己的窗口菜单拷贝的窗口将接受标准窗口菜单。
      窗口某单最初包含的菜单项有多种标识符值,如SC_CLOSE,SC_MOVE和SC_SIZE。
      窗口菜单上的菜单项发送WM_SYSCOMMAND消息。
      所有预定义的窗口菜单项的标识符数大于OxFOOO。如果一个应用程序增加命令到窗口菜单,应该使用小于OxFOOO的标识符数。
      系统根据状态自动变灰标准窗口菜单上的菜单项。应用程序通过响应在任何某单显示之前发送的WM_INITMENU消息来实现选取和变灰。
      Windows CE环境下,不支持系统菜单,但GetSyemMenu以宏的方式实现,以保持和已存在代码的兼容性。可以使用该宏的返回菜单句柄使关闭框无效,与在 Windows桌面平台上一样。Windows CE下的返回值没有其他用处。参数bRevert无用。
      用下面的代码使关闭按钮无效:
      EnableMenultem(GetSystemMenu(hwnd,FALSE),SC_CLOSE,MF_BYCOMMAND I MF_GRAYED);
      速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:winuser.h;输入库:user32.lib。
      

  2.   

    BOOL CDlg::PreTranslateMessage(MSG* pMsg) 
    {
    //屏蔽右键标题功能
    if(pMsg->message == WM_NCRBUTTONDOWN)
    return true;

    return CDialog::PreTranslateMessage(pMsg);
    }直接屏蔽右键不行吗?
      

  3.   

    处理消息WM_NCRBUTTONDOWN与WM_NCLBUTTONDOWN
    void CYourDlg::OnNcLButtonDown(UINT nHitTest, CPoint point)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    CRect crect,wrect;
    GetClientRect(&crect);
    GetWindowRect(&wrect);
    CRect rc;
    rc.top = wrect.top;
    rc.left = wrect.left;
    rc.bottom = wrect.bottom - crect.Height();
    rc.right = rc.left+30;
    if(PtInRect(&rc,point))
      return;
    CDialog::OnNcLButtonDown(nHitTest, point);
    }
    void CYourDlg::OnNcRButtonDown(UINT nHitTest, CPoint point)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    return;
    CDialog::OnNcLButtonDown(nHitTest, point);
    }
      

  4.   

    找不到 消息WM_NCRBUTTONDOWN与WM_NCLBUTTONDOWN啊!!
      

  5.   

    找不到 消息WM_NCRBUTTONDOWN与WM_NCLBUTTONDOWN啊!!
      

  6.   

    把3楼的
    rc.right = rc.left+30; 
    改为:
    rc.right = wrect.right; 不然,右键标题栏的其他位置还是会出现系统菜单的。
      

  7.   

    下面的代码可以去掉菜单,不过这样就不能标题栏拖动窗口了,要想拖动窗口还要再做其他的处理了BOOL CMyDlg::OnInitDialog()
    {
    CDialog::OnInitDialog();
    CMenu* pMenu = GetSystemMenu(FALSE);
    for(int i=pMenu->GetMenuItemCount()-1;i>=0;i--)
    {
    pMenu->DeleteMenu(i,MF_BYPOSITION);
    }
    }
      

  8.   

    刚才测试了一下,下面这样处理应该就可以了
    void Cldlg1Dlg::OnContextMenu(CWnd* pWnd, CPoint point)
    {
    //直接返回不做处理就能屏蔽右键菜单}
    BOOL Cldlg1Dlg::PreTranslateMessage(MSG* pMsg)
    {
    //屏蔽Alt+空格键
    if(pMsg->wParam==VK_SPACE && ::GetKeyState(VK_MENU)<0)   
    {   
    return TRUE; 
    }
    return CDialog::PreTranslateMessage(pMsg);
    }
    LRESULT Cldlg1Dlg::OnNcHitTest(CPoint point)
    {
    //屏蔽系统菜单
    if(CDialog::OnNcHitTest(point)==HTSYSMENU)
    return 0;
    return CDialog::OnNcHitTest(point);
    }
      

  9.   

    真是不好意思,还得麻烦大家.
    在XP系统下一般的时候都没有了菜单,但点左上角的图标偶尔会弹出菜单
    主框架的和视图的图标都是。
    并且在vist系统下就屏蔽不了。
      

  10.   

    我就是用vista系统来测试的,都没问题,要不你把rc.right = rc.left+30; 
    30这个数字加大点
      

  11.   

    rc.top = wrect.top; 
    rc.left = wrect.left; 
    rc.bottom = wrect.top +30;
    rc.right = rc.left+30; 
    if(PtInRect(&rc,point)) 
    这样改
      

  12.   

    对 这个确实就能屏蔽LRESULT Cldlg1Dlg::OnNcHitTest(CPoint point)
    {
        //屏蔽系统菜单
        if(CDialog::OnNcHitTest(point)==HTSYSMENU)
            return 0;
        return CDialog::OnNcHitTest(point);
    }
      

  13.   

    不是vist的问题,而是点下面视图的图标的时候就还是有一定几率弹出菜单
    如图。直接点上面框架的图标不会弹出菜单。