Come incorporare controlli non pulsanti nelle barre degli strumenti

Le barre degli strumenti supportano solo i pulsanti; pertanto, se l'applicazione richiede un tipo di controllo diverso, è necessario creare una finestra figlio. La figura seguente mostra una barra degli strumenti con un controllo di modifica incorporato.

screen shot of a dialog box with an edit control in the toolbar, preceding three toolbar icons

Nota

È consigliabile usare i controlli Rebar invece di posizionare i controlli nelle barre degli strumenti.

 

Qualsiasi tipo di finestra può essere posizionato su una barra degli strumenti. Il codice di esempio seguente aggiunge un controllo di modifica come elemento figlio della finestra di controllo della barra degli strumenti. Poiché la barra degli strumenti viene creata e quindi aggiunta il controllo di modifica, è necessario fornire spazio per il controllo di modifica. Un modo per eseguire questa operazione consiste nell'aggiungere un separatore come segnaposto nella barra degli strumenti, impostando la larghezza del separatore sul numero di pixel che si desidera riservare.

Informazioni importanti

Tecnologie

Prerequisiti

  • C/C++
  • Programmazione dell'interfaccia utente di Windows

Istruzioni

Incorporare un controllo Nonbutton in una barra degli strumenti

Il frammento di codice seguente crea la barra degli strumenti nella figura precedente.

// 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 questo esempio vengono hardcoded le dimensioni della finestra figlio; Tuttavia, per rendere un'applicazione più affidabile, determinare le dimensioni della barra degli strumenti e rendere adatta la finestra di controllo di modifica.

È possibile che le notifiche del controllo di modifica vengano inviate a un'altra finestra, ad esempio l'elemento padre della barra degli strumenti. A tale scopo, creare il controllo di modifica come elemento figlio della finestra padre della barra degli strumenti. Modificare quindi l'elemento padre del controllo di modifica sulla barra degli strumenti come indicato di seguito.

SetParent (hWndEdit, hWndToolbar);

Le notifiche passano all'elemento padre originale. Pertanto, i messaggi di controllo di modifica passano all'elemento padre della barra degli strumenti anche se la finestra di modifica risiede nella finestra della barra degli strumenti.

Uso dei controlli barra degli strumenti

Demo dei controlli comuni di Windows (CppWindowsCommonControls)