2013-06-25 4 views
0

Я пытаюсь нарисовать значок с gdi +. Я правильно работаю, когда загружаю файл значка прямо с диска, но я хотел бы сохранить значок в ресурсах, если это возможно. Есть ли простой способ сделать это без потери разрешения?Gdiplus :: Изображение с ресурса значка?

// The image draws and looks exactly how I want it to 
    Gdiplus::Image indicator(L"\\Indicator.ico"); 
    graphics->DrawImage(&indicator, 7, 7); 

    // The image draws, but looks bloated and pixel-y 
    const HICON hIcon = AfxGetApp()->LoadIcon(IDI_INDICATOR); 
    if (hIcon) 
    { 
     Gdiplus::Bitmap* bitmap = Gdiplus::Bitmap::FromHICON(hIcon); 
     graphics->DrawImage(bitmap, 7, 7); 
    } 
+1

Вы просто не хотите использовать Bitmap :: FromHICON(), это плохое задание, сопоставляющее значок с изображением. Изображение будет иметь только 16 цветов из предварительно приготовленной палитры. Просто используйте DrawIcon(). –

+0

Спасибо за ввод. DrawIcon() выглядит намного лучше, чем передача растрового изображения в DrawImage(). Изображение по-прежнему не так точно, как DrawImage() на значке, но большая причина использовать Gdiplus заключается в том, что мне также нужно повернуть значок до заданного угла. Для этого я считаю, что мне нужно будет вызвать graphics-> RotateTransform() перед DrawImage(). – pates

+0

Нарисуйте его в растровое изображение, поверните растровое изображение. –

ответ

0

У меня была аналогичная проблема с растровыми изображениями. Если он работает правильно при загрузке с диска, то это почти наверняка, потому что вложение его в качестве ресурса каким-то образом искажает его. Кажется, что-то странное, когда вы храните «известные» типы изображений в качестве ресурсов. В случае растровых изображений я обнаружил, что казалось, что некоторые из заголовков растровых изображений были удалены, что означало, что я не мог загрузить его в качестве ресурса, если бы использовал стороннюю библиотеку изображений.

Решение, которое я в итоге нашел, это создать новый тип ресурса, вручную отредактировав файл .rc и сохранить вместо этого значок. Таким образом, вместо этого:

IDR_MAINFRAME   ICON     "res\\Merckx.ico" 

Вы бы что-то вроде этого:

IDR_MAINFRAME   USERICN     "res\\Merckx.ico" 

Я не знаю, если загружать его как Gdiplus :: Изображение с идентификатор ресурса будет по-прежнему работать. Если этого не произойдет, вам, вероятно, придется вручную загрузить ресурс с помощью LoadResource(), а затем создать объект Gdiplus :: Image из потока. Есть хорошая статья here о том, как это сделать.

Надеюсь, что это поможет. Я знаю, что это немного странное решение, но стоит попробовать.

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