GDI + Graphics :: DrawImage не отображается

Я все еще продолжаю изучать WinAPI и его различные библиотеки, и теперь я пытаюсь понять GDI +. В качестве простого теста я пытаюсь загрузить изображение из файла и нарисовать его на экране.

Вот код, который я использую (объяснение ниже):

int x=0, y=0;
Image* sprite=Image::FromFile((WCHAR*)"MyImage.png");
Graphics g(dc);
std::cout<<"(x, y)=("<<x<<", "<<y<<")"<<std::endl; // Debug output
std::cout<<"(w, h)=("<<sprite->GetWidth()<<", "<<sprite->GetHeight()<<")"<<std::endl; // Debug output
g.DrawImage(sprite, x, y, (int)sprite->GetWidth(), (int)sprite->GetHeight());

Итак, dc - это HDC, к которому я рисую, полученный с помощью BeginPaint (). Это определенно нормально, потому что я могу нарисовать эллипс с помощью Ellipse (), используя этот HDC, и он отлично отображается. Я вывел значение переменной спрайта, и это ненулевой указатель, как и должно быть.

Странно то, что в выходных данных выше указано, что ширина и высота изображения равны 0. Что может вызвать это? Я подумал, что, возможно, изображение загружается неправильно, поэтому я попытался использовать как абсолютный, так и относительный путь для аргумента FromFile (), и ничего не изменилось. Я также пробовал переключиться с PNG на BMP, но и там никаких изменений.

Что происходит?

РЕДАКТИРОВАТЬ Только что протестировано, и если я загружу изображение как Image * sprite = new Image (L "Path_To_Image"); работает нормально. Почему не работает с FromFile?


person Daniel Burnett    schedule 03.03.2014    source источник
comment
Два ваших примера кода делают со строками совершенно разные вещи. Совет для Winapi: никогда не используйте струны!   -  person chris    schedule 03.03.2014


Ответы (1)


Gdiplus ожидает строки Unicode для таких методов, как Image::FromFile.

Однако в вашем коде вы передаете многобайтовую строку. Простого преобразования в WCHAR* недостаточно для преобразования строки в Unicode - вам нужно поставить перед ним префикс L (и затем вы должны удалить преобразование, что не обязательно).

person Jonathan Potter    schedule 03.03.2014
comment
Спасибо! Кажется, сейчас работает. Вроде, как бы, что-то вроде. В моей программе он правильно рисует изображения, но имеет огромную проблему с мерцанием. Я перекрашиваю окно ниткой примерно 30 раз в секунду. В настоящее время я очищаю его с помощью g.Clear (), а затем рисую изображения, показанные здесь. При изменении x и y изображение перемещается нормально. Но это мерцание просто смешно. Есть ли методика обновления окна без мерцания? - person Daniel Burnett; 03.03.2014
comment
Не бери в голову. Я наконец нашел, что это называется двойной буферизацией, и заставил ее работать! Спасибо за вашу помощь! :) - person Daniel Burnett; 03.03.2014
comment
@DanielBurnett, пожалуйста, старайтесь оставлять для него один вопрос на вопрос в будущем. - person chris; 03.03.2014
comment
Gdiplus работает медленно. Обычным решением является двойная буферизация путем рисования в DC памяти с последующим переносом на дисплей, хотя 30 кадров в секунду, вероятно, слишком быстро даже для необработанного GDI. Вы можете изучить Direct2D. - person Jonathan Potter; 03.03.2014