Aracılığıyla paylaş


IContextMenu Arayüzünü Uygula Nasıl

IContextMenu, uygulanacak en güçlü ama aynı zamanda en karmaşık arabirimdir. Statik fiil yöntemlerinden birini kullanarak bir fiil uygulamanızı kesinlikle öneririz. Daha fazla bilgi için bkz. Statik veya Dinamik Kısayol Menü Yöntemi Seçme. IContextMenu, GetCommandString, InvokeCommandve QueryContextMenuadlı üç yöntemi vardır. Bu yöntemler burada ayrıntılı olarak ele alınmıştır.

Bilmeniz gerekenler

Teknolojileri

  • C++

Önkoşullar

  • Statik Fiil
  • Kısayol Menüsü

Talimatlar

IContextMenu::GetCommandString Yöntemi

İşleyicinin IContextMenu::GetCommandString yöntemi, fiilin kurallı adını döndürmek için kullanılır. Bu yöntem isteğe bağlıdır. Windows XP'de ve Windows'un önceki sürümlerinde, Windows Gezgini'nde Durum çubuğu olduğunda, bu yöntem bir menü öğesinin Durum çubuğunda görüntülenen yardım metnini almak için kullanılır.

idCmd parametresi, IContextMenu::QueryContextMenu çağrıldığında tanımlanan komutun tanımlayıcı uzaklığını tutar. Bir yardım dizesi istenirse uFlagsGCS_HELPTEXTWolarak ayarlanır. Yardım dizesini pszName arabelleğine kopyalayın ve bunu bir PWSTRolarak çevirin. uFlags'i GCS_VERBWolarak ayarlayarak fiil dizesi talep edilir. Yardım dizesinde olduğu gibi uygun dizeyi pszName'e kopyalayın. GCS_VALIDATEA ve GCS_VALIDATEW bayrakları kısayol menü işleyicileri tarafından kullanılmaz.

Aşağıdaki örnekte, bu konunun IContextMenu::QueryContextMenu Metodu bölümünde verilen QueryContextMenu örneğine karşılık gelen GetCommandString basit bir uygulaması gösterilmektedir. İşleyici yalnızca bir menü öğesi eklediğinden, döndürülebilecek yalnızca bir dize kümesi vardır. yöntemi idCmd geçerli olup olmadığını test eder ve geçerliyse istenen dizeyi döndürür.

StringCchCopy işlevi, kopyalanan dizenin cchNametarafından belirtilen arabellek boyutunu aşmadığından emin olmak için istenen dizeyi pszName kopyalamak için kullanılır. Bu örnek yalnızca uFlagsUnicode değerleri için destek uygular çünkü Windows 2000'den bu yana Windows Gezgini'nde yalnızca bunlar kullanılmıştır.

IFACEMETHODIMP CMenuExtension::GetCommandString(UINT idCommand, 
                                                UINT uFlags, 
                                                UINT *pReserved, 
                                                PSTR pszName, 
                                                UINT cchName)
{
    HRESULT hr = E_INVALIDARG;

    if (idCommand == IDM_DISPLAY)
    {
        switch (uFlags)
        {
            case GCS_HELPTEXTW:
                // Only useful for pre-Vista versions of Windows that 
                // have a Status bar.
                hr = StringCchCopyW(reinterpret_cast<PWSTR>(pszName), 
                                    cchName, 
                                    L"Display File Name");
                break; 

            case GCS_VERBW:
                // GCS_VERBW is an optional feature that enables a caller
                // to discover the canonical name for the verb that is passed in
                // through idCommand.
                hr = StringCchCopyW(reinterpret_cast<PWSTR>(pszName), 
                                    cchName, 
                                    L"DisplayFileName");
                break; 
        }
    }
    return hr;
}

IContextMenu::InvokeCommand Yöntemi

Bu yöntem, kullanıcı işleyiciye ilişkili komutu çalıştırmasını söylemek için bir menü öğesine tıkladığında çağrılır. pici parametresi, komutu çalıştırmak için gereken bilgileri içeren bir yapıyı gösterir.

pici Shlobj.h'de CMINVOKECOMMANDINFO yapısı olarak bildirilir, ancak uygulamada genellikle CMINVOKECOMMANDINFOEX yapısına işaret eder. Bu yapı, CMINVOKECOMMANDINFO genişletilmiş bir sürümüdür ve Unicode dizeleri geçirmeyi mümkün hale getiren birkaç ek üyesi vardır.

Hangi yapının geçirildiğini belirlemek için cbSize üyesini pici üzerinde denetleyin. bir CMINVOKECOMMANDINFOEX yapısı ise ve fMask üyesi CMIC_MASK_UNICODE bayrağına sahipse, pici'yi CMINVOKECOMMANDINFOEXolarak dönüştürün. Bu, uygulamanızın yapının son beş üyesinde yer alan Unicode bilgilerini kullanmasını sağlar.

Yürütülecek komutu tanımlamak için yapının lpVerb veya lpVerbW üyesi kullanılır. Komutlar aşağıdaki iki yöntemden biriyle tanımlanır:

  • Komutun fiil dizesine göre
  • Komutun tanımlayıcı uzaklığına göre

Bu iki durumu ayırt etmek için, ANSI durumu için lpVerb'ün yüksek dereceli kelimesini veya Unicode durumu için lpVerbW'ü kontrol edin. Yüksek sıralı sözcük sıfır değilse lpVerb veya lpVerbW bir fiil dizesi tutar. Yüksek sıralı sözcük sıfırsa, komut uzaklığı lpVerbdüşük sıralı sözcüğündedir.

Aşağıdaki örnekte, IContextMenu::InvokeCommandIContextMenu::QueryContextMenukarşılık gelen ve bu bölümden önce ve sonra verilen IContextMenu::GetCommandStringörnekleribasit bir uygulaması gösterilmektedir. Yöntem önce hangi yapının iletildiğini belirler. Ardından komutun uzaklığıyla mı yoksa fiiliyle mi tanımlanıp tanımlanmadığını belirler. lpVerb veya lpVerbW geçerli bir fiil veya konum içeriği tuttuğunda, yöntem bir ileti kutusu görüntüler.

STDMETHODIMP CShellExtension::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
{
    BOOL fEx = FALSE;
    BOOL fUnicode = FALSE;

    if(lpcmi->cbSize == sizeof(CMINVOKECOMMANDINFOEX))
    {
        fEx = TRUE;
        if((lpcmi->fMask & CMIC_MASK_UNICODE))
        {
            fUnicode = TRUE;
        }
    }

    if( !fUnicode && HIWORD(lpcmi->lpVerb))
    {
        if(StrCmpIA(lpcmi->lpVerb, m_pszVerb))
        {
            return E_FAIL;
        }
    }

    else if( fUnicode && HIWORD(((CMINVOKECOMMANDINFOEX *) lpcmi)->lpVerbW))
    {
        if(StrCmpIW(((CMINVOKECOMMANDINFOEX *)lpcmi)->lpVerbW, m_pwszVerb))
        {
            return E_FAIL;
        }
    }

    else if(LOWORD(lpcmi->lpVerb) != IDM_DISPLAY)
    {
        return E_FAIL;
    }

    else
    {
        MessageBox(lpcmi->hwnd,
                   "The File Name",
                   "File Name",
                   MB_OK|MB_ICONINFORMATION);
    }

    return S_OK;
}

IContextMenu::QueryContextMenu Yöntemi

Kabuk IContextMenu::QueryContextMenu çağırarak kısayol menü işleyicisinin menü öğelerini menüye eklemesini sağlar. HMENU tutamacı, hmenu parametresinde geçirilir. indexMenu parametresi, eklenecek ilk menü öğesi için kullanılacak dizine ayarlanır.

İşleyici tarafından eklenen tüm menü öğelerinin idCmdFirst ve idCmdLast parametrelerindeki değerler arasında kalan tanımlayıcıları olmalıdır. Genellikle ilk komut tanımlayıcısı idCmdFirstolarak ayarlanır ve her ek komut için bir (1) artırılır. Bu uygulama, idCmdLast aşmaktan kaçınmanıza yardımcı olur ve Shell'in birden fazla işleyici çağırması durumunda kullanılabilir tanımlayıcı sayısını en üst düzeye çıkarır.

Öğe tanımlayıcısının komut uzaklığı, tanımlayıcı ile idCmdFirstiçindeki değer arasındaki farktır. İşleyicinizin kısayol menüsüne eklediği her öğenin ofsetini depolayın, çünkü Kabuk, daha sonra IContextMenu::GetCommandString veya IContextMenu::InvokeCommandçağırdığı öğeyi tanımlamak için bu ofseti kullanabilir.

Ayrıca, eklediğiniz her komuta bir fiili atamanız gerekir. Fiil, InvokeCommandçağrıldığında komutu tanımlamak için uzaklık yerine kullanılabilecek bir dizedir. Ayrıca, kısayol menü komutlarını yürütmek için ShellExecuteEx gibi işlevler tarafından da kullanılır.

uFlags parametresine, kısayol menüsü işleyicileriyle ilgili üç bayrak geçirilebilir. Bunlar aşağıdaki tabloda açıklanmıştır.

Bayrak Açıklama
CMF_DEFAULTONLY Kullanıcı varsayılan komutu seçti, genellikle nesneye çift tıklayarak. IContextMenu::QueryContextMenu, menüyü değiştirmeden denetimi Shell'e döndürmelidir.
CMF_NODEFAULT Menüdeki hiçbir öğe varsayılan öğe olmamalıdır. yöntemi, komutlarını menüye eklemelidir.
CMF_NORMAL Kısayol menüsü normal şekilde görüntülenir. yöntemi, komutlarını menüye eklemelidir.

 

Listeye menü öğeleri eklemek için InsertMenuveya InsertMenuItemkullanın. Ardından önem derecesi SEVERITY_SUCCESS olarak ayarlanmış bir HRESULT değeri döndürür. Kod değerini atanan en büyük komut tanımlayıcısının uzaklığına, artı bir (1) olarak ayarlayın. Örneğin, idCmdFirst 5 olarak ayarlandığını ve menüye 5, 7 ve 8 komut tanımlayıcıları içeren üç öğe eklediğinizi varsayalım. Dönüş değeri MAKE_HRESULT(SEVERITY_SUCCESS, 0, 8 + 1) olmalıdır.

Aşağıdaki örnekte, tek bir komut ekleyen QueryContextMenu basit bir uygulaması gösterilmektedir. Komutun tanımlayıcı uzaklığı sıfır olarak ayarlanmış IDM_DISPLAY. m_pszVerb ve m_pwszVerb değişkenleri, ilişkili dilden bağımsız fiil dizesini hem ANSI hem de Unicode biçimlerinde depolamak için kullanılan özel değişkenlerdir.

#define IDM_DISPLAY 0

STDMETHODIMP CMenuExtension::QueryContextMenu(HMENU hMenu,
                                              UINT indexMenu,
                                              UINT idCmdFirst,
                                              UINT idCmdLast,
                                              UINT uFlags)
{
    HRESULT hr;
    
    if(!(CMF_DEFAULTONLY & uFlags))
    {
        InsertMenu(hMenu, 
                   indexMenu, 
                   MF_STRING | MF_BYPOSITION, 
                   idCmdFirst + IDM_DISPLAY, 
                   "&Display File Name");

    
        
        hr = StringCbCopyA(m_pszVerb, sizeof(m_pszVerb), "display");
        hr = StringCbCopyW(m_pwszVerb, sizeof(m_pwszVerb), L"display");

        return MAKE_HRESULT(SEVERITY_SUCCESS, 0, USHORT(IDM_DISPLAY + 1));
    }

    return MAKE_HRESULT(SEVERITY_SUCCESS, 0, USHORT(0));}

Açıklamalar

Diğer fiil uygulama görevleri için bkz. Kısayol Menüsü İşleyicileri Oluşturma.