Отслеживание изменений HDC
Нужно написать ф-ю, которая бы не возвращалась, пока в этой области происходят какие-то изменения (идет рисование). Черновой вариант:
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, она прекращает работу.
В принципе, всё работает, но наверняка это можно сделать не так коряво. К тому же, проверка очень медленная. Как улучшить?
DIB-секция?
Цитата: k3Eahn
DIB-секция?
Рядом с моим ником написано: "Начинающий", так это и правда про меня.
Пишите по-яснее, пожалуйста.
Суть сего метода (то, что он будет работать так как надо не гарантирую - просто-напросто это мои соображения:)) заключается в использовании DIB (Device Independent Bitmap). DIB можно создать при помощи функции CreateDIBSection (см. MSDN). Плюс диб-секций в том что, ты работаешь с изображением вроде как напрямую.
Создаёшь два диба размером с зону, которую тебе надо отслеживать. Выбираешь один из полученных дибов в контекст. Далее например ты рисуешь что-нибудь в этом контексте, чтобы получить "эталонный" диб. После этого выбираешь второй диб в этот контекст и "ждёшь" изменений (сравнивая буферы "эталонного" и второго дибов чем -нибудь вроде memcmp).
Ну и, наверное, лучше будет, если всё это дело будет крутиться в отдельном потоке.
Предложение отличное! Как раз то, что нужно (memcmp). Отдельный поток - само собой. СПАСИБО!