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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Координаты битмапа и DC  (Прочитано 10755 раз)
0 Пользователей и 1 Гость смотрят эту тему.
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« : 07-09-2006 07:27 » 

Всем привет!

В общем проблема такая. Создаю я битмап:
HBITMAP hBMP=CreateDIBitmap(myDC.m_hDC, &BMPInfo.bmiHeader, CBM_INIT, NULL, &BMPInfo, DIB_RGB_COLORS);

Создаю совместимый с монитором DC:
    CDC* pDC=GetDC();
     CDC myDC;
      myDC.CreateCompatibleDC(pDC);

Прикручиваю к нему свой битмап:
HBITMAP hOldBitmap=(HBITMAP)myDC.SelectObject(hBMP);

Рисую на нем черный прямоугольник по всей его поверхности
    myDC.FillSolidRect(0, 0, BMPInfo.bmiHeader.biWidth, BMPInfo.bmiHeader.biHeight, RGB(0, 0, 0));

В итоге получаю маленький прямоугольничек!
Почему он не рисуется на всей поверхности битмапа? Ведь MapMode стоит MM_TEXT (сам проверял) т.е. логическая координата должна быть равна 1 пикселю, а она получается что не равна Жаль.

Что не так знатоки подскажите!!!!
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Джон
просто
Администратор

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

« Ответ #1 : 07-09-2006 10:45 » 

А чуток побольше кода? Не совсем ясно - что значит "маленький"? А какой он должен быть?
Например соотношение. Какие размеры родительского окна?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #2 : 08-09-2006 01:48 » 

Когда создается битмап:
HBITMAP hBMP=CreateDIBitmap(myDC.m_hDC, &BMPInfo.bmiHeader, CBM_INIT, NULL, &BMPInfo, DIB_RGB_COLORS);

в структуре BMPInfo передаются параметры этого битмапа - цвет 3байта на пиксель, ширина 410, высота 43
И когда я вызываю функцию myDC.FillSolidRect(0, 0, 410, 43, RGB(0, 0, 0));
то насколько я понимаю 410*43*3 ,байт должны обнулиться, но когда я получаю изображение:
    int BytePerPixel=(int)(0.5+BMPInfo.bmiHeader.biBitCount/8);
      DWORD PicSize=BMPInfo.bmiHeader.biWidth*BMPInfo.bmiHeader.biHeight*BytePerPixel;
       char* pBuf=new char[PicSize];
       GetBitmapBits(hBMP, PicSize, pBuf);

То в нем обнулены только первые несколько сотен байт, т.е. черный не весь битмап а лишь какаято его часть и я понять не могу почему
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
acc15
Гость
« Ответ #3 : 08-09-2006 06:00 » 

Цитата
HBITMAP hBMP=CreateDIBitmap(myDC.m_hDC, &BMPInfo.bmiHeader, CBM_INIT, NULL, &BMPInfo, DIB_RGB_COLORS);

Цитата
CBM_INIT - If this flag is set, the system uses the data pointed to by the lpbInit and lpbmi parameters to initialize the bitmap bits.
а у тебя lpbInit = NULL. Удивительно как вообще ничего не рухнуло...

надо так
Код:
HBITMAP hBMP=CreateDIBitmap(myDC.m_hDC, &BMPInfo.bmiHeader, 0, NULL, 0, DIB_RGB_COLORS);

Цитата
в структуре BMPInfo передаются параметры этого битмапа - цвет 3байта на пиксель, ширина 410, высота 43
теперь это передаётся через 2ой параметр (если CBM_INIT не установлен), у тебя это &BMPInfo.bmiHeader.

Да и я что-то не понимаю зачем заливать черным ректом черный битмап (такой он будет если не использовать CBM_INIT)
« Последнее редактирование: 08-09-2006 06:06 от acc15 » Записан
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #4 : 08-09-2006 08:27 » 

Цитата
а у тебя lpbInit = NULL. Удивительно как вообще ничего не рухнуло...
Просто раньше я инициализировал буфером pImage, теперь его убрал а про CBM_INIT подзабыл. Поставил я его в 0, все равно ничего не изменилось. Все как было так и осталось, нулями заполняется не весь битмап

Цитата
Да и я что-то не понимаю зачем заливать черным ректом черный битмап (такой он будет если не использовать CBM_INIT)

Странно у меня он почемуто серый (CD), даже если убрать CBM_INIT поэтому нули на нем очень хорошо видны визуально.
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
acc15
Гость
« Ответ #5 : 08-09-2006 08:42 » 

Такой вопрос тебе битмап загружать из файла надо?... или просто для рисования (и может быть дальнейшего сохранения)?
Попробуй вместо CreateDIBitmap() - CreateCompatibleBitmap()
Если не нужно инициализировать данные то это будет попроще...
« Последнее редактирование: 08-09-2006 08:44 от acc15 » Записан
zubr
Гость
« Ответ #6 : 08-09-2006 14:10 » 

USBLexus, покажи как ты инициализируешь структуру BITMAPINFO. Надо примерно так:
Код:
bmf.bmiHeader.biSize=sizeof(bmf.bmiHeader);
    bmf.bmiHeader.biWidth=width;
    bmf.bmiHeader.biHeight=height;
    bmf.bmiHeader.biPlanes=1;
    bmf.bmiHeader.biBitCount=24;
    bmf.bmiHeader.biCompression=BI_RGB;
    bmf.bmiHeader.biSizeImage=((width*3+3) & 0xFFFFFFFC)*height;
Здесь важно в bmf.bmiHeader.biSizeImage выравнивание по 3 байтам.
Записан
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #7 : 11-09-2006 02:22 » 

Я его не инициализирую, я его из файла считываю, все выравнено нормально и все размеры правильно указаны
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #8 : 12-09-2006 02:50 » 

Почемуто CreateDIBitmap создает битмап с 1 битом/пиксель хотя в BMPInfo 24 бита/пиксель, понять не могу почему(((((
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Dimitry
Гость
« Ответ #9 : 12-09-2006 04:36 » 

При вызове CreateDIBitmap() не указывай параметр hDC - замени его на NULL, в противном случае создаётся Bitmap с параметрами устройства.

Как ни странно, при создании hDC в памяти (т.е. CreateCompatihbleDC(...)), то он создаётся как раз "монохромным". После создания в него можно выбрать цветной Bitmap, тогда он станет полноцветным.

Если уж очень хочется указать hDC при вызове CreateDIBitmap(), то указывай hDC самого монитора - не myDC.m_hDC, а pDC->m_hDC.

Итого, имеем:
HBITMAP hBM;
HDC hDC;
HBITMAP hBMOld;

hBM = CreateDIBitmap(NULL, &BMPInfo.bmiHeader, 0, NULL, &BMPInfo, DIB_RGB_COLORS);
hDC = CreateCompatibleDC(NULL);

hBMOld = SelectObject(hDC, hBM);

<рисуем на DC>

SelectObject(hDC, hBMOld);
DeleteDC(hDC);
« Последнее редактирование: 12-09-2006 04:43 от Dimitry » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines