Pull to refresh

Comments 12

Мерцание экрана при непосредственном рисовании

не использовать InvalidateRect и vector, а LineTo в WM_LBUTTONDOWN и MoveToEx в WM_MOUSEMOVE, не?
vector все-таки нужен. В ином случае, при изменении размеров окна или рисовании новой линии (т.е. при действиях, посылающих окну WM_PAINT) — все старые линии будут стираться. А нам нужно восстанавливать полную картину.
А LineTo и MoveTo целесообразно использовать при получении сообщения WM_PAINT.
я конечно же перепутал LineTo и MoveToEx.
Вот так сократил код и без мерцания
static POINT t,old; static bool status=false; PAINTSTRUCT pt;
HDC hdc=GetDC(hWnd);
switch(msg) {
    case WM_LBUTTONUP: status = false;
        break;
    case WM_LBUTTONDOWN:
	status=true;
    case WM_MOUSEMOVE: 
	GetCursorPos(&t);
        ScreenToClient (hWnd, &t);
	if(status) msg==WM_LBUTTONDOWN?MoveToEx(hdc,t.x,t.y,NULL):LineTo(hdc, t.x, t.y);
        break;
}
А где ReleaseDC? Лучше где-нибудь в WM_INITDIALOG его получить, а в WM_DESTROY сделать ReleaseDC.

Я бы еще добавил в WM_LBUTTONDOWN SetCapture, а в WM_LBUTTONUP ReleaseCapture.
А зачем освобождать device context, когда он не создается? Ведь GetDC возвращает уже готовый контекст окна
Скажем так: это зависит от флагов класса окна (в частности CS_OWNDC). Т.е. не во всех случаях GetDC будет возвращать один и тот же DC при каждом вызове, что будет вести к утечке ресурсов. Ну и кроме того, все же освобождать ресурс после его использования и перед новой его аллокацией — таки правило хорошего тона.
Чтобы не мерцало — вместо TRUE, передавайте FALSE:
InvalidateRect(hwnd, NULL, FALSE)
Можно ещё немного сократить:
Здесь можно убрать break, раз есть return;
return TRUE;
break;

А лучше вообще
case WM_INITDIALOG: 
status = false;
return TRUE;
break;

Поменять на
case WM_INITDIALOG: 
return !(status = false);


Тогда уложишься в 30 строк
Благодарю, как-то не подумал о таком варианте сокращения кода )
Жаль, кармы не хватает плюсануть.
Sign up to leave a comment.

Articles