www.gusucode.com > VC++网页浏览器制作实例-源码程序 > VC++网页浏览器制作实例-源码程序/code/CHtmlViewProjV2/CustomMenus.cpp
// CustomMenus.cpp : An example of how to customize the WBC menus // Download by http://www.NewXing.com #include "stdafx.h" #include <mshtmhst.h> #include <mshtmcid.h> #include "CustomMenus.h" #include "resource.h" #define IDR_BROWSE_CONTEXT_MENU 24641 #define IDM_EXTRA_ITEM 6047 HRESULT ModifyContextMenu(DWORD dwID, POINT *ppt, IUnknown *pcmdtReserved); HRESULT CustomContextMenu(POINT *ppt, IUnknown *pcmdtReserved); HRESULT CustomShowContextMenu(UINT mode, DWORD dwID, POINT *pptPosition, IUnknown *pCommandTarget, IDispatch *pDispatchObjectHit) { HRESULT result = S_FALSE; //Dont Interfere switch ( mode ) { case kDefaultMenuSupport: break; case kNoContextMenu: result = S_OK; break; case kTextSelectionOnly: if (dwID != CONTEXT_MENU_TEXTSELECT) result = S_OK; break; case kAllowAllButViewSource: if (dwID == CONTEXT_MENU_DEFAULT) result = ModifyContextMenu(dwID, pptPosition, pCommandTarget); break; case kCustomMenuSupport: if (dwID == CONTEXT_MENU_DEFAULT) result = CustomContextMenu(pptPosition, pCommandTarget); break; } return result; } HRESULT ModifyContextMenu(DWORD dwID, POINT *ppt, IUnknown *pcmdtReserved) { ASSERT((ppt != NULL) && (pcmdtReserved != NULL)); if ((ppt == NULL) || (pcmdtReserved == NULL)) return S_OK; //#define IDR_BROWSE_CONTEXT_MENU 24641 //#define IDR_FORM_CONTEXT_MENU 24640 #define SHDVID_GETMIMECSETMENU 27 #define SHDVID_ADDMENUEXTENSIONS 53 HRESULT hr; HINSTANCE hinstSHDOCLC; HWND hwnd; HMENU hMenu; IOleCommandTarget *spCT; IOleWindow *spWnd; MENUITEMINFO mii = {0}; VARIANT var, var1, var2; hr = pcmdtReserved->QueryInterface(IID_IOleCommandTarget, (void**)&spCT); hr = pcmdtReserved->QueryInterface(IID_IOleWindow, (void**)&spWnd); hr = spWnd->GetWindow(&hwnd); hinstSHDOCLC = LoadLibrary(TEXT("SHDOCLC.DLL")); hMenu = LoadMenu(hinstSHDOCLC, MAKEINTRESOURCE(IDR_BROWSE_CONTEXT_MENU)); hMenu = GetSubMenu(hMenu, dwID); // Get the language submenu hr = spCT->Exec(&CGID_ShellDocView, SHDVID_GETMIMECSETMENU, 0, NULL, &var); mii.cbSize = sizeof(mii); mii.fMask = MIIM_SUBMENU; mii.hSubMenu = (HMENU) var.byref; // Add language submenu to Encoding context item SetMenuItemInfo(hMenu, IDM_LANGUAGE, FALSE, &mii); // Insert Shortcut Menu Extensions from registry V_VT(&var1) = VT_PTR; V_BYREF(&var1) = hMenu; V_VT(&var2) = VT_I4; V_I4(&var2) = dwID; hr = spCT->Exec(&CGID_ShellDocView, SHDVID_ADDMENUEXTENSIONS, 0, &var1, &var2); // Remove View Source ::DeleteMenu(hMenu, IDM_VIEWSOURCE, MF_BYCOMMAND); // Remove the item that produces the exta separator ::DeleteMenu(hMenu, IDM_EXTRA_ITEM, MF_BYCOMMAND); // Show shortcut menu int iSelection = ::TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, ppt->x, ppt->y, 0, hwnd, (RECT*)NULL); // Send selected shortcut menu item command to shell if (iSelection != 0) LRESULT lr = ::SendMessage(hwnd, WM_COMMAND, iSelection, NULL); FreeLibrary(hinstSHDOCLC); return S_OK; } HRESULT CustomContextMenu(POINT *ppt, IUnknown *pcmdtReserved) { IOleWindow *oleWnd = NULL; HWND hwnd = NULL; HMENU hMainMenu = NULL; HMENU hPopupMenu = NULL; HRESULT hr = 0; INT iSelection = 0; if ((ppt == NULL) || (pcmdtReserved == NULL)) goto error; hr = pcmdtReserved->QueryInterface(IID_IOleWindow, (void**)&oleWnd); if ( (hr != S_OK) || (oleWnd == NULL)) goto error; hr = oleWnd->GetWindow(&hwnd); if ( (hr != S_OK) || (hwnd == NULL)) goto error; hMainMenu = LoadMenu(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_CUSTOM_POPUP)); if (hMainMenu == NULL) goto error; hPopupMenu = GetSubMenu(hMainMenu, 0); if (hPopupMenu == NULL) goto error; // Show shortcut menu iSelection = ::TrackPopupMenu(hPopupMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, ppt->x, ppt->y, 0, hwnd, (RECT*)NULL); // Send selected shortcut menu item command to shell if (iSelection != 0) (void) ::SendMessage(hwnd, WM_COMMAND, iSelection, NULL); error: if (hMainMenu != NULL) ::DestroyMenu(hMainMenu); return S_OK; }