




Причина этого в том, что класс MFC CToolbar внутренне использует список изображений, который инициализирован для использования только 16 цветов. Решение состоит в том, чтобы создать наш собственный список изображений и указать панели инструментов использовать его вместо этого. Я знаю, что это будет работать для 256 цветов, но я не тестировал его с более высокой битовой глубиной:
Сначала загрузите 256-цветное растровое изображение из ресурса:
HBITMAP hBitmap = (HBITMAP) ::LoadImage(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_BITMAP,
0,0, LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS);
CBitmap bm;
bm.Attach(hBitmap);
Затем создайте список 256-цветных изображений и добавьте к нему наше растровое изображение:
CImageList m_imagelist.Create(20, 20, ILC_COLOR8, 4, 4);
m_imagelist.Add(&bm, (CBitmap*) NULL);
Наконец, нам нужно указать панели инструментов использовать новый список изображений:
m_toolbar.GetToolBarCtrl().SetImageList(&m_imagelist);
Также возможно, что новая версия MFC в VS2008 могла решить эту проблему, поскольку я знаю, что многие элементы пользовательского интерфейса были обновлены. На самом деле я еще не пробовал его использовать, поэтому не могу быть уверен.
Вы создали в своем проекте растровый ресурс подходящего размера и вызвали CImageList :: Create с соответствующими параметрами?
Да, я взял ранее 16-цветную растровую карту и преобразовал ее с помощью Visual Studio. В соответствии с Create, я точно выполнил ваши инструкции с исключением: CImageList m_imagelist; m_imagelist.Create (20, 20, ILC_COLOR8, 4, 4); ...
Конечно, я это понимаю. Мои значки - 16,15, и я изменил это (извините, забыл упомянуть), и я знаю, что растровое изображение - 256 цветов (8 бит). Бит, который меня понимает, - это то, как заставить его работать с объявлением:
if (! m_wndToolBar.CreateEx (this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP) || m_wndToolBar.LoadToolBar (IDR_MAINFRAME)) ...
Извинения, немного повозился и все заработало. Большое спасибо за ваш вклад.
Конечно, этот последний фрагмент кода является шаблоном, который MFC добавляет для стандартной панели инструментов? Извините, я предположил, что у вас уже есть панель инструментов в окне фрейма!
загрузка растрового изображения проще, если вы просто используете вызов CBitmap.LoadBitmap (), или я что-то упускаю?
@gbjbaanb Нет перегрузки LoadBitmap, которая принимает HBITMAP - только те, которые принимают идентификатор ресурса или имя ресурса.
Спасибо за это, это вытащило меня сегодня из сложной ситуации.
Это сработало для меня, используя ILC_COLOR32 вместо ILC_COLOR8 для 32-битного цветного растрового изображения! Хороший. ;)
Решение сработало безупречно, нужно лишь немного поправить:
CImageList m_imagelist;
m_imagelist.Create(20, 20, ILC_COLOR8, 4, 4);
m_imagelist.Add(&bm, (CBitmap*) NULL);
Кажется, я не могу заставить этот код работать. Немного повозившись, мне удалось запустить его, но я получаю совершенно пустые значки. Есть идеи?