Вопрос № 23365: Здравствуйте, уважаемые эксперты!
Я сейчас пишу программу (некую игру), и основная часть уже готова, но я столкнулся с одной проблемой. Объясните, как на чистом WinApi нарисовать в моем окне изображение из внешнего .bmp файла или из ресурсов в за...
Вопрос № 23.365
Здравствуйте, уважаемые эксперты!
Я сейчас пишу программу (некую игру), и основная часть уже готова, но я столкнулся с одной проблемой. Объясните, как на чистом WinApi нарисовать в моем окне изображение из внешнего .bmp файла или из ресурсов в заданном месте. Перерыл кучу материла, статей, MSDN и т.д, но толком ничего не понял.
С помощью MFC отрисовывать bmp я не хочу, т.к. нет смысла переделывать все заново из-за одной графики. Еще буду очень признателен, если вы расскажете о Display Device Contexts
Заранее благодарен
Отправлен: 11.07.2005, 21:24
Вопрос задал: Dts (статус: Посетитель)
Всего ответов отправлено: 2
Отвечает: Алексей Смуриков
Здравствуйте, Dts!
Есть несколько вариантов:
1. Создаёшь Static окно со свойством SS_BITMAP и т.д.
2. Работаешь через контекстное устройство
Ответ отправил: Алексей Смуриков (статус: Студент)
Отправлен: 12.07.2005, 09:18 Оценка за ответ: 3 Комментарий оценки: 1. меня как раз это самое "и т.д." и интересует!! 2.я знаю, что через него нужно работать, но как??
Отвечает: Jadd
Здравствуйте, Dts!
Все очень просто. Смотри. Есть функция, которая одинаково работает как с файлом, так и с ресурсами - LoadImage. Она возвращает хэндл загружаемого объекта. Объектом может быть и битмап, и курсор, и иконка (посмотри пример создания окна на WinAPI...там иконка загружается именно этой функцией). А дальше просто получаем DC и рисуем на нем. Вот пример (битмап в ресурсе, с файлом аналогично, но нужно выставить другие флаги...про них читай в MSDN):
HBITMAP hBmp = (HBITMAP) LoadImage(GetModuleHandle(NULL), //берем хэндл по дефолту
MAKEINTRESOURCE(IDR_MYBITMAP), //берем битмап из ресурса (тут может быть твой идентификатор)
IMAGE_BITMAP,
0, 0, LR_DEFAULTCOLOR); //получаем истинные размеры
RECT rect;
//я ставлю свои размеры ректа, куда будем вписывать картинку, ты ставь свои
//создадим исходное 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
Ну примерно так. Я нарочно не стал убивать битмап, предоставив тебе право самому решать что дальше делать. Пиши, коли возникнут вопросы.
--------- Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Студент)
Отправлен: 12.07.2005, 14:52 Оценка за ответ: 5 Комментарий оценки: Спасибо!! Вроде разобрался..но появились еще некоторые вопросы, попозже и их изложу..