Я не могу установить свои собственные значки ICO на кнопках панели инструментов в приложении Win32 - PullRequest
0 голосов
/ 09 ноября 2019

Я прошу прощения за мой плохой английский. Я пишу приложение на C ++ в Win32 API в Visual Studio 2017 Community на Windows 10. Приложение имеет панель инструментов с кнопками. Я хочу назначить свои пользовательские функции для каждой кнопки. Поэтому каждая кнопка должна иметь свой собственный определенный значок. (Я добавил значки в папку ResourceFiles приложения.) Проблема в том, что я не могу установить свои собственные значки ICO на кнопки на панели инструментов. Когда я запускаю свое приложение,кнопки пусты без значков. Я перечитал много информации по этой теме на SO и на других сайтах. Тем не менее, я не могу установить свои значки на кнопки. Буду очень признателен, если кто-нибудь поможет. Заранее спасибо. Ниже приведен мой код, с помощью которого я пытаюсь разместить значки на кнопках панели инструментов:

#define IDM_INPUT 0
#define IDM_OUTPUT 1
#define IDM_TRIANGULATE 2
#define IDM_STOP 3  

HWND CreateSimpleToolbar(HWND hWndParent)
{
    // Declare and initialize the constants used in the function:
    // - picture list id for buttons,
    const int ImageListID = 0;
    // - number of buttons,
    const int numButtons = 4;
    // - the size of each image for the button.
    const int bitmapSize = 16;

    const DWORD buttonStyles = BTNS_AUTOSIZE;

    // Create the toolbar.
    HWND hWndToolbar = CreateWindowEx(0, TOOLBARCLASSNAME, NULL,
        WS_CHILD | TBSTYLE_WRAPABLE, 0, 0, 0, 0,
        hWndParent, NULL, hInst, NULL);

    if (hWndToolbar == NULL)
        return NULL;

    // Create a list of pictures for buttons.
    g_hImageList = ImageList_Create(bitmapSize, bitmapSize,
        ILC_COLOR16 | ILC_MASK, // Provide a transparent background.
        numButtons, 0);

    ImageList_AddIcon(g_hImageList, LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON1)));
    ImageList_AddIcon(g_hImageList, LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON2)));
    ImageList_AddIcon(g_hImageList, LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON3)));
    ImageList_AddIcon(g_hImageList, LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON4)));

    // Set a list of pictures for buttons.
    SendMessage(hWndToolbar, TB_SETIMAGELIST,
        (WPARAM)ImageListID,
        (LPARAM)g_hImageList);

    // Upload pictures for buttons.
    SendMessage(hWndToolbar, TB_LOADIMAGES,
        (WPARAM)IDB_STD_SMALL_COLOR,
        (LPARAM)HINST_COMMCTRL);

    // Initialize information about buttons.
    TBBUTTON tbButtons[numButtons] =
    {
        { MAKELONG(IDI_ICON1,  ImageListID), IDM_INPUT,  TBSTATE_ENABLED, buttonStyles, {0}, 0, 0 },
        { MAKELONG(IDI_ICON2, ImageListID), IDM_OUTPUT, TBSTATE_ENABLED, buttonStyles, {0}, 0, 0},
        { MAKELONG(IDI_ICON3, ImageListID), IDM_TRIANGULATE, TBSTATE_ENABLED, buttonStyles, {0}, 0, 0},
        { MAKELONG(IDI_ICON4, ImageListID), IDM_STOP, TBSTATE_ENABLED, buttonStyles, {0}, 0, 0}
    };

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

    // Resize the toolbar and then show it.
    SendMessage(hWndToolbar, TB_AUTOSIZE, 0, 0);
    ShowWindow(hWndToolbar, TRUE);

    return hWndToolbar;
}

IDI_ICON1, IDI_ICON2, IDI_ICON3 и IDI_ICON4 - это идентификаторы четырех файлов значков ICO, полученных в результате добавления этих значков. к ресурсам приложения. Если я проверю результат функции LoadIcon в отладчике, то увижу сообщение «Невозможно прочитать память», хотя само возвращаемое значение HICON не равно нулю. Подскажите пожалуйста что нужно исправить в приведенном выше коде?

...