Клиентская область
От: Repdiablo  
Дата: 01.04.03 06:14
Оценка:
Ребята, подскажите пожалуйста как мне очистить клиентскую область???
Пишу на Visual C++6.0, Platform SDK.


Заранее благодарен!!!
Re: Клиентская область
От: iaiel  
Дата: 01.04.03 06:19
Оценка:
Что значит очистить? Залить каким-то цветом? Тогда GetClientRect+GetDC+FillRect/FillRgn.
Или просто инициировать перерисовку? Тогда для MFC Invalidate+UpdateWindow, а для API InvalidateRect.
Re[2]: Клиентская область
От: Repdiablo  
Дата: 01.04.03 06:25
Оценка:
Здравствуйте, iaiel, Вы писали:

I>Что значит очистить? Залить каким-то цветом? Тогда GetClientRect+GetDC+FillRect/FillRgn.


А тормозить не будет если я делаю это в WM_PAINT???

I>Или просто инициировать перерисовку? Тогда для MFC Invalidate+UpdateWindow, а для API InvalidateRect.


Для API, когда я делаю InvalidateRect в WM_PAINT(а мне там и надо) то все мегает. Можно это как — нибудь обойти???
Re[3]: Клиентская область
От: iaiel  
Дата: 01.04.03 06:54
Оценка: 8 (1)
Здравствуйте, Repdiablo, Вы писали:

R>А тормозить не будет если я делаю это в WM_PAINT???

Что-то не понял, почему должна тормозить заливка.


R>Для API, когда я делаю InvalidateRect в WM_PAINT(а мне там и надо) то все мегает. Можно это как — нибудь обойти???

Можно, сделать двойную буферизацию.
Примерно так.

    HDC hdc=GetDC(hwnd); //контекст перерисовки
    HDC mem_hdc=CreateCompatibleDC(hdc); //контекст в памяти, куда и будем рисовать

    GetClientRect(hwnd,&rect);

    HBITMAP bmp=CreateCompatibleBitmap(hdc,rect.right,rect.bottom); //битмап для контекста
    HBITMAP _bmp=(HBITMAP)SelectObject(mem_hdc,bmp);
    FillRect(mem_hdc,&rect,brush);

// ... вся остаольная твоя перерисовка


    BitBlt(hdc,0,0,rect.right,rect.bottom,mem_hdc,0,0,SRCCOPY);

    SelectObject(mem_hdc,_bmp);
    DeleteObject(bmp);

    ReleaseDC(hwnd,hdc);
    DeleteDC(mem_hdc);

Но учти, если у тебя в перерисовке будут интенсивный вычисления, то ты не увидешь динамику прорисовки.
Re[3]: Клиентская область
От: Slicer [Wirkwood] Россия https://ru.linkedin.com/in/maksim-gumerov-039a701b
Дата: 01.04.03 07:16
Оценка:
Тормозить не должно. И тебе нужен (выводя из твоего постинга) именно этот вариант (FillRect).
Двойная буферизация рулез фарева

Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Re[4]: Клиентская область
От: Repdiablo  
Дата: 01.04.03 07:35
Оценка:
Здравствуйте, Slicer [Wirkwood], Вы писали:

SW>Тормозить не должно. И тебе нужен (выводя из твоего постинга) именно этот вариант (FillRect).

SW>Двойная буферизация рулез фарева

SW>Slicer


А подскажите как использовать FillRgn, как мне этот регион получить.
Простите я просто ужасно боюсь этих регионов!
Re[4]: Клиентская область
От: Repdiablo  
Дата: 01.04.03 07:39
Оценка:
Здравствуйте, iaiel, Вы писали:

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


R>>А тормозить не будет если я делаю это в WM_PAINT???

I>Что-то не понял, почему должна тормозить заливка.

I>

R>>Для API, когда я делаю InvalidateRect в WM_PAINT(а мне там и надо) то все мегает. Можно это как — нибудь обойти???
I>Можно, сделать двойную буферизацию.
I>Примерно так.

Спасибо большое, я попробовал все работает. Только я понял что мне надо не все а регион обновлять.
А как заполнить стректуру HRGN не понял.

Подскажите пожалуйста.

HRGN hrgn, // handle to region to be filled
Re[5]: Клиентская область
От: iaiel  
Дата: 01.04.03 08:11
Оценка: 16 (1)
Здравствуйте, Repdiablo, Вы писали:

R>А как заполнить стректуру HRGN не понял.

R>Подскажите пожалуйста.
R> HRGN hrgn, // handle to region to be filled

Тогда так.

const int points_count =10; //количество точек в полигоне
POINT points[points_count];
//заполняешь points точками-вершинами полигона
//..

HRGN hRgn=CreatePolygonRgn((POINT*)&points,points_count,ALTERNATE /*или WINDING*/);

HBRUSH hBrush=CreateSolidBrush(RGB(0,0,0)); //например, так

FillRgn(hdc, rgn, brush);

DeleteObject(hBrush);
DeleteObject(hRgn);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.