Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Весь экран в массив GetDIBitом 
V
    Опции темы
Wolf
Дата 28.4.2009, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 9.6.2006
Где: Нижневартовск

Репутация: нет
Всего: нет



Хочу сделать текстуру из того, что есть на мониторе. Что-то не так. В массиве Wnd вообще нет изображения. GetDIBits возвращает 800 ласт эррор не возвращает.

Код

    HBITMAP bBMP;
    char *Wnd;
    BITMAPINFO bmpinfo;
    HDC Dtop;
    
    Dtop = GetDC(0);

    bBMP = CreateCompatibleBitmap(Dtop, 1280, 800);

    bmpinfo.bmiHeader.biHeight = 800;
    bmpinfo.bmiHeader.biWidth = 1280;
    bmpinfo.bmiHeader.biCompression = BI_RGB;
    bmpinfo.bmiHeader.biBitCount = 24;
    bmpinfo.bmiHeader.biSize = sizeof(bmpinfo.bmiHeader);
    bmpinfo.bmiHeader.biPlanes = 1;
    bmpinfo.bmiHeader.biSizeImage = 1280 * 800 * 3;
    bmpinfo.bmiHeader.biXPelsPerMeter = 1;
    bmpinfo.bmiHeader.biYPelsPerMeter = 1;
    bmpinfo.bmiHeader.biClrUsed = 0;
    bmpinfo.bmiHeader.biClrImportant = 0;

    Wnd = new char[1280 * 800 * 3];

    GetDIBits(Dtop, bBMP, 0, 800, Wnd, &bmpinfo, DIB_RGB_COLORS);

    Tex2 = new Texture(1280, 800, Wnd);
    delete[] Wnd;


Что-то может кто заметит. Что не так делаю...
PM MAIL ICQ   Вверх
GremlinProg
Дата 28.4.2009, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(Wolf @  28.4.2009,  20:26 Найти цитируемый пост)
bmpinfo.bmiHeader.biBitCount = 24;

Цитата(Wolf @  28.4.2009,  20:26 Найти цитируемый пост)
Wnd = new char[1280 * 800 * 3];

связь тут конечно есть, но ты не учел, что размер каждой строки нужно выравнивать при этом  на границе слова или двойного слова (вроде бы двойного)
используй 32 бита, чтобы это не высчитывать

Добавлено через 1 минуту и 48 секунд
да, двойного:
Цитата(GetDIBits @ MSDN)

The scan lines must be aligned on a DWORD except for RLE compressed bitmaps.



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Wolf
Дата 28.4.2009, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 9.6.2006
Где: Нижневартовск

Репутация: нет
Всего: нет



GremlinProg, не, не помогает.
PM MAIL ICQ   Вверх
GremlinProg
Дата 28.4.2009, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



не заметил:
Цитата(Wolf @  28.4.2009,  20:26 Найти цитируемый пост)
bBMP = CreateCompatibleBitmap(Dtop, 1280, 800);

зачем это? GetDIBits заполняет память содержимым битмапа, а не hdc, главное, чтобы битмап не был в него выбран:
Код

bBMP = ::GetCurrentObject(Dtop,OBJ_BITMAP);
hdc = ::CreateCompatibleDC(Dtop);
GetDIBits(hdc,bBMP,...);
::DeleteDC(hdc);



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Wolf
Дата 28.4.2009, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 9.6.2006
Где: Нижневартовск

Репутация: нет
Всего: нет



GremlinProg, спасибо за помощъ! Всё прекрасно работает : - )
PM MAIL ICQ   Вверх
GremlinProg
Дата 28.4.2009, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



всегда пожалуйста,
там еще один момент: hdc в принципе нужен только если используется палитра, т.е. в твоем случае, первым параметром можно передать просто NULL, тоже должно работать


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Wolf
Дата 28.4.2009, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 9.6.2006
Где: Нижневартовск

Репутация: нет
Всего: нет



GremlinProg, ок, понял. Буду знать теперь! : - )
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0637 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.