Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Отслеживание изменений HDC

17K
06 января 2007 года
Bosheit
26 / / 28.10.2006
Есть HDC и область на нем (координаты left, top, right, bottom)
Нужно написать ф-ю, которая бы не возвращалась, пока в этой области происходят какие-то изменения (идет рисование). Черновой вариант:

void Wait(HDC hdc, COLORREF** pBuffer)
{
for(int x=0; x<=TABLE_RIGHT-TABLE_LEFT; x++)
for(int y=0; y<=TABLE_BOTTOM-TABLE_TOP; y++)
pBuffer[x][y] = ::GetPixel(hdc, TABLE_LEFT+x, TABLE_TOP+y);

COLORREF clPixel;
bool Stop = false;
while(!Stop)
{
Stop = true;
for(int x=0; x<=TABLE_RIGHT-TABLE_LEFT; x++)
for(int y=0; y<=TABLE_BOTTOM-TABLE_TOP; y++)
{
clPixel = ::GetPixel(hdc, TABLE_LEFT+x, TABLE_TOP+y);
if(pBuffer[x][y] != clPixel)
{
pBuffer[x][y] = clPixel;
Stop = false;
}
}
}
}
Как только ф-я не находит разницы между буфером и текущим состоянием hdc, она прекращает работу.
В принципе, всё работает, но наверняка это можно сделать не так коряво. К тому же, проверка очень медленная. Как улучшить?
1.8K
06 января 2007 года
k3Eahn
365 / / 19.12.2005
DIB-секция?
17K
06 января 2007 года
Bosheit
26 / / 28.10.2006
Цитата: k3Eahn
DIB-секция?


Рядом с моим ником написано: "Начинающий", так это и правда про меня.
Пишите по-яснее, пожалуйста.

1.8K
06 января 2007 года
k3Eahn
365 / / 19.12.2005
Ну что ж придётся разжевать.

Суть сего метода (то, что он будет работать так как надо не гарантирую - просто-напросто это мои соображения:)) заключается в использовании DIB (Device Independent Bitmap). DIB можно создать при помощи функции CreateDIBSection (см. MSDN). Плюс диб-секций в том что, ты работаешь с изображением вроде как напрямую.
Создаёшь два диба размером с зону, которую тебе надо отслеживать. Выбираешь один из полученных дибов в контекст. Далее например ты рисуешь что-нибудь в этом контексте, чтобы получить "эталонный" диб. После этого выбираешь второй диб в этот контекст и "ждёшь" изменений (сравнивая буферы "эталонного" и второго дибов чем -нибудь вроде memcmp).
Ну и, наверное, лучше будет, если всё это дело будет крутиться в отдельном потоке.
17K
06 января 2007 года
Bosheit
26 / / 28.10.2006
Предложение отличное! Как раз то, что нужно (memcmp). Отдельный поток - само собой. СПАСИБО!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог