WM_NCPAINT
От: Motek  
Дата: 08.08.03 08:17
Оценка:
Всем привет!

Help needed!

Делаю рулеры в окошках граф.редактора. Предполагается их отрисовывать в неклиентской области окна
есть CChildFrame. Есть мой класс CRuler. Все красиво рисуется.
Проблема в том, что по движению мышью надо перерисовать только прямоугольник, в котором происходят изменения, иначе дергается. Делаю это так:

void CRuler::setMousePos(long viPos) {
// ...

CRect invRect;
// Вычисляем прямоугольник

CRgn rgn;
rgn.CreateRectRgnIndirect(invRect);

HRGN hrgn = rgn;

pFrame->SendMessage(WM_NCPAINT, (WPARAM)hrgn, 0);

// ...
}

void CChildFrame::OnNcPaint() {
CWindowDC dc(this);
CRect invRect;
dc.GetClipBox(&invRect);
TRACE("OnNcPaint: (%d,%d,%d,%d)\n", invRect.left, invRect.top, invRect.right, invRect.bottom);
// invRect — не тот, который я послал, а _все_ окно.
// ...
}

Как эта проблема лечится?

Заранее спасибо!
Re: WM_NCPAINT
От: almel  
Дата: 08.08.03 14:11
Оценка:
Здравствуйте, Motek, Вы писали:

M> <...>


wParam, если он не равен 1, содержит дескриптор региона обновления.

Пример из MSDN:

HDC hdc;
hdc = GetDCEx(hwnd, (HRGN)wParam, DCX_WINDOW|DCX_INTERSECTRGN);
// Paint into this DC
ReleaseDC(hwnd, hdc);
Если есть способ сделать дело лучше, найди его. Эдисон
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.