Como inserir controles não desabotoados nas barras de ferramentas

As barras de ferramentas dão suporte apenas a botões; portanto, se o aplicativo exigir um tipo diferente de controle, você deverá criar uma janela filho. A ilustração a seguir mostra uma barra de ferramentas com um controle de edição inserido.

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

Observação

Considere usar controles de barras em vez de colocar controles em barras de ferramentas.

 

Qualquer tipo de janela pode ser colocado em uma barra de ferramentas. O código de exemplo a seguir adiciona um controle de edição como um filho da janela de controle da barra de ferramentas. Como a barra de ferramentas foi criada e, em seguida, o controle de edição adicionado, você deve fornecer espaço para o controle de edição. Uma maneira de fazer isso é adicionar um separador como um espaço reservado na barra de ferramentas, definindo a largura do separador como o número de pixels que você deseja reservar.

O que você precisa saber

Tecnologias

Pré-requisitos

  • C/C++
  • programação da interface do usuário Windows

Instruções

Inserir um controle nonbutton em uma barra de ferramentas

O snippet de código a seguir cria a barra de ferramentas na ilustração anterior.

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

Este exemplo codifica as dimensões da janela filho; no entanto, para tornar um aplicativo mais robusto, determine o tamanho da barra de ferramentas e faça com que a janela de controle de edição se ajuste.

Talvez você queira que as notificações de controle de edição acessem outra janela, como o pai da barra de ferramentas. Para fazer isso, crie o controle de edição como um filho da janela pai da barra de ferramentas. Em seguida, altere o pai do controle de edição para a barra de ferramentas da seguinte maneira.

SetParent (hWndEdit, hWndToolbar);

As notificações vão para o pai original. Portanto, as mensagens de controle de edição vão para o pai da barra de ferramentas, embora a janela de edição resida na janela da barra de ferramentas.

Usando controles da barra de ferramentas

Windows demonstração de controles comuns (CppWindowsCommonControls)