• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            旅途

            如果想飛得高,就該把地平線(xiàn)忘掉

            Internet Explorer編程簡(jiǎn)述(七)

            1、概述

            Internet Explorer有實(shí)在太多沒(méi)有公布的東西。上一篇文章《Internet Explorer 編程簡(jiǎn)述(六)自定義瀏覽器上下文菜單》提到的獲取“編碼”菜單的方法就是利用了瀏覽器的上層窗口“Shell DocObject View”的未公布的命令I(lǐng)D。本文將要介紹的是如何用這個(gè)ID把“編碼”菜單放到我們自己的菜單中來(lái)(如工具條上的“編碼”按鈕的下拉菜單)。

            #define SHDVID_GETMIMECSETMENU 27
            ......
            CComPtr spCT;

            hr = pcmdTarget->QueryInterface(IID_IOleCommandTarget, (void**)&spCT);
            ......
            // Get the language submenu
            hr = spCT->Exec(&CGID_ShellDocView, SHDVID_GETMIMECSETMENU, 0, NULL, &var);

            2、原理

            上面指向IOleCommandTarget接口的智能指針spCT是從IDocHostUIHandler::ShowContextMenu的參數(shù)pcmdTarget得到的,它其實(shí)也可以從HTML文檔接口得到,這就是實(shí)現(xiàn)的關(guān)鍵。

            3、實(shí)現(xiàn)

            下面的代碼演示了如何將“編碼”菜單放置到我們自己的編碼菜單上去。

            void CMainFrame::OnDropDown( NMHDR* pNotifyStruct, LRESULT* pResult )

            {

             const UINT CmdID_GetMimeSubMenu = 27;

             // Command ID for getting the Encoding submenu

             NMTOOLBAR* pNMToolBar = ( NMTOOLBAR* )pNotifyStruct;

             CMenu menu;

             CMenu* pPopup = 0;

             CMyHtmlView *pView = NULL;

             m_bIsEncodMenuPopup = false;//標(biāo)志變量,用以在WM_INITMENUPOPUP消息處理函數(shù)中檢查“編碼”菜單

             switch ( pNMToolBar->iItem )

             {

             ......
             case ID_VIEW_ENCODE://按下“編碼”按鈕

             {

              m_bIsEncodMenuPopup = true;

              VERIFY( menu.LoadMenu( IDR_ENCODE ) );//IDR_ENCODE是預(yù)置的“編碼”菜單資源,內(nèi)含任意一項(xiàng)占位用的菜單

              CMyHtmlView = GetActiveMyHtmlView();//檢查當(dāng)前是否存在活動(dòng)的瀏覽器視圖窗口

              if ( pView != NULL )

              {

               LPDISPATCH lpDispatch =pView->GetHtmlDocument();//獲得文檔指針

               if ( lpDispatch != NULL )

               {

                // Get an IDispatch pointer for the IOleCommandTarget interface.

                IOleCommandTarget * pCmdTarget = NULL;

                HRESULT hr = lpDispatch->QueryInterface(IID_IOleCommandTarget, (void**)&pCmdTarget);

                if ( SUCCEEDED( hr ) )

                {

                 VARIANT varEncSubMenu;

                 ::VariantInit( &varEncSubMenu );

                 hr = pCmdTarget->Exec( &::CGID_ShellDocView, CmdID_GetMimeSubMenu, OLECMDEXECOPT_DODEFAULT, NULL, &varEncSubMenu );

                 if ( SUCCEEDED( hr ) )

                 {

                  // 添加“編碼”菜單

                  MENUITEMINFO miiEncoding;

                  ::memset( &miiEncoding, 0, sizeof(MENUITEMINFO) );

                  miiEncoding.cbSize = sizeof(MENUITEMINFO);

                  miiEncoding.fMask = MIIM_SUBMENU;

                  miiEncoding.hSubMenu = reinterpret_cast< HMENU > (varEncSubMenu.byref);

                  menu.SetMenuItemInfo(0, &miiEncoding, TRUE);//丟掉設(shè)計(jì)時(shí)占位用的菜單,替換為“編碼”菜單

                  }

                }

               }

              }

              pPopup = menu.GetSubMenu( 0 );

              break;

             }

             ......

             }

             

             if ( pPopup != 0 )

             {

              CRect rc;

              ::SendMessage( pNMToolBar->hdr.hwndFrom, TB_GETRECT, pNMToolBar->iItem, ( LPARAM )&rc );

              rc.top = rc.bottom;

              ::ClientToScreen( pNMToolBar->hdr.hwndFrom, &rc.TopLeft() );

              long lResult = pPopup->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RETURNCMD, rc.left, rc.top, this );

              m_bIsEncodMenuPopup = false;

              if ( pNMToolBar->iItem == ID_VIEW_ENCODE )

              {

               //其余的事教給瀏覽器去做,參考《Internet Explorer 編程簡(jiǎn)述(五)調(diào)用IE隱藏的命令(中文版)

                CFindIEWnd FindIEWnd( pView->m_wndBrowser.m_hWnd, "Internet Explorer_Server");

               ::SendMessage( FindIEWnd.m_hWnd, WM_COMMAND, MAKEWPARAM(LOWORD(lResult), 0x0), 0 );

              }

              else

              {

               SendMessage( WM_COMMAND, MAKEWPARAM(LOWORD(lResult), 0x0), 0 );

              }

             }

             *pResult = TBDDRET_DEFAULT;

            }


            void CMainFrame::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)

            {

             CMDIFrameWndEx::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);

             if ( m_bIsEncodMenuPopup )

             {

              //默認(rèn)情況下“編碼”的所有菜單項(xiàng)都是Disabled的,在此修改其狀態(tài)為Enabled

              for ( UINT i=0; i GetMenuItemCount(); i++ )

              {

               pPopupMenu->EnableMenuItem( pPopupMenu->GetMenuItemID( i ), MF_ENABLED | MF_BYCOMMAND );

              }

             }

            }

            這樣一來(lái),原本只在瀏覽器上下文菜單中出現(xiàn)的“編碼”菜單就出現(xiàn)在了我們自己的工具條按鈕下拉菜單上,無(wú)需更多的處理,菜單狀態(tài)的改變,編碼的設(shè)置等,一切都教給瀏覽器自己去完成了。


            posted on 2007-07-29 15:18 旅途 閱讀(515) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): BHO

            亚洲国产成人久久笫一页| 国产精品九九久久精品女同亚洲欧美日韩综合区 | 亚洲国产成人久久一区久久| 久久男人中文字幕资源站| 欧美日韩精品久久免费| 97久久国产综合精品女不卡| 久久人人爽人人爽人人片av高请| 久久综合88熟人妻| 午夜不卡888久久| 久久香综合精品久久伊人| 国产精品99精品久久免费| 久久久久国产一区二区| 99久久99久久久精品齐齐 | 91精品国产色综久久 | 久久久久无码国产精品不卡| 免费久久人人爽人人爽av| 亚洲国产天堂久久综合网站 | 亚洲欧美日韩中文久久| 手机看片久久高清国产日韩| 日本久久久精品中文字幕| 五月丁香综合激情六月久久| 狠狠色综合久久久久尤物| 夜夜亚洲天天久久| 亚洲熟妇无码另类久久久| 无码精品久久一区二区三区 | www.久久热| 久久久久久午夜成人影院| 久久久久久国产精品无码超碰| 合区精品久久久中文字幕一区| 国产福利电影一区二区三区久久久久成人精品综合 | 青青国产成人久久91网| 精品国际久久久久999波多野| 久久精品中文字幕一区| 色综合久久无码五十路人妻| 四虎亚洲国产成人久久精品| 久久久久一级精品亚洲国产成人综合AV区| 国产精品国色综合久久| 久久免费视频网站| 99久久精品免费看国产一区二区三区 | 亚洲AV无码久久精品狠狠爱浪潮| 久久久久国产亚洲AV麻豆|