Перейти к основному контенту
Центр разработки для Windows

 none
Win32 API. Как на кнопки в toolbar установить свои иконки ICO, добавленные в папку ResourceFiles? RRS feed

  • Вопрос

  • Здравствуйте. Делаю приложение C++ на Win32 API в Visual Studio 2017 Community. В приложении есть toolbar с кнопками. Проблема в том, что не получается установить на кнопках в toolbar вместо стандартных иконок свои иконки ICO, которые я добавил в папку ResourceFiles приложения. Кнопки получаются пустые - без картинок. Перечитал по этой теме много постов на SO и кое-что на MSDN, а так же в других местах. Всё равно не получается установить на кнопки свои иконки.  Буду очень благодарен, если кто поможет. Заранее спасибо.

    Ниже привожу свой код, с помощью которого пытаюсь поставить свои иконки на кнопки toolbar'а:

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

    HIMAGELIST g_hImageList = NULL;
    HWND CreateSimpleToolbar(HWND hWndParent)
    {
    	// Объявить и инициализировать константы, используемые в функции:
    	// - идентификатор списка картинок для кнопок,
    	const int ImageListID = 0;
    	// - количество кнопок.
    	const int numButtons = 4;
    	// Размер каждой картинки для кнопки
    	const int bitmapSize = 16;
    
    	const DWORD buttonStyles = BTNS_AUTOSIZE;
    
    	// Создать панель управления приложением.
    	HWND hWndToolbar = CreateWindowEx(0, TOOLBARCLASSNAME, NULL,
    		WS_CHILD | TBSTYLE_WRAPABLE, 0, 0, 0, 0,
    		hWndParent, NULL, hInst, NULL);
    
    	if (hWndToolbar == NULL)
    		return NULL;
    
    	// Создать список картинок для кнопок.
    	g_hImageList = ImageList_Create(bitmapSize, bitmapSize,
    		ILC_COLOR16 | ILC_MASK, // Обеспечить прозрачный фон.
    		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)));
    
    	// Установить список картинок для кнопок.
    	SendMessage(hWndToolbar, TB_SETIMAGELIST,
    		(WPARAM)ImageListID,
    		(LPARAM)g_hImageList);
    
    	// Загрузить картинки для кнопок.
    	SendMessage(hWndToolbar, TB_LOADIMAGES,
    		(WPARAM)IDB_STD_SMALL_COLOR,
    		(LPARAM)HINST_COMMCTRL);
    
    	// Инициализировать информацию о кнопках.
    	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}
    	};
    
    	// Добавить кнопки.
    	SendMessage(hWndToolbar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
    	SendMessage(hWndToolbar, TB_ADDBUTTONS, (WPARAM)numButtons, (LPARAM)&tbButtons);
    
    	// Изменить размер панели инструментов, а затем показать её.
    	SendMessage(hWndToolbar, TB_AUTOSIZE, 0, 0);
    	ShowWindow(hWndToolbar, TRUE);
    
    	return hWndToolbar;
    }

    IDI_ICON1 - IDI_ICON4 это идентификаторы четырех файлов иконок *.ICO, получившиеся в результате добавления этих иконок в ресурсы приложения.

    Если в отладчике проверить результат работы функции LoadIcon, то видно сообщение Unable to read memory, хотя само возвращаемое значение HICON - не нулевое.

    Скажите, пожалуйста, что нужно исправить в вышеприведённом коде, чтобы на кнопки toolbar'а установились нужные мне иконки из папки ResourceFiles?


    • Изменено Purple_Apple 9 ноября 2019 г. 13:29
    3 ноября 2019 г. 17:10

Ответы

  • Вот как должна правильно выглядить моя функция. Этот вариант устанавливает какие мне нужно картинки!

    #define IDM_INPUT 0
    #define IDM_OUTPUT 1
    #define IDM_TRIANGULATE 2
    #define IDM_STOP 3
    
    HWND g_hWndToolbar;
    HIMAGELIST g_hImageList = NULL;

    // Создаёт панель управления.
    HWND CreateSimpleToolbar(HWND hWndParent)
    {
    	// Объявить и инициализировать константы, используемые в функции:
    	// - идентификатор списка картинок для кнопок,
    	const int ImageListID = 0;
    	// - количество кнопок.
    	const int numButtons = 4;
    	// Размер каждой картинки для кнопки
    	const int bitmapSize = 16;
    
    	const DWORD buttonStyles = BTNS_AUTOSIZE;
    
    	// Создать панель управления приложением.
    	HWND hWndToolbar = CreateWindowEx(0, TOOLBARCLASSNAME, NULL,
    		WS_CHILD | TBSTYLE_WRAPABLE, 0, 0, 0, 0,
    		hWndParent, NULL, hInst, NULL);
    
    	if (hWndToolbar == NULL)
    		return NULL;
    
    	// Создать список картинок для кнопок.
    	g_hImageList = ImageList_Create(bitmapSize, bitmapSize,
    		ILC_COLOR16 | ILC_MASK, // Обеспечить прозрачный фон.
    		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)));
    
    	// Установить список картинок для кнопок.
    	SendMessage(hWndToolbar, TB_SETIMAGELIST,
    		(WPARAM)ImageListID,
    		(LPARAM)g_hImageList);
    
    	// Инициализировать информацию о кнопках.
    	TBBUTTON tbButtons[numButtons] =
    	{
    		{ MAKELONG(0,  ImageListID), IDM_INPUT,  TBSTATE_ENABLED, buttonStyles, {0}, 0, 0 },
    		{ MAKELONG(1, ImageListID), IDM_OUTPUT, TBSTATE_ENABLED, buttonStyles, {0}, 0, 0},
    		{ MAKELONG(2, ImageListID), IDM_TRIANGULATE, TBSTATE_ENABLED, buttonStyles, {0}, 0, 0},
    		{ MAKELONG(3, ImageListID), IDM_STOP, TBSTATE_ENABLED, buttonStyles, {0}, 0, 0}
    	};
    
    	// Добавить кнопки.
    	SendMessage(hWndToolbar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
    	SendMessage(hWndToolbar, TB_ADDBUTTONS, (WPARAM)numButtons, (LPARAM)&tbButtons);
    
    	// Изменить размер панели инструментов, а затем показать её.
    	SendMessage(hWndToolbar, TB_AUTOSIZE, 0, 0);
    	ShowWindow(hWndToolbar, TRUE);
    
    	return hWndToolbar;
    }

    Я также удалил вызов TB_LOADIMAGES, т.к. он нужен только тогда, когда ты используешь системные иконки. А я использую свои.

    Вот вроде рабочая версия. Может быть ещё кому окажется полезной.


    • Помечено в качестве ответа Purple_Apple 9 ноября 2019 г. 13:28
    • Изменено Purple_Apple 9 ноября 2019 г. 13:46
    9 ноября 2019 г. 13:28