Blog gunsmoker (fordítások) hogyan kezelheti icontextmenu, 1. rész - bevezető szó

Hogyan kezeljük az IContextMenu-t, 1. rész - bevezetőszó

Az IContextMenu a következőképpen használható:
  • Létrehozása.
  • IContextMenu.QueryContextMenu. Ez inicializálja a helyi menüt. A hívás alatt a helyi menü határozza meg, hogy mely elemeket jelenítse meg az elküldött zászlók alapján.
  • Mutassa be a menüt vagy válassza ki a parancsot más módon, az IContextMenu.GetCommandString segítségével. IContextMenu2.HandleMenuMsg és IContextMenu3.HandleMenuMsg 2 a felhasználói interakció feltérképezéséhez.
  • IContextMenu.InvokeCommand. Ez a hívás végrehajtja a parancsot.
Ezeknek a műveleteknek a részleteit a Context Menu Context Creation Context Menu Handlerek az IContextMenu implementáló szemszögéből magyarázzák.
A shell először hívja az IContextMenu.QueryContextMenu nevet. Átmegy a HMENU-leíróhoz, amelyet a módszer az elemek helyi környezetbe való felvételéhez használhat. Ha a felhasználó kiválasztja az egyik parancsot, akkor az IContextMenu.GetCommandString megkapja, hogy megkapja a Microsoft Windows Intézőben a státuszsávon megjelenő parancssort. Ha a felhasználó az egyik menüpontra kattint, a shell meghívja az IContextMenu.InvokeCommandot. Ezután a kezelő végrehajthatja a parancs műveleteit. Olvassa el ezt a másik oldalról, és látni fogja, mit kell tennie az IContextMenu használatához:
Az IContextMenu vezérlő először hívja az IContextMenu.QueryContextMenu nevet. Átmegy a HMENU-leíróhoz, amelyet a módszer az elemek helyi környezetbe való felvételéhez használhat. Ha a felhasználó kiválasztja az egyik parancsot, akkor az IContextMenu.GetCommandString megkapja, hogy megkapja a prompt karakterláncot, amely megjelenik a hívó állapotsorában. Ha a felhasználó az egyik menüelemre kattint, az IContextMenu menedzser felhívja az IContextMenu.InvokeCommandot. Ezután a kezelő végrehajthatja a parancs műveleteit. A kontextus menü dokumentációinak új értelmezésének következményeiről szóló tanulmány a következő hetekben fog összpontosítani.

Oké, kezdjük el. Kezdjük, mint mindig, egy üres VCL alkalmazással. Feltételezem, hogy már ismeri a shell névteret és a pidl-et, ezért összpontosítok a helyi menü problémájára.


Ez az egyszerű funkció veszi az utat, és megkapja az UI shell objektumot. A PIDL elérési útját SHParseDisplayName segítségével konvertáljuk. majd az SHBindToParent használatával kösse össze (bind) a PIDL szülővel. akkor az IShellFolder.GetUIObjectOf használatával lekérdezzük az UI objektum szülőjét. Feltételezem, hogy elég tapasztalata van a névtérrel, hogy ez a kód ne okozzon problémákat.

(Kiegészítő funkció típus SHParseDisplayName SHBindToParent, és nem csinál semmit, amit nem tehetett maguknak. Ők csak menteni az idő, hogy kódot nyomtat. Ha elkezdi használni a shell névtér folyamatosan gyűjt a saját könyvtárát kis kiegészítő funkciókat, mint például ezek).

A mi első alkalommal, minden, mi - csak hívja a műveletet (ige) „Play” a fájlt, amikor a felhasználó rákattint a jobb oldali gombot (miért jobb, mert a következő verzió, akkor megjelenik egy helyi menü?).


Amint az a fenti listában, akkor először létre a IContextMenu, majd inicializálja hívja IContextMenu.QueryContextMenu. Vegye figyelembe, hogy annak ellenére, hogy nem fogunk mutatni a helyi menü, mi kell még, hogy hozzon létre egy felugró menü, mert ez szükségessé IContextMenu.QueryContextMenu. Általában azonban nem jelenik meg az eredményül kapott menü; ahelyett, hogy a felhasználó számára, hogy a választás a menüből, mi csináljuk a felhasználó kiválasztja a cselekvés „Play”, kitöltve a poszt TCMInvokeCommandInfo és okozza.

De honnan tudjuk, hogy a cselekvés (ige) "Play" lesz? Esetünkben ezt tudjuk, mert határozottan varrják a kódot a fájl elérési útját „clock.avi”, és tudjuk, hogy az AVI fájlokat egy „Play” akció. De, persze, ez nem fog működni az általános esetben (kb. Lane. Ha fut a példát, hogy győződjön meg arról, hogy van a fájl, vagy típus bármilyen más névre, és látni, hogy milyen lépéseket kell az adott fájltípust. Ezen túlmenően, Még az AVI-fájlok esetében is lehetséges, hogy a műveleteket átcsoportosíthatja, ha egyes játékosok megváltoztatták az egyesületeket). Mielőtt hívja az alapértelmezett műveletet (alapértelmezett ige), nézzük először schag könnyebb és felkéri a felhasználót, hogy válasszon egy műveletet hívni. Tény, hogy ez a gyakorlat elvonja a mi utunk, de a végén vissza fogunk térni a választott alapértelmezett művelet.

Ha a fenti kód mindössze annyira szükséges (hogy rögzített fájlt hívjon a fájlhoz), akkor nem kell átvezetnie a többi műveletet a helyi menüben. A fenti kód megegyezik a ShellExecuteEx funkció hívásával. átadva a SEE_MASK_INVOKEIDLIST zászlót annak jelzésére, hogy a meghívást az IContextMenu-ra kell átírni.