连续问了几次了,一直也没有一个可行的答案。
我想自绘程序的菜单。在自绘的之前,首先要得到当前窗口的菜单的句柄。
然后根据这个句柄,进行自绘属性设置。然后重载OnDrawItem()和OnMeasureItem()两个函数,进行自绘的具体设置。
但是我使用下面两句获得菜单句柄的时候,总是出错。(在CMainFrame类中可以)
但在视图中的OnInitUpdate()函数中使用出错:
CMenu *pMenu=GetMenu();            //能够得到指针
HMENU hMenu=pMenu->GetSafeHmenu();//得到句柄的时候出错???我的本意是当打开一个新的文档的时候,得到当前菜单然后重载上述两个函数,利用得到的句柄设置自绘属性,但是行不通。
问题:
(1)为什么得到菜单的指针却得不到菜单得句柄。
(2)当打开一个文档后,(点击新建)。不管当前加载的时候什么文档。都能得到当前的菜单,并设置自绘属性。怎么实现???谢谢

解决方案 »

  1.   

    void CMainFrame::OnInitMenu(CMenu* pMenu) 
    {
    CFrameWnd::OnInitMenu(pMenu);

    CMenu *pSubMenu;
    UINT nCount,nSubCount,nID;
    nCount=pMenu->GetMenuItemCount();//子菜单的列数
    for(UINT i=0;i<nCount;i++)             
    {
    pSubMenu =pMenu->GetSubMenu(i);
    nSubCount=pSubMenu->GetMenuItemCount();//此列菜单菜单项的个数
    for(UINT j=0;j<nSubCount;j++)
    {
    nID=pSubMenu->GetMenuItemID(j);
    //将框架菜单所有菜单都添加MF_OWNERDRAW标志
    pSubMenu->ModifyMenu(j,MF_BYPOSITION|MF_OWNERDRAW,nID); 
    }
    }
    }
      

  2.   

    如果按照上述步骤设置的话,第一次(不打开子窗口的情况下)自绘的是主框架菜单。而打开子窗口后,菜单变化了,此时程序并没有执行DrawItem函数重新自绘一次(显示主菜单的时候已经自绘过一次了)。除非是鼠标在上面移动才能显示出来