Окно затирается черным
От: fregate Россия  
Дата: 12.09.11 05:01
Оценка:
Всем привет.

Окно, при перерисовке, заливается черным цветом, а хочется, что бы ничем (была бы дырка или цвет родителя, например).

WM_ERASEBKGND ловится, возвращаю 1 (в мсдн говорят, что как будто этим я указываю о том, что сам все стер). и если не заливать экран каким-нить цветом, то все окно будет черным.
Может быть что-то изменилось в последнее время с отрисовкой окна в винде, а я это пропустил? повторяется и для ХР и для 7.

в определении класса использую нулевую кисть
DECLARE_WND_CLASS_EX(_T("MyListCtrl"), CS_CLASSDC | CS_PARENTDC, NULL_BRUSH)
Re: Окно затирается черным
От: Figaro Россия  
Дата: 12.09.11 05:44
Оценка:
Не знаю что сейчас в МСДН, давно не читал, но по памяти — возврат 1 при WM_BACKGROUND означает что в обработчике WM_PAINT ты сам собираешься рисовать бэкграунд....
Re[2]: Окно затирается черным
От: Figaro Россия  
Дата: 12.09.11 05:45
Оценка:
Здравствуйте, Figaro, Вы писали:

F> Не знаю что сейчас в МСДН, давно не читал, но по памяти — возврат 1 при WM_BACKGROUND означает что в обработчике WM_PAINT ты сам собираешься рисовать бэкграунд....


WM_ERASEBACKGROUND конечно...
Re[3]: Окно затирается черным
От: fregate Россия  
Дата: 12.09.11 06:50
Оценка:
Здравствуйте, Figaro, Вы писали:

F>Здравствуйте, Figaro, Вы писали:


F>> Не знаю что сейчас в МСДН, давно не читал, но по памяти — возврат 1 при WM_BACKGROUND означает что в обработчике WM_PAINT ты сам собираешься рисовать бэкграунд....


F>WM_ERASEBACKGROUND конечно...


Ну да, собираюсь. Кто его тогда черным закрашивает? У меня в этом вопрос.
Re: Окно затирается черным
От: CEMb  
Дата: 12.09.11 07:44
Оценка:
Здравствуйте, fregate, Вы писали:

F>Окно, при перерисовке, заливается черным цветом, а хочется, что бы ничем (была бы дырка или цвет родителя, например).


F>WM_ERASEBKGND ловится, возвращаю 1 (в мсдн говорят, что как будто этим я указываю о том, что сам все стер). и если не заливать экран каким-нить цветом, то все окно будет черным.

F>Может быть что-то изменилось в последнее время с отрисовкой окна в винде, а я это пропустил? повторяется и для ХР и для 7.

F>в определении класса использую нулевую кисть

F>DECLARE_WND_CLASS_EX(_T("MyListCtrl"), CS_CLASSDC | CS_PARENTDC, NULL_BRUSH)

Дублирующий буфер применяется где-нить?..
Re[2]: Окно затирается черным
От: fregate Россия  
Дата: 12.09.11 08:40
Оценка:
CEM>Дублирующий буфер применяется где-нить?..

да



    void OnPaint(CDCHandle dc)
//    LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
    {
        T* pT = static_cast<T*>(this);
        ATLASSERT(::IsWindow(pT->m_hWnd));

        if(dc.m_hDC != NULL)
        {
            RECT rect = { 0 };
            pT->GetClientRect(&rect);
            CMemoryDC dcMem((HDC) dc.m_hDC, rect);
            pT->DoPaint(dcMem.m_hDC);
        }
        else
        {
            CPaintDC dc(pT->m_hWnd);
            CMemoryDC dcMem(dc.m_hDC, dc.m_ps.rcPaint);
            pT->DoPaint(dcMem.m_hDC);
        }

    }
Re[4]: Окно затирается черным
От: Figaro Россия  
Дата: 12.09.11 12:07
Оценка: 3 (1)
Здравствуйте, fregate, Вы писали:

f> Ну да, собираюсь. Кто его тогда черным закрашивает? У меня в этом вопрос.


Сам и закрашиваешь:

CMemoryDC dcMem((HDC) dc.m_hDC, rect);
pT->DoPaint(dcMem.m_hDC);


Глянь на деструктор CMemoryDC...
Re: Окно затирается черным
От: ononim  
Дата: 12.09.11 12:18
Оценка:
F>Окно, при перерисовке, заливается черным цветом, а хочется, что бы ничем (была бы дырка
Дырка докуда? Через монитор насквозь чтоли?

F>или цвет родителя, например).

Вот и заливай цветом родителя. В смысле бери в обработчике WM_ERASEBKGND brush родителя и заливай свой регион ею. Родитель сам по себе не будет скорее ничего рисовать в области, занятой дочерними окнами, особенно если у него WS_CLIPCHILDREN установлен.

F>WM_ERASEBKGND ловится, возвращаю 1 (в мсдн говорят, что как будто этим я указываю о том, что сам все стер). и если не заливать экран каким-нить цветом, то все окно будет черным.

А ты на самом деле стер все или просто возвращаешь 1 ?
Как много веселых ребят, и все делают велосипед...
Re[3]: Окно затирается черным
От: CEMb  
Дата: 12.09.11 16:30
Оценка:
Здравствуйте, fregate, Вы писали:


CEM>>Дублирующий буфер применяется где-нить?..


F>да



F>

F>    void OnPaint(CDCHandle dc)
F>//    LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
F>    {
F>        T* pT = static_cast<T*>(this);
F>        ATLASSERT(::IsWindow(pT->m_hWnd));

F>        if(dc.m_hDC != NULL)
F>        {
F>            RECT rect = { 0 };
            pT->>GetClientRect(&rect);
F>            CMemoryDC dcMem((HDC) dc.m_hDC, rect);
            pT->>DoPaint(dcMem.m_hDC);
F>        }
F>        else
F>        {
F>            CPaintDC dc(pT->m_hWnd);
F>            CMemoryDC dcMem(dc.m_hDC, dc.m_ps.rcPaint);
            pT->>DoPaint(dcMem.m_hDC);
F>        }

F>    }
F>


Голова болит, ничё не пойму первичной заливки исходной картинки в dcMem не вижу.
Короче, когда используется дублируюший буфер, то надо при отрисовке из родного DC в memDC содержимое отрендорить, потому как в memDC при создании как раз тот самый чёрный фон. Вот его надо залить naative-ным. Потом уже рисовать, потом обратно из memDC в DC лить.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.