Dela via


Så här bäddar du in kontroller som inte är knappar i verktygsfält.

Verktygsfält stöder endast knappar. Om programmet kräver en annan typ av kontroll måste du därför skapa ett underordnat fönster. Följande bild visar ett verktygsfält med en inbäddad redigeringskontroll.

skärmbild av en dialogruta med en redigeringskontroll i verktygsfältet, före tre verktygsfältsikoner

Not

Överväg att använda Rebar-kontroller istället för att placera kontroller i verktygsfält.

 

Alla typer av fönster kan placeras i ett verktygsfält. Följande exempelkod lägger till en redigeringskontroll som underordnad i verktygsfältets kontrollfönster. Eftersom verktygsfältet skapas och redigeringskontrollen har lagts till måste du ange utrymme för redigeringskontrollen. Ett sätt att göra detta är att lägga till en avgränsare som platshållare i verktygsfältet och ange bredden på avgränsaren till det antal pixlar som du vill reservera.

Vad du behöver veta

Teknologier

Förutsättningar

  • C/C++
  • Programmering av Windows-användargränssnitt

Instruktioner

Bädda in en ickeknappkontroll i ett verktygsfält

Följande kodfragment skapar verktygsfältet i föregående bild.

// 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.
}

I det här exemplet hårdkodas dimensionerna för barnfönstret. Men för att göra ett mer robust program, bestäm storleken på verktygsfältet och anpassa redigeringskontrollfönstret så att det passar.

Du kanske vill att redigeringskontrollmeddelandena ska gå till ett annat fönster, till exempel verktygsfältets överordnade. Det gör du genom att skapa redigeringskontrollfönstret som ett underordnat fönster till verktygsfältets överordnade fönster. Ändra sedan förälder för redigeringskontrollen till verktygsfältet som följer.

SetParent (hWndEdit, hWndToolbar);

Meddelanden går till den ursprungliga föräldern. Därför går redigeringskontrollmeddelandena till det överordnade verktygsfältet trots att redigeringsfönstret finns i verktygsfältsfönstret.

Använda verktygsfältskontroller

Windows common controls demo (CppWindowsCommonControls)