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