Aracılığıyla paylaş


Araç Çubuklarını Özelleştirme

Çoğu Windows tabanlı uygulama, kullanıcılara program işlevselliğine kolay erişim sağlamak için araç çubuğu denetimlerini kullanır. Ancak, statik araç çubuklarının bazı eksiklikleri vardır; örneğin kullanılabilir tüm araçları etkili bir şekilde görüntüleyemeyecek kadar az alan. Bu sorunun çözümü, uygulamanızın araç çubuklarını kullanıcı tarafından özelleştirilebilir hale getirmektir. Daha sonra kullanıcılar yalnızca ihtiyaç duydukları araçları görüntülemeyi seçebilir ve bunları kişisel çalışma tarzına uygun bir şekilde düzenleyebilir.

Not

İletişim kutularındaki araç çubukları özelleştirilemez.

 

Özelleştirmeyi etkinleştirmek için, araç çubuğu denetimini oluştururken CCS_ADJUSTABLE ortak denetim stili bayrağını ekleyin. Özelleştirmeye yönelik iki temel yaklaşım vardır:

  • Özelleştirme iletişim kutusu. Bu sistem tarafından sağlanan iletişim kutusu en basit yaklaşımdır. Kullanıcılara simgeleri eklemelerine, silmelerine veya taşımalarına olanak tanıyan bir grafik kullanıcı arabirimi sağlar.
  • Araçları sürükleme ve bırakma. Sürükle bırak işlevinin uygulanması, kullanıcıların araçları araç çubuğunda başka bir konuma taşımasına veya araç çubuğundan sürükleyerek silmesine olanak tanır. Kullanıcılara araç çubuklarını düzenlemek için hızlı ve kolay bir yol sağlar, ancak araç eklemelerine izin vermez.

Uygulamanın gereksinimlerine bağlı olarak yaklaşımı veya her ikisini birden uygulayabilirsiniz. Özelleştirmeye yönelik bu iki yaklaşımın hiçbiri, araç çubuğunu eski durumuna döndürmek için İptal veya Geri Al düğmesi gibi yerleşik bir mekanizma sağlamaz. Araç çubuğunun önsözleşme durumunu depolamak için araç çubuğu denetim API'sini açıkça kullanmanız gerekir. Gerekirse, daha sonra bu depolanan bilgileri kullanarak araç çubuğunu özgün durumuna geri yükleyebilirsiniz.

Bilmeniz gerekenler

Teknolojileri

Önkoşullar

  • C/C++
  • Windows Kullanıcı Arabirimi Programlama

Talimat

Özelleştirme İletişim Kutusu

Özelleştirme iletişim kutusu, kullanıcılara araç eklemek, taşımak veya silmek için basit bir yol sağlamak için araç çubuğu denetimi tarafından sağlanır. Kullanıcılar araç çubuğuna çift tıklayarak başlatabilir. Uygulamalar, araç çubuğu denetimine bir TB_CUSTOMIZE iletisi göndererek özelleştirme iletişim kutusunu program aracılığıyla başlatabilir.

Aşağıdaki çizimde araç çubuğu özelleştirme iletişim kutusunun bir örneği gösterilmektedir.

Üç öğeli araç çubuğuna sahip bir pencerenin ekran görüntüsünü ve kullanılabilir ve geçerli araç çubuğu düğmelerinin listelerini içeren bir iletişim kutusunun

Sağdaki liste kutusundaki araçlar şu anda araç çubuğundaki araçlardır. Başlangıçta, bu liste araç çubuğunu oluştururken belirttiğiniz araçları içerir. Soldaki liste kutusu, araç çubuğuna eklenebilecek araçları içerir. Uygulamanız bu listeyi (otomatik olarak görüntülenen Ayırıcı dışında) doldurmaktan sorumludur.

Araç çubuğu denetimi, özelleştirme iletişim kutusu başlattığını uygulamanıza bildirmek için üst penceresine önce bir TBN_BEGINADJUST bildirim kodu, ardından bir TBN_INITCUSTOMIZE bildirim kodu gönderir. Çoğu durumda uygulamanın bu bildirim kodlarını yanıtlaması gerekmez. Ancak Araç Çubuğunu Özelleştir iletişim kutusunun Yardım düğmesini görüntülemesini istemiyorsanız, TBNRF_HIDEHELP döndürerek TBN_INITCUSTOMIZE işleyin.

Araç çubuğu denetimi daha sonra aşağıdaki sırayla üç bildirim kodu serisi göndererek iletişim kutusunu başlatmak için gereken bilgileri toplar:

  • Düğmelerin nereye eklenebileceğini belirlemek için araç çubuğundaki her düğme için TBN_QUERYINSERT bildirim kodu. Bildirim iletisinde belirtilen düğmenin soluna bir düğme eklenmesini önlemek amacıyla FALSE döndürün. tüm TBN_QUERYINSERT bildirim kodlarına FALSE döndürürseniz, iletişim kutusu görüntülenmez.
  • Araç çubuğunda yer alan her bir araç için TBN_QUERYDELETE bildirim kodu. Bir aracın silinip silinemeyeceğini belirlemek için TRUE döndürün, değilse FALSE döndürün.
  • Kullanılabilir düğmelerin listesini doldurmak için TBN_GETBUTTONINFO bildirim kodlarından oluşan bir dizi. Listeye düğme eklemek için, bildirim koduyla geçirilen NMTOOLBAR yapısını doldurun ve TRUEdöndürün. Ekleyeceğiniz başka araç kalmadığında, FALSEgeri dönün. Araç çubuğunda bulunan düğmelerle ilgili bilgileri döndürebileceğinizi unutmayın; bu düğmeler listeye eklenmez.

ardından iletişim kutusu görüntülenir ve kullanıcı araç çubuğunu özelleştirmeye başlayabilir.

İletişim kutusu açık olduğunda, uygulamanız kullanıcının eylemlerine bağlı olarak çeşitli bildirim kodları alabilir:

  • TBN_QUERYINSERT. Kullanıcı araç çubuğundaki bir aracın konumunu değiştirmiştir veya bir araç eklemiştir. Aracın bu konuma eklenmesini önlemek için FALSE döndürebilirsiniz.
  • TBN_DELETINGBUTTON. Kullanıcı araç çubuğundan bir aracı kaldırmak üzere.
  • TBN_CUSTHELP. Kullanıcı Yardım düğmesine tıkladı.
  • TBN_TOOLBARCHANGE. Kullanıcı bir araç ekledi, taşıdı veya sildi.
  • TBN_RESET. Kullanıcı Sıfırla düğmesine tıkladı.

İletişim kutusu yok edildikten sonra uygulamanız bir TBN_ENDADJUST bildirim kodu alır.

Aşağıdaki kod örneği araç çubuğu özelleştirmesini uygulamanın bir yolunu gösterir.

// The buttons are stored in an array of TBBUTTON structures. 
//
// Constants such as STD_FILENEW are identifiers for the 
// built-in bitmaps that have already been assigned as the toolbar's 
// image list.
//
// Constants such as IDM_NEW are application-defined command identifiers.

TBBUTTON allButtons[] = 
    {
        { MAKELONG(STD_FILENEW,  ImageListID), IDM_NEW,   TBSTATE_ENABLED, 0, {0}, 0, (INT_PTR)L"New" },
        { MAKELONG(STD_FILEOPEN, ImageListID), IDM_OPEN,  TBSTATE_ENABLED, 0, {0}, 0, (INT_PTR)L"Open"},
        { MAKELONG(STD_FILESAVE, ImageListID), IDM_SAVE,  TBSTATE_ENABLED, 0, {0}, 0, (INT_PTR)L"Save"},
        { MAKELONG(STD_CUT,      ImageListID), IDM_CUT,   TBSTATE_ENABLED, 0, {0}, 0, (INT_PTR)L"Cut" },
        { MAKELONG(STD_COPY,     ImageListID), IDM_COPY,  TBSTATE_ENABLED, 0, {0}, 0, (INT_PTR)L"Copy"},
        { MAKELONG(STD_PASTE,    ImageListID), IDM_PASTE, TBSTATE_ENABLED, 0, {0}, 0, (INT_PTR)L"Paste"}
    };

// The following appears in the window's message handler.

case WM_NOTIFY: 
    {
        switch (((LPNMHDR)lParam)->code) 
        {
        
        case TBN_GETBUTTONINFO:  
            {
                LPTBNOTIFY lpTbNotify = (LPTBNOTIFY)lParam;

                // Pass the next button from the array. There is no need to filter out buttons
                // that are already used—they will be ignored.
                
                int buttonCount = sizeof(allButtons) / sizeof(TBBUTTON);
                
                if (lpTbNotify->iItem < buttonCount)
                {
                    lpTbNotify->tbButton = allButtons[lpTbNotify->iItem];
                    return TRUE;
                }
                
                else
                
                {
                    return FALSE;  // No more buttons.
                }
            }
            
            break;

            case TBN_QUERYINSERT:
            
            case TBN_QUERYDELETE:
                return TRUE; 
        }
    }

Sürükleme ve Bırakma Araçları

Kullanıcılar ayrıca SHIFT tuşuna basarak ve düğmeyi başka bir konuma sürükleyerek araç çubuğundaki düğmeleri yeniden düzenleyebilir. Sürükle ve bırak işlemi araç çubuğu denetimi tarafından otomatik olarak işlenir. Düğme sürüklendiğinde hayalet görüntüsünü gösterir ve bırakıldığında araç çubuğunu yeniden düzenler. Kullanıcılar bu şekilde düğme ekleyemez, ancak düğmeyi araç çubuğundan bırakarak silebilirler.

Araç çubuğu denetimi normalde bu işlemi otomatik olarak yapar ancak uygulamanıza iki bildirim kodu da gönderir: TBN_QUERYDELETE ve TBN_QUERYINSERT. Sürükle ve bırak işlemini denetlemek için şu bildirim kodlarını aşağıdaki gibi işleyin:

  • TBN_QUERYDELETE bildirim kodu, kullanıcı düğmeyi taşımaya çalıştığı anda, hayalet düğme görüntülenmeden önce gönderilir. Düğmenin taşınmasını önlemek için FALSE döndürün. TRUEdöndürürseniz, kullanıcı aracı taşıyabilir veya araç çubuğundan çıkararak silebilir. Bir araç taşınabilirse silinebilir. Ancak, kullanıcı bir aracı silerse, araç çubuğu denetimi uygulamanıza bir TBN_DELETINGBUTTON bildirim kodu gönderir; bu noktada düğmeyi özgün konumuna yeniden eklemeyi seçebilir ve böylece silme işlemini iptal edebilirsiniz.
  • TBN_QUERYINSERT bildirim kodu, kullanıcı düğmeyi araç çubuğuna bırakmayı denediğinde gönderilir. Taşınan düğmenin bildirimde belirtilen düğmenin soluna bırakılmasını önlemek için FALSE döndürebilirsiniz. Kullanıcı aracı araç çubuğundan atarsa bu bildirim kodu gönderilmez.

Kullanıcı SHIFT tuşuna basmadan bir düğmeyi sürüklemeye çalışırsa, araç çubuğu denetimi sürükle ve bırak işlemini işlemez. Ancak, uygulamanıza bir sürükleme işleminin başlangıcını göstermek için bir TBN_BEGINDRAG bildirim kodu ve sonunu belirtmek için bir TBN_ENDDRAG bildirim kodu gönderir. Bu sürükle bırak biçimini etkinleştirmek istiyorsanız, uygulamanızın bu bildirim kodlarını işlemesi, gerekli kullanıcı arabirimini sağlaması ve araç çubuğunu değişiklikleri yansıtacak şekilde değiştirmesi gerekir.

Araç Çubuklarını Kaydetme ve Geri Yükleme

Araç çubuğunu özelleştirme işleminde, uygulamanızın araç çubuğunu özgün durumuna geri yükleyebilmeniz için bilgileri kaydetmesi gerekebilir. Araç çubuğu durumunu kaydetmeyi veya geri yüklemeyi başlatmak için, araç çubuğu denetimine wParam true olarak ayarlanmış bir TB_SAVERESTORE iletisi gönderin. Bu iletinin wParam değeri, kaydetme veya geri yükleme işlemi isteyip istemediğinizi belirtir. İleti gönderildikten sonra kaydetme/geri yükleme işlemini işlemenin iki yolu vardır:

  • sürüm 4.72 ve önceki ortak denetimlerle, TBN_GETBUTTONINFO işleyicisi uygulamanız gerekir. Araç çubuğu denetimi, geri yüklenirken her düğme hakkında bilgi istemek için bu bildirim kodunu gönderir.
  • Sürüm 5.80 bir kaydetme/geri yükleme seçeneği içerir. İşlemin başlangıcında ve her düğme kaydedilirken veya geri yüklenirken uygulamanız bir TBN_SAVE veya TBN_RESTORE bildirim kodu alır. Bu seçeneği kullanmak için, araç çubuğu durumunu başarıyla kaydetmek veya geri yüklemek için gereken bit eşlem ve durum bilgilerini sağlamak için bildirim işleyicileri uygulamanız gerekir.

Araç çubuğu durumları, uygulama tanımlı veri bloklarıyla değişen, Kabuk tarafından tanımlanan veri bloklarından oluşan bir veri akışına kaydedilir. Her düğme için her türden bir veri bloğu ve uygulamaların akışın başına yerleştirebileceği isteğe bağlı genel veri bloğu depolanır. Kaydetme işlemi sırasında, TBN_SAVE işleyiciniz uygulama tanımlı blokları veri akışına ekler. Geri yükleme işlemi sırasında TBN_RESTORE işleyicisi her bloğu okur ve Shell'e araç çubuğunu yeniden yapılandırmak için gereken bilgileri verir.

TBN_SAVE Bildirimini İşleme

İlk TBN_SAVE bildirim kodu, kaydetme işleminin başlangıcında gönderilir. Herhangi bir düğme kaydedilmeden önce, NMTBSAVE yapısının üyeleri aşağıdaki tabloda gösterildiği gibi ayarlanır.

Üye Ayarlar
iItem -1
cbData Kabuk tanımlı veriler için gereken bellek miktarı.
cButtons Düğme sayısı.
pData Uygulama tanımlı veriler için gereken hesaplanan bellek miktarı. Genellikle, bazı genel verileri ve her düğme için verileri eklersiniz. Bu değeri cbData 'e ekleyin ve hepsini tutabilecek şekilde pData 'e yeterli bellek ayırın.
pGüncel Veri akışındaki ilk kullanılmayan bayt. Genel araç çubuğu bilgilerine ihtiyacınız yoksa, pCurrent = pData'ü veri akışının başlangıcına işaret edecek şekilde ayarlayın. Genel araç çubuğu bilgilerine ihtiyacınız varsa, bu bilgileri pDatakonumunda depolayın ve döndürmeden önce pCurrent veri akışının kullanılmayan bölümünün başına ayarlayın.

 

Bazı genel araç çubuğu bilgileri eklemek istiyorsanız, bunu veri akışının başlangıcına yerleştirin. pCurrent 'yi küresel verilerin sonuna ilerletin, böylece veri akışının kullanılmayan bölümünün başlangıcına işaret etsin ve işlemi sonlandırın.

Siz döndükten sonra, Shell düğme bilgilerini kaydetmeye başlar. pCurrent'daki ilk düğme için Kabuk tanımlı verileri ekler ve pCurrent kullanılmayan bölümün başlangıcına ilerler.

Her düğme kaydedildikten sonra bir TBN_SAVE bildirim kodu gönderilir ve bu üyeler aşağıdaki gibi ayarlanarak NMTBSAVE döndürülür.

Üye Ayarlar
iItem Düğme numarasının sıfır tabanlı dizini.
pCurrent Veri akışındaki ilk kullanılmayan bayt işaretçisi. Düğme hakkında ek bilgi depolamak istiyorsanız, bunu pCurrent ile işaret edilen konumda depolayın ve pCurrent veri akışının ilk kullanılmayan bölümüne işaret eden şekilde güncelleştirin.
TBBUTTON Kaydedilen butonu anlatan TBBUTTON yapısı.

 

Bildirim kodunu aldığınızda, ihtiyacınız olan düğmeye özgü bilgileri TBBUTTON'den ayıklamanız gerekir. Bir düğme eklediğinizde, uygulamaya özgü verileri tutmak için TBBUTTONdwData üyesini kullanabileceğinizi unutmayın. verilerinizi pCurrentadresinden veri akışına yükleyin. pCurrent verilerinizin sonuna ilerleterek akışın kullanılmayan bölümünün başlangıcına işaret edin ve geri dönün.

Kabuk daha sonra sıradaki düğmeye gider, bilgilerini pDataüzerine ekler, pCurrent ilerletir, TBBUTTONyükler ve başka bir TBN_SAVE bildirim kodu gönderir. Tüm düğmeler kaydedilene kadar bu işlem devam eder.

Kaydedilen Araç Çubuklarını Geri Yükleme

Geri yükleme işlemi temelde kaydetme işlemini tersine çevirir. Başlangıçta uygulamanız, NMTBRESTORE yapısının iItem üyesi –1 olarak ayarlanmış bir TBN_RESTORE bildirim kodu alır. cbData üyesi, pDataboyutuna ayarlanır ve cButtons ise düğme sayısına ayarlanır.

Bildirim işleyiciniz, kaydetme sırasında pData başına yerleştirilen genel bilgileri ayıklamalı ve pCurrent Kabuk tanımlı veri bloğunun ilk bloğunun başına ilerlemelidir. cBytesPerRecord düğme verilerini kaydetmek için kullandığınız veri bloklarının boyutuna ayarlayın. cButtons düğme sayısına ayarlayın ve geri dönün.

Sonraki NMTBRESTORE ilk düğme içindir. pCurrent elemanı, ilk düğme veri bloğunuzun başlangıcını gösterir ve iItem düğme dizinine ayarlanır. Bu verileri ayıklayın ve pCurrent ilerleyin. verileri TBBUTTONyükleyin ve döndürin. Geri getirilen araç çubuğundaki bir düğmeyi çıkarmak için idCommand üyesini TBBUTTON içinde sıfır olarak ayarlayın. Shell, kalan düğmeler için işlemi yineler. NMTBSAVE ve NMTBRESTORE iletilerine ek olarak, araç çubuğunu kaydetmek ve geri yüklemek için TBN_RESET gibi iletileri de kullanabilirsiniz.

Aşağıdaki kod örneği, bir araç çubuğunu özelleştirilmeden önce kaydeder ve uygulama TBN_RESET iletisi alırsa araç çubuğunu geri yükler.

int               i;
LPNMHDR           lpnmhdr;
static int        nResetCount;
static LPTBBUTTON lpSaveButtons;
LPARAM            lParam;

switch( lpnmhdr->code)
{
    case TBN_BEGINADJUST: // Begin customizing the toolbar.
    {
        LPTBNOTIFY  lpTB = (LPTBNOTIFY)lparam;
       
        // Allocate memory for the button information.
        
        nResetCount   = SendMessage(lpTB->hdr.hwndFrom, TB_BUTTONCOUNT, 0, 0);
        lpSaveButtons = (LPTBBUTTON)GlobalAlloc(GPTR, sizeof(TBBUTTON) * nResetCount);
      
        // In case the user presses reset, save the current configuration 
        // so the original toolbar can be restored.
        
        for(i = 0; i < nResetCount; i++)
        {
            SendMessage(lpTB->hdr.hwndFrom, 
                        TB_GETBUTTON, i, 
                        (LPARAM)(lpSaveButtons + i));
        }
    }
    
    return TRUE;
   
    case TBN_RESET:
    {
        LPTBNOTIFY lpTB = (LPTBNOTIFY)lparam;
        
        int nCount, i;
    
        // Remove all of the existing buttons, starting with the last one.
        
        nCount = SendMessage(lpTB->hdr.hwndFrom, TB_BUTTONCOUNT, 0, 0);
        
        for(i = nCount - 1; i >= 0; i--)
        {
            SendMessage(lpTB->hdr.hwndFrom, TB_DELETEBUTTON, i, 0);
        }
      
        SendMessage(lpTB->hdr.hwndFrom,      // Restore the saved buttons.
                    TB_ADDBUTTONS, 
                    (WPARAM)nResetCount, 
                    (LPARAM)lpSaveButtons);
    }
    
    return TRUE;
   
    case TBN_ENDADJUST:                // Free up the memory you allocated.
        GlobalFree((HGLOBAL)lpSaveButtons);
        
        return TRUE;
}

Araç Çubuğu Kontrollerini Kullanma

Araç Çubuğu Standart Düğme Görüntüsü Dizin Değerleri

Windows ortak denetimler tanıtımı (CppWindowsCommonControls)