Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Bitmap in ATL  (Прочитано 12708 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Fireworm
Гость
« : 29-07-2003 08:44 » 

Пытаюсь на своем контроле ввести битмап в качестве фона.
Для этого добавил битмап в рессурсы и пытаюсь отрисовывать след. образом:

Код:
HRESULT CSpeedometr::OnDraw(ATL_DRAWINFO& di)
{
...................................
    RECT rc = *(RECT*)di.prcBounds;
    HDC hdc = di.hdcDraw;
    DrawOffScreen(hdc, rc);
.............................
}

void CSpeedometr::DrawOffScreen(HDC hdc, RECT rc)
{
 HBITMAP hbmMem, hbmOld, hNoteBmp;
 HDC     hdcMem, hNoteDC;

 hdcMem = CreateCompatibleDC(hdc);
 hbmMem = CreateCompatibleBitmap(hdc, 325, 175);

 hNoteDC = CreateCompatibleDC(hdcMem);

 hNoteBmp = (HBITMAP)(_Module.GetResourceInstance(),

MAKEINTRESOURCE(IDB_SPEEDOMETR),IMAGE_BITMAP,
                0,0,LR_LOADFROMFILE);


 SelectObject(hNoteDC, hNoteBmp);
 BitBlt(hdcMem, rc.left, rc.top, rc.right-rc.left,
                rc.bottom-rc.top, hNoteDC, 0, 0, SRCCOPY);

 DeleteObject(hNoteBmp);
 DeleteDC(hNoteDC);

 hbmOld = (HBITMAP)SelectObject(hdcMem, hbmMem);

 BitBlt(hdc, rc.left, rc.top, rc.left+325, rc.top+175,
     hdcMem, 0, 0, SRCCOPY);

 SelectObject(hdcMem, hbmOld);
 DeleteObject(hbmMem);
 DeleteDC(hdcMem);

}


Но вместо картинки получаю черный прямоугольник, который пропадает при изменении размеров.
Что я тут не так делаю?
« Последнее редактирование: 19-11-2007 16:32 от Алексей1153++ » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 29-07-2003 09:22 » 

Насколько я помню, CreateCompatibleDC() создает монохромный DC. Как-то да же не вяжется с названием...
А то что пропадает - BitBlt() надо делать на каждый WM_PAINT.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #2 : 29-07-2003 10:11 » 

RXL,
Цитата

CreateCompatibleDC()
создает точно такой же DC с какого его берут.


Fireworm, я не точно знаю как работает ATL - а так вроде на первый взгляд все верно, только почему ты создаешь hNoteDC = CreateCompatibleDC(hdcMem);  от hdcMem - в момент создания там нет еще Битмапы, так что ИМХО - собака зарыта тут...
Сделай второй раз тоже как и при hbmMem = CreateCompatibleBitmap(hdc, 325, 175);
Записан

А птичку нашу прошу не обижать!!!
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #3 : 29-07-2003 10:17 » 

Цитата

RXL, Цитата:

CreateCompatibleDC()

создает точно такой же DC с какого его берут.

По умолчанию создает монохромный DC. Вот если к нему прицепить цветную битмапку, то и DC станет по количеству цветов битмапки. MSDN где-то есть специальное напоминание об этом.
И на себе не раз проверял, когда забывал об этом Улыбаюсь
Записан

Megabyte be with you!
Fireworm
Гость
« Ответ #4 : 29-07-2003 10:24 » 

ГРОМ: Не совсем понял что ты имееш в виду?
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #5 : 29-07-2003 11:44 » 

Любой DC создается с битмапой.
Созданная битмапа не монохромна!!! Ее хидер ТАКОЙЖЕ как и в предыдущем от кого она создана, но она пуста.


Когда битмапа уже готова SelectObject может закрепить ее на DC.
Fireworm, ты создал пустую битмапу... потом от пустого делаешь еще раз создание DC.

Цитата

DeleteObject(hNoteBmp);
 DeleteDC(hNoteDC);

 Этот код у тебя убивает объект битмапки - которая BitBlt выведена на промежуточный DC - ИМХО - я не уверен что это так, но может при этом сама положенная на экран битмапка при повторном BitBlt может быть уже пустой!


Зачем???
Т.е. первое - возможно в этом случае битмапка не создается верно или создается так, что не возможно потом вывести - не знаю но так не делают - есть исходный образец, а от него создают все Compatible объекты...

Потом второе....
Записан

А птичку нашу прошу не обижать!!!
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #6 : 29-07-2003 11:56 » 

Цитата

Любой DC создается с битмапой.
Созданная битмапа не монохромна!!! Ее хидер ТАКОЙЖЕ как и в предыдущем от кого она создана, но она пуста.

Гром, ты гонишь

Вот выдержку из MSDN по поводу CDC::CreateCompatibleDC()
Цитата

Creates a memory device context that is compatible with the device specified by pDC. A memory device context is a block of memory that represents a display surface. It can be used to prepare images in memory before copying them to the actual device surface of the compatible device.

When a memory device context is created, GDI automatically selects a 1-by-1 monochrome stock bitmap for it. GDI output functions can be used with a memory device context only if a bitmap has been created and selected into that context.
Записан

Megabyte be with you!
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #7 : 29-07-2003 12:34 » 

Lex, да гоню...  Я шокирован! плохо - забываю уже... :? прошу прощения.
Записан

А птичку нашу прошу не обижать!!!
Fireworm
Гость
« Ответ #8 : 29-07-2003 14:09 » new

Всем спасибо. Заработал вот такой код
Код:
HBITMAP hNoteBmp;
HDC     hNoteDC;

hNoteDC = CreateCompatibleDC(hdc);
hNoteBmp = (HBITMAP)LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDB_SPEEDOMETR),IMAGE_BITMAP,
0,0, LR_LOADTRANSPARENT );

SelectObject(hNoteDC, hNoteBmp);
SetBkMode(hNoteDC, TRANSPARENT);
BitBlt(hdc, rc.left, rc.top, rc.right-rc.left,
            rc.bottom-rc.top, hNoteDC, 0, 0, SRCCOPY);

DeleteObject(hNoteBmp);
DeleteDC(hNoteDC);
« Последнее редактирование: 19-11-2007 16:33 от Алексей1153++ » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines