Я пытаюсь отобразить PNG для элемента управления кнопки для моего диалогового окна (Visual Studio 2010 Professional). Проведя некоторые исследования, я нашел следующий метод, который работает с файлами BMP:
HBITMAP hBitmap = (HBITMAP) LoadImage(NULL, L"test.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
SendMessage(GetDlgItem(hDlg, IDC_BUTTON1), BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap);
Это не работает с файлами PNG, хотя. После еще одного исследования я обнаружил, что есть простой способ сделать это с помощью GDI +:
HBITMAP hBitmap;
Gdiplus::Bitmap b(L"a.png");
b.GetHBITMAP(NULL, &hBitmap);
SendMessage(GetDlgItem(hDlg, IDC_BUTTON1), BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap);
Я не использую GDI + где-либо еще в моей программе, но мне все еще нужно включить заголовки, ссылку на библиотеку и инициализировать ее просто для выполнения этой простой задачи. Стоит ли всех этих хлопот? Есть ли более стандартный способ сделать это?
Я планирую визуализировать несколько PNG (некоторые прозрачные) на одной кнопке.
РЕДАКТИРОВАТЬ: (слегка измененную) функцию CreateDIBSectionFromBitmapSource (), которую я использую для создания HBITMAP, можно найти здесь:
Можете ли вы быть более конкретным о том, что вы подразумеваете под «рендерингом» PNG на кнопке управления …
Если вы имеете в виду, что пытаетесь прикрепить изображение .PNG к кнопке, то да, есть более простой способ. Просто нажмите на кнопку и перейдите к «Внешний вид» в меню свойств. Нажмите «BackgroundImage», выберите локальный ресурс, затем перейдите к изображению и загрузите его. Готово.
Если это не то, что вы хотите сделать, то я мог бы предложить исследовать
System.Drawing.Image и использование GDI +
Я на самом деле сижу здесь, изучая GDI +, как мы говорим. Будьте предупреждены, это — полтора времени, чтобы учиться.
GDI + — это стандартный способ чтения и рендеринга изображений в другом формате. Другой способ сделать это — создать компонент декодера PNG, получить от него поток и передать его в функцию LoadImage, что в точности и делает GDI + для вас на заднем плане. Кодеры и декодеры формата изображения являются частью компонента формирования изображения окна.
То, как будут выполняться декодирование и рендеринг для нескольких изображений, зависит от того, что вы ищете, и я не уверен в этом. Позвольте мне оставить несколько комментариев. То, что вы можете делать и делаете сейчас (с помощью опции фонового изображения кнопки), — это один раз декодировать изображения и сохранять их в виде битовой карты, поэтому, когда необходимо выполнить рисование, битовая карта готова и не требуется никакого декодирования. Это то, что делает рисование фонового изображения кнопки, компонент кнопки сохраняет дескриптор растрового изображения, которое вы передаете, и будет просто рисовать то же самое при перерисовке. Я не думаю, что вам нужно беспокоиться о производительности рисования растрового изображения, потому что это делается с помощью Bitblt напрямую на устройство отображения.