![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
MoZy |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 4.6.2006 Репутация: 1 Всего: 0 |
Привет!
Мне нужно получить растр, обработать и воткнуть обратно в ДЦ. А еще лучше изменять ДЦ напрямую, или как сказано про CreateDIBSection: function creates a device-independent bitmap (DIB) that applications can write to directly. И сразу вопрос: какую роль играет первый параметр в этой функции? Просто как цветовой шаблон или в lpBits будет записано содержимое DC? Если не будет, то как это сделать. Хотелось бы кусок кода как это сделать. Для удобства приведу свой, результатом которого является серый квадрат:
В данном случае я пытаюсь создать секцию, записать в нее с экрана, потом из нее вывести на экран --------------------
Experimentia est optima rerum magistra |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Кажется, ты некорректно заполняешь структуру BITMAPINFO. Вот рабочий пример создания (это класс, оборачивающий DibSection).
-------------------- ... |
|||
|
||||
MoZy |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 4.6.2006 Репутация: 1 Всего: 0 |
Earnest, ой не знаю. Правильно неправильно, а я все равно не понял. Зачем нужен этот растр, если все равно изменяется только он. А чтобы увидеть изменения все равно надо SetDIBToDevice.
Earnest, а в твоем примере я смогу в секцию че-нить записать с помощью BitBlt? А то смысл теряется, если нет. --------------------
Experimentia est optima rerum magistra |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Не надо SetDIBToDevice. Все, что ты меняешь в дибе (т.е. в блоке pBits) - это и есть изменения соответствующего мемори-контекста. Другое дело, чтобы это увидеть, нужно содержимое мемори контекста бросить на экранный контекст. Для этого достаточно BitBlt, и это достаточно быстрая операция.
В DIB-секцию можно писать и через мемори-контекст, в котором она выбрана как подложка (BitBlt или любые графические операции - рисование линий, вывод текста, etc), и прямо (биты менять). В том-то и смысл ее. -------------------- ... |
|||
|
||||
MoZy |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 4.6.2006 Репутация: 1 Всего: 0 |
Earnest, круто, спасибо! я на это и надеялся. да вот только скажи, пожалуйста, тот hdc, который как параметр в функцию идет - это и есть тот самый, который тесно связан с растром, или нужно как-то потом SelectObject'ом выбирать ту битмапу, которая возвращается функцией?
![]() --------------------
Experimentia est optima rerum magistra |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Смотря в какую функцию.
Если для создания DIBSection - то любой сойдет, хоть десктопа. А если для рисования в растр, то, конечно, это должен быть тот самый "compatible dc", созданный по любому экранному dc и в котором выбрана DibSection. А как же иначе? -------------------- ... |
|||
|
||||
MoZy |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 4.6.2006 Репутация: 1 Всего: 0 |
Мдааа. Странно.
Earnest, с помощью твоей замечательной функции наконец-то создается у меня DIBSection. Правда сколько я не пытался писать в растр, на контексте это никак не отображается. Впрочем как и наоборот ) И еще почему-то когда я выбираю 32 битную палитру, растр вдруг становится двойного размера, то есть на один пиксель уходит 8 байт! Я немного подсократил функцию (может в этом проблема, но я просто не знаю откуда взять RGBQUAD):
У тебя случайно нет примерчика использования уже созданной DIBSection, а конкретнее работы с растром? я так пытаюсь:
и в итоге действия над растром вообще не воспринимаются ![]() --------------------
Experimentia est optima rerum magistra |
||||
|
|||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Я не понимаю тах сходу, что ты пытаешься засунуть в растр. А разбираться, извини, лень. Очевидно одно: за один раз нужно решать одну задачу, иначе ничего не получится. Я имею в виду, что у тебя слишком много мест, где может быть ошибка:
1) создание диб-секции (кстати, у меня был класс, а ты что, переменные гобальными сделал?) и выбор ее в контекст 2) StrechBlt в мемори-контекст 3) изменение битов диба 3) BitBlt на экран (ты ведь сразу пытаешься писать в контекст десктопа...). Каждый из этих пунктов нуждается в отдельной проверке. А сама последовательность вполне правильная: создаем секцию, выбираем в контекст, копируем что-то из другого контекста, дорисовываем прямой записью, копируем обратно... Правильно ли создается диб-секция? Заполни биты чем-нибудь, ну хоть красным или синим и выведи в обычное окно, с простыми координатами. Кстати, формат пикселов в дибе вовсе не RGB - в 24-битовом случае байты идут наоборот, а в 32 - не помню, но как-то с масками связано, а не так как ты думаешь, судя по коду. Кроме того, размер строки диба должен быть выровнен на двойное слово... Для проверки после выбора в контекст спроси у него параметры выбранного битмапа. Работай пока со своим окном и русуй на OnPaint. Прямую запись в растр пробуй на чем-нибуть простом, что легко проверить, заглянув в память: полоски нарисуй, например. И так по каждому пункту. Добавлено @ 08:49 Вот еще что заметила: Где ты увидел в моей функции выделение памяти под биты? Память под биты выделяет сама Windows, а не ты! Ты передаешь адрес указателя, который функция инициализирует. Ты хоть прочти внимательно описание CreateDibSection, чтобы понимать что к чему. -------------------- ... |
|||
|
||||
MoZy |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 4.6.2006 Репутация: 1 Всего: 0 |
Earnest, ) понять-то - понять, а выделение - дело вынужденное. Просто Винде не нравится (0хС00000005) что я пытаюсь читать из растра макросом MAPBIT. типа обращаюсь в невыделенную память, т е винда не выделяет память. вывод
нет.
как мне заполнить pColors? --------------------
Experimentia est optima rerum magistra |
||||
|
|||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Ты пытаешься читать по невалидному адресу, конечно, программа будет падать!
Добавление к моему предыдущему посту прочти внимательно! Пока это не починишь, дальше и соваться нечего. А pColors тебе не нужно, если у тебя растр полноцветный, здесь все правильно. -------------------- ... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |