![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| InvalidProperty |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 356 Регистрация: 31.10.2007 Где: Россия, Казань Репутация: 1 Всего: 9 |
Проблема следующего рода:
для вывода jpg на контекст использую IImgCtx. Главное окно имеет вертикальный скролл. Хочу, чтобы при его прокручивании, изображение перемещалось, но не мерцало. Испольую двойную буферизацию. На WM_PAINT повешен следующий код:
проблема в том, что вместо jpg картинки отображается черный квадрат, хотя и не мерцает, но от этого не легче. Если же написать так:
то картинка будет нормально выводиться на контекст. Вопрос: почему картинка не выводится на контекст в памяти, а на контекст устройства выводится нормально? -------------------- dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null echo $0 >> $0 |
||||
|
|||||
| Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 8 Всего: 26 |
-------------------- ????? ??, ??????? ?????. |
|||
|
||||
| InvalidProperty |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 356 Регистрация: 31.10.2007 Где: Россия, Казань Репутация: 1 Всего: 9 |
Andrey44, спасибо!
Я пытался найти информацию по гуглу и на форуме, но, к сожалению, видимо, плохо искал, так что прошу за вопрос палкой по пятке не бить. Не мог бы мне кто-нибудь пояснить, как это все работает, т.е. я примерно понимаю почему нужно создавать совместимые битмапы и контексты устройства, но почему мы должны делать так
и после копирования контекста еще и выбираем обратно эти объекты
Далее происходит удаление контекста устройства
но ведь нужно еще и объекты удалить функцией DeleteObject. Объясните, плиз, кому не сложно, как это все работает, что и для чего нужно вызывать. -------------------- dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null echo $0 >> $0 |
||||||
|
|||||||
| GremlinProg |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
классически, двойной буфер выглядит вообще-то примерно так:
т.е. не нужно всякий раз создавать битмап на весь экран, область для закраски ведь уже указана, это ps.rcPaint и она не всегда размером с экран рабочий пример тут: http://forum.vingrad.ru/index.php?showtopi...t&p=1849405
это да, обязательно: все, что вдолг взято нужно вернуть
каждому конечно не объяснишь, просто напоминаю: http://forum.vingrad.ru/index.php?showtopi...t&p=1808104 -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||||
|
|||||||
| Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 8 Всего: 26 |
Не знал что так можно. -------------------- ????? ??, ??????? ?????. |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
конечно можно, это же не HBITMAP:
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| InvalidProperty |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 356 Регистрация: 31.10.2007 Где: Россия, Казань Репутация: 1 Всего: 9 |
GremlinProg, спасибо, но опять не понятно.
Понятно, что нужно перерисовывать только то, что указано в InvalidateRect, но я ведь указываю координаты вывода изображения в координатах окна (прошу прощения за тавтологию). Мне как-то не очень хочется каждый раз высчитывать, что будет перерисовано, а что нет. Может быть есть некие функции в winapi, которые облегчают данную участь? Т.е. вопрос в следующем: я хочу перерисовать только некоторую область, приходящую в paintstruct, но при этом я не хочу заморачиваться, что именно это за область и координаты всех картинок хочу просчитывать в координатах окна, а не области. Как мне это сделать?
-------------------- dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null echo $0 >> $0 |
|||
|
||||
| GremlinProg |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
тут проблем не должно быть: буфер распределяется размером с rcPaint ( CreateCompatibleBitmap(ps.hdc,cx,cy) ) координаты этого буфера автоматически устанавливаются в нужное положение ( SetWindowOrgEx(hdc,x,y,NULL) ) т.е. ничего считать каждый раз не нужно, все функции GDI при работе с hdc автоматически будут рисовать только в пределах этого буфера, все остальное будет отсекаться
это уже касается области прокрутки, а не двойной буферизации я тут ожидал бы непосредственно описание работы со scrollbar'ом: получение позиции окна - GetScrollPos, корректную обработку сообщений WM_HSCROLL / WM_VSCROLL и инициализацию скроллбара (SetScrollInfo) -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||||
|
|||||||
| InvalidProperty |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 356 Регистрация: 31.10.2007 Где: Россия, Казань Репутация: 1 Всего: 9 |
GremlinProg,
Andrey44, большое спасибо за содействие -------------------- dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null echo $0 >> $0 |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |