请教各位大侠:
  现需要在一个CHMLView中的自定义右键菜单里加上encoding设置功能,与IE右键菜单中的encoding功能一致。参考网上文档<<Internet Explorer 编程简述(五)调用IE隐藏的命令(中文版)>>与<<Internet Explorer 编程简述(七)完美的“编码”菜单>>,基本已能将加其加入,但出现下列问题:
   1。Auto-Selet总是被选上的,没法改变,且其功能也无效
   2。选more中的语言编码时,没法检测其语言包是否安装。我在IE的encoding->more中选一种编码时,当其没有安装,它会弹安装该语言包提示。但我在程序里的encoding->more中选同种编码时,就没有提示。变成乱码。但如果选安装好的语言编码时,页面就会变成对应的编码显示。   请问上面两个问题,可能是什么原因引起的呀?请各位大侠不吝赐教。在此先多谢了。

解决方案 »

  1.   

    下面关几处关健的代码,不知是哪儿有错?
    void CMainFrame::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
    {
             CFrameWnd::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);         // TODO: Add your message handler code here
    if(m_bShowMenuEncoding)
    {
    for(UINT i = 0; i< pPopupMenu->GetMenuItemCount(); i++)
    {
    int nID = pPopupMenu->GetMenuItemID(i);
    if(nID > 2000 && nID <4000)
                    pPopupMenu->EnableMenuItem(nID,MF_ENABLED | MF_BYCOMMAND);
    } }}
    HRESULT CMyView::OnShowContextMenu(DWORD dwID, LPPOINT pPoint, LPUNKNOWN pcmdtReserved, LPDISPATCH pdispReserved)
    {  
       CMenu menu;
       BOOL bResoult;
       bResoult = menu.LoadMenu(IDR_MY_IE_CONTEXT);
       if (bResoult)
       {
           CMenu *pMenu = menu.GetSubMenu(0);
           if (pMenu)
           {
     #define SHDVID_GETMIMECSETMENU 27
              HRESULT hr;
     HINSTANCE  hinstSHDOCLC;
     HWND  hwnd;
     CComPtr<IOleCommandTarget> spCT;
     CComPtr<IOleWindow>   spWnd;
     MENUITEMINFO mii = { 0 };
     CComVariant var;
     hr = pcmdtReserved->QueryInterface(IID_IOleCommandTarget, (void**)&spCT);
     hr = pcmdtReserved->QueryInterface(IID_IOleWindow,(void**)&spWnd);
     hr = spWnd->GetWindow(&hwnd); //get browser window handle
        hinstSHDOCLC = LoadLibrary(TEXT("SHDOCLC.DLL"));
     if(hinstSHDOCLC)
    {
       hr = spCT->Exec(&CGID_ShellDocView,SHDVID_GETMIMECSETMENU,0,NULL,&var);
       mii.cbSize = sizeof(mii);
       mii.fMask = MIIM_SUBMENU;
       mii.hSubMenu = (HMENU)var.byref;
       SetMenuItemInfo(pMenu->GetSafeHmenu(),ID_ENCODING,FALSE,&mii);    //enable encoding sub item
       CMainFrame * pMainFrm = (CMainFrame *)GetTopLevelFrame();
       if(pMainFrm != NULL)
       {
           pMainFrm->m_bShowMenuEncoding = TRUE;
           int iSelection = pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, pPoint->x, pPoint->y, pMainFrm, 0);        pMainFrm->m_bShowMenuEncoding = FALSE;
           if (iSelection > 2000  && iSelection < 4000 )   //encoding item id  range is 2000~4000
               {
          ::SendMessage(hwnd, WM_COMMAND, iSelection, NULL);
    }
    else
    {
          ::SendMessage( pMainFrm->m_hWnd, WM_COMMAND, MAKEWPARAM(LOWORD(iSelection), 0x0), 0 );
    }
       }
       FreeLibrary(hinstSHDOCLC);
            return S_OK;
               }
          }
        }
      

  2.   

    http://msdn2.microsoft.com/en-us/library/aa770042.aspx
    // Add language submenu to Encoding context item
       SetMenuItemInfo(hMenu, IDM_LANGUAGE, FALSE, &mii);