Консультация № 23365
11.07.2005, 21:24
0.00 руб.
0 2 2
Здравствуйте, уважаемые эксперты!
Я сейчас пишу программу (некую игру), и основная часть уже готова, но я столкнулся с одной проблемой. Объясните, как на чистом WinApi нарисовать в моем окне изображение из внешнего .bmp файла или из ресурсов в заданном месте. Перерыл кучу материла, статей, MSDN и т.д, но толком ничего не понял.
С помощью MFC отрисовывать bmp я не хочу, т.к. нет смысла переделывать все заново из-за одной графики. Еще буду очень признателен, если вы расскажете о Display Device Contexts
Заранее благодарен

Обсуждение

Неизвестный
12.07.2005, 09:18
общий
это ответ
Здравствуйте, Dts!
Есть несколько вариантов:
1. Создаёшь Static окно со свойством SS_BITMAP и т.д.
2. Работаешь через контекстное устройство
Неизвестный
12.07.2005, 14:52
общий
это ответ
Здравствуйте, Dts!
Все очень просто. Смотри. Есть функция, которая одинаково работает как с файлом, так и с ресурсами - LoadImage. Она возвращает хэндл загружаемого объекта. Объектом может быть и битмап, и курсор, и иконка (посмотри пример создания окна на WinAPI...там иконка загружается именно этой функцией). А дальше просто получаем DC и рисуем на нем. Вот пример (битмап в ресурсе, с файлом аналогично, но нужно выставить другие флаги...про них читай в MSDN):

HBITMAP hBmp = (HBITMAP) LoadImage(GetModuleHandle(NULL), //берем хэндл по дефолту
MAKEINTRESOURCE(IDR_MYBITMAP), //берем битмап из ресурса (тут может быть твой идентификатор)
IMAGE_BITMAP,
0, 0, LR_DEFAULTCOLOR); //получаем истинные размеры

RECT rect;
//я ставлю свои размеры ректа, куда будем вписывать картинку, ты ставь свои

rect.top = 10;
rect.left = 10;
rect.bottom = rect.top + 100;
rect.right = rect.left + 100;

//создадим исходное dc
HDC hMemDc = CreateCompatibleDC(NULL); //создали контекст впамяти, совместимый с экраном
HDC hDC = GetDC(hWnd); //получим DC через хэндл окна

//поместим рисунок в контекст устройства в памяти, т.е. hMemDC
HBITMAP hbmpOld = SelectObject(hMemDC, hBmp); //и не забудем сохранить старый

//теперь рисуем нашу картинку в рект на DC окна
BitBlt(hDC, rect.left, rect.top, rect.right, rect.bottom, hMemDC, 0, 0, SRCCOPY);

//теперь селектим старый битмап в hMemDC
SelectObject(hMemDC, hbmpOld);
DeleteDC(hMemDC); //убиваем ненужный DC

Ну примерно так. Я нарочно не стал убивать битмап, предоставив тебе право самому решать что дальше делать. Пиши, коли возникнут вопросы.
Форма ответа