Внедрение элементов управления nonbutton в панели инструментов

Панели инструментов поддерживают только кнопки; Таким образом, если приложению требуется другой тип управления, необходимо создать дочернее окно. На следующем рисунке показана панель инструментов со встроенным элементом управления редактированием.

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

Примечание

Рекомендуется использовать элементы управления "Панель " вместо размещения элементов управления на панелях инструментов.

 

Любой тип окна можно разместить на панели инструментов. В следующем примере кода в качестве дочернего элемента управления панели инструментов добавляется элемент управления edit. Так как панель инструментов создается, а затем добавлен элемент управления редактированием, необходимо указать пространство для элемента управления редактированием. Один из способов сделать это — добавить разделитель в качестве заполнителя на панели инструментов, задав ширину разделителя на количество пикселей, которые требуется зарезервировать.

Это важно знать

Технологии

Предварительные требования

  • C/C++
  • программирование пользовательского интерфейса Windows

Инструкции

Внедрение элемента управления nonbutton на панель инструментов

Следующий фрагмент кода создает панель инструментов на предыдущем рисунке.

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

Этот пример жестко кодит размеры дочернего окна; однако, чтобы сделать более надежным приложением, определите размер панели инструментов и сделайте окно управления редактированием в соответствии с размером.

Может потребоваться, чтобы уведомления об изменении элемента управления переходят в другое окно, например родитель панели инструментов. Для этого создайте элемент управления редактированием в качестве дочернего элемента родительского окна панели инструментов. Затем измените родительский элемент управления на панель инструментов следующим образом.

SetParent (hWndEdit, hWndToolbar);

Уведомления переходят к исходному родительскому элементу. Поэтому сообщения элемента управления редактированием переходят к родительскому элементу панели инструментов, даже если окно редактирования находится в окне панели инструментов.

Использование элементов управления панели инструментов

демонстрация общих элементов управления Windows (CppWindowsCommonControls)