Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > StretchBlt меняем флаги...


Автор: ASMatic 22.8.2009, 22:32
Суть такова:

решил динамичски менять способ копирования с одного HDC в другой....Но почему то получается что окну по барабану что я меняю последний параметр для StretchBlt  и посылаю окну WM_PAINT...

case WM_PAINT:
{
...getDC etc)
    StretchBlt( 
            hMainDC,
            0, 0,
            MainWndWidth,
            MainWndHeight,
            hSrcDC, 
            0, 0, 
            1024,
            768,
                PaintMode );
break;

OnTimer( void )
{
    PaintMode = SRCAND;
    SendMessage( hLockWnd, WM_PAINT, 0, 0 );
}

После срабатывания таймера - окно получает ,обрабатывает но ничего на выводе не меняется. Почему так, что я не правильно сделал??

Добавлено через 10 минут и 55 секунд
да к стати я вот пробовал перед  StretchBlt сделать еще BitBlt( ...hBackDC...) ну сто бы зарисовать фон чем небудь - тоже не перерисовывает.....Эти BitBlt и StretchBlt  - как вообще копирую - полностью? Например - на одном DC нету картинки - только кисть и на другом такая же ситуация - они перерисуютс?? Или для тех БЛТ-шок надо именно битмапы??

Автор: ASMatic 23.8.2009, 01:07
Ну как бы уже есть прогресс, но все равно не работает как надо...теперь уже PatBlt, им я решил затирать перед выводом новой картинки, но не хочет он правильно работать....

Как я понял его задание брашом выбраного контекста зарисовать его прямоугольник...Но браш у меня синий, а рисует белым smile  Но когда поставить DSTINVERT,например, а не PATCOPY то желтым зарисовывает - что за бред у меня то получается???

Вот просьба - подскажите пожалуйста Как правильно менять картинку на HDC, но таким образом что бы перед тем HDC очищалось от предыдущей картинки,например закрасить черным....

Зарание благодарен....

Автор: ASMatic 23.8.2009, 04:44
http://forum.sources.ru/index.php?showtopic=38432

вроде нашел, завтра(сегодня)) посмотрю - всем спасибо за внимание.) Приятного вам воскресенья!

Автор: ASMatic 23.8.2009, 23:28
я видать ошибся - НИЧЕГО НЕ ПОЛУЧАЕТСЯ!!!! ХЕЛП!!!!


на данный момент получается что раз копирует DC а второй возвращает 0 - ошибка(((

как правильно?? ПАМАГИТЕ!!! мой галава уже не способна сама понять где она - сабака та зарыта smile 


Код


PaintMode = SRCCOPY;
....
        case WM_PAINT:

            hMainDC = BeginPaint( hMainWnd, &ps );
            hBackBrush = CreateSolidBrush(RGB(0,255,0));
            hOldBrush = SelectObject( hMainDC, hBackBrush  );

            ExtFloodFill( hMainDC,
                    0, 0,
                    RGB(255,0,0),
                    FLOODFILLBORDER);

            StretchBlt( 
                    hMainDC,
                    0, 0,
                    1024,
                    768,
                    hSrcDC, 
                    0, 0, 
                    1024,
                    768,
                    PaintMode);

            SelectObject( hMainDC, hOldBrush );
            DeleteObject( hBackBrush );
            EndPaint( hMainWnd, &ps );
                        break;


Зарисовывает зелёным, чё так не понимаю - зачем тогда указывать цвет закраски, если закрашиваем брашем....Потом все как нужно копирует и получается картинка на главном DC. Таймером меняю PaintMode и вот тебе - ExtFloodFill возвращает ошибку. Вычитал что:
"Only memory device contexts and devices that support raster-display operations support the ExtFloodFill function"
как понял - исключительно с CreateCompatibleDC(hMainDC), решил сделать третий - промежуточный DC все работает без ошибок, но ничего не меняется - как был синим так и остался...(синий потому что в классе указал синий браш)

Помогите , пожайлуста - не могу я сам справится уже....

Автор: Earnest 24.8.2009, 07:17
В коде рисования я не разбиралась, но посылать WM_PAINT через SendMessage - нонсенс. Ничего не произойдет (т.к. нет невалидных областей). Нужно делать Invalidate, тогда WM_PAINT придет в свое время. 

Автор: ASMatic 24.8.2009, 13:02
скажу что сообщение приходит и один раз норм срабатывает, может действительно из-за того что нельзя WM_PAINT посылать внаглую... Сделал инвалидейт и все гуд!! Спасибо!!! Долго я бы еще мучалсяsmile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)