Freigeben über


Einbetten nicht angezeigter Steuerelemente in Symbolleisten

Symbolleisten unterstützen nur Schaltflächen. Wenn Ihre Anwendung daher eine andere Art von Steuerelement erfordert, müssen Sie ein untergeordnetes Fenster erstellen. Die folgende Abbildung zeigt eine Symbolleiste mit einem eingebetteten Bearbeitungssteuerelement.

Screenshot eines Dialogfelds mit einem Bearbeitungssteuerelement in der Symbolleiste, das drei Symbolleistensymbolen vorangeht

Hinweis

Erwägen Sie die Verwendung von Balkensteuerelementen , anstatt Steuerelemente in Symbolleisten zu platzieren.

 

Auf einer Symbolleiste kann ein beliebiger Fenstertyp platziert werden. Im folgenden Beispielcode wird ein Bearbeitungssteuerelement als untergeordnetes Element des Symbolleistensteuerelementfensters hinzugefügt. Da die Symbolleiste erstellt und dann das Bearbeitungssteuerelement hinzugefügt wird, müssen Sie Platz für das Bearbeitungssteuerelement bereitstellen. Eine Möglichkeit besteht darin, ein Trennzeichen als Platzhalter in der Symbolleiste hinzuzufügen und die Breite des Trennzeichens auf die Anzahl der Pixel festzulegen, die Sie reservieren möchten.

Wichtige Informationen

Technologien

Voraussetzungen

  • C/C++
  • Programmierung der Windows-Benutzeroberfläche

Anweisungen

Einbetten eines Nonbutton-Steuerelements in einer Symbolleiste

Der folgende Codeausschnitt erstellt die Symbolleiste in der vorherigen Abbildung.

// IDM_NEW, IDM_OPEN, and IDM_SAVE are application-defined command constants.

HIMAGELIST g_hImageList = NULL;

HWND CreateToolbarWithEdit(HWND hWndParent)
{
    const int ImageListID = 0;    // Define some constants.
    const int bitmapSize  = 16;
    
    const int cx_edit = 100;      // Dimensions of edit control.
    const int cy_edit = 35;  

    TBBUTTON tbButtons[] =        // Toolbar buttons.
    {
        // The separator is set to the width of the edit control. 
        
        {cx_edit, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, -1},
        {STD_FILENEW, IDM_NEW, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0},
        {STD_FILEOPEN, IDM_OPEN, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0},
        {STD_FILESAVE, IDM_SAVE, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0},
        {0, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0},
    };

    // Create the toolbar.
    HWND hWndToolbar = CreateWindowEx(0, TOOLBARCLASSNAME, L"Toolbar", 
                                      WS_CHILD | WS_VISIBLE | WS_BORDER, 
                                      0, 0, 0, 0,
                                      hWndParent, NULL, HINST_COMMCTRL, NULL);

    if (!hWndToolbar)
        return NULL;
    
    int numButtons = sizeof(tbButtons) / sizeof(TBBUTTON);

    // Create the image list.
    g_hImageList = ImageList_Create(bitmapSize, bitmapSize, // Dimensions of individual bitmaps.
                                    0,                      // Flags.
                                    numButtons, 0);

    // Set the image list.
    SendMessage(hWndToolbar, TB_SETIMAGELIST, (WPARAM)ImageListID, (LPARAM)g_hImageList);

    // Load the button images.
    SendMessage(hWndToolbar, TB_LOADIMAGES, (WPARAM)IDB_STD_SMALL_COLOR, (LPARAM)HINST_COMMCTRL);

    // Add buttons.
    SendMessage(hWndToolbar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
    SendMessage(hWndToolbar, TB_ADDBUTTONS,       (WPARAM)numButtons,       (LPARAM)&tbButtons);

    // Create the edit control child window.    
    HWND hWndEdit = CreateWindowEx(0L, L"Edit", NULL, 
                                   WS_CHILD | WS_BORDER | WS_VISIBLE | ES_LEFT | ES_AUTOVSCROLL | ES_MULTILINE, 
                                   0, 0, cx_edit, cy_edit, 
                                   hWndToolbar, (HMENU) IDM_EDIT, g_hInst, 0 );
    
    if (!hWndEdit)
    {
        DestroyWindow(hWndToolbar);
        ImageList_Destroy(g_hImageList);
        
        return NULL;
    }
    
    return hWndToolbar;    // Return the toolbar with the embedded edit control.
}

In diesem Beispiel werden die Dimensionen des untergeordneten Fensters hart codt. Um jedoch eine robustere Anwendung zu erstellen, bestimmen Sie die Größe der Symbolleiste, und stellen Sie das Fenster zum Bearbeiten des Steuerelements so fest, dass es passt.

Möglicherweise möchten Sie, dass die Benachrichtigungen zum Bearbeiten von Steuerelementen zu einem anderen Fenster wechseln, z. B. dem übergeordneten Fenster der Symbolleiste. Erstellen Sie dazu das Steuerelement bearbeiten als untergeordnetes Element des übergeordneten Fensters der Symbolleiste. Ändern Sie dann das übergeordnete Element des Bearbeitungssteuerelements wie folgt in die Symbolleiste.

SetParent (hWndEdit, hWndToolbar);

Benachrichtigungen werden an das ursprüngliche übergeordnete Element übergeordnet. Daher werden die Bearbeitungssteuerelementmeldungen an das übergeordnete Element der Symbolleiste weitergeleitet, obwohl sich das Bearbeitungsfenster im Symbolleistenfenster befindet.

Verwenden von Symbolleistensteuerelementen

Demo allgemeiner Windows-Steuerelemente (CppWindowsCommonControls)