2009-10-07 4 views
6

Я использую Visual Studio 2008, у меня есть файл PNG, загруженный в представление ресурсов, которому присвоен IDB_BANG_PNG.Программная настройка PNG для управления изображениями в API Win32

Контроль изображения называется IDC_STATIC15.

У меня возникли проблемы с попыткой загрузить PNG в элемент управления изображением.

LRESULT CALLBACK DialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 
{ 

// Way of loading a bmp with a mask perhaps? Or a PNG file programatically? 

static HBRUSH hBrushStatic; 
HBITMAP hBmp = LoadBitmap(hDlg,MAKEINTRESOURCE(IDB_BANG_PNG)); 

switch(message) 
{ 
case WM_INITDIALOG:  
    CheckDlgButton(hDlg, IDC_CHECK, FALSE); 
    EnableWindow(GetDlgItem(hDlg, IDOK), FALSE); 
    // Bitmap version is IDB_BANG, PNG is at IDB_BANG_PNG 
    // IDC_STATIC15 is the picture frame 
    HWND item = GetDlgItem(hDlg,IDC_STATIC15); 
    SendMessage(item,STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)hBmp); 
    return TRUE; 

// .... snip 

Я довольно наивны, когда речь идет о развитии Win32/GUI, делая быстрый проект и застрял ее, любая помощь приветствуется.

+0

Вам нужен растровый файл. Вы хотите преобразовать изображение PNG в изображение BMP. – anno

+0

Я читал, что вы можете поддерживать PNG, но вы должны делать это программно. Когда я добавляю изображения, используя фильтр изображения hte, * .png является одним из перечисленных элементов. –

+0

Проблема в том, что мне нравится поддерживать прозрачный фон, поэтому я хочу использовать PNG. Если я не могу создать маску с помощью BMP или разрешить файлу ICO использовать значок большего размера, а не 32x32. –

ответ

0

Лично я использую класс CPictureEx. Я думаю, что это не поддерживает png, но bmp, jpeg и анимированный gif.

Я также использую Cairo графики для специального рендеринга. Каир поддерживает формат png.
Конечно, Каир немного сложнее в использовании.

+0

Этот проект, над которым я работаю, находится на C, а не на C++. Классы, CImage, MFC и т. Д. Будут невозможны и не будут компилироваться. Как использовать paint bmp в управлении изображением в диалоговом окне во время выполнения? –

4

Это работает с использованием GDI+ и bitmap class:

Bitmap oBmp(L"D:\\test.png"); 
HBITMAP hBmp; 
oBmp.GetHBITMAP(0, &hBmp); 
SendMessage(item,STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)hBmp); 

Некоторые управления caveats.Your нужен стиль SS_BITMAP. Не забудьте включить gdiplus.h и его библиотеку. Вам необходимо инициализировать (GdiplusStartup) и завершить GDI +. Освобождение всех системных ресурсов от вас.

0

Вы проверили библиотеку DevIL/OpenIL? Это следует за названием OpenGL именования функций и написано в хорошем ol 'C.

Я использовал в прошлом, успешно. Это очень портативно.

Проверьте это здесь: http://openil.sourceforge.net/features.php

2

Я не думаю, что LoadBitmap или любой другой обычный функция GDI (например, LoadImage) будет загружать PNG.

Вы можете сохранить свой ресурс до 32-битного BMP с помощью инструмента для редактирования изображений, а затем использовать LoadImage с LR_CREATEDIBSECTION.

Или вы можете использовать библиотеку, которая будет загружать PNG-файл в DIBSECTION. GDI + будет загружать PNG и JPG в дополнение к BMP.

В библиотеках автоматизации OLE также есть интерфейс IPicture, который вы можете создавать с помощью различных типов изображений, а затем получить базовый DIBSECTION. Это неудобно использовать, особенно если вы не знакомы с COM. См. OleLoadPicture для начальной точки.

Смежные вопросы