Comments 12
Мерцание экрана при непосредственном рисовании
не использовать InvalidateRect и vector, а LineTo в WM_LBUTTONDOWN и MoveToEx в WM_MOUSEMOVE, не?
+2
vector все-таки нужен. В ином случае, при изменении размеров окна или рисовании новой линии (т.е. при действиях, посылающих окну WM_PAINT) — все старые линии будут стираться. А нам нужно восстанавливать полную картину.
0
А LineTo и MoveTo целесообразно использовать при получении сообщения WM_PAINT.
0
я конечно же перепутал 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;
}
+2
А где ReleaseDC? Лучше где-нибудь в WM_INITDIALOG его получить, а в WM_DESTROY сделать ReleaseDC.
Я бы еще добавил в WM_LBUTTONDOWN SetCapture, а в WM_LBUTTONUP ReleaseCapture.
Я бы еще добавил в WM_LBUTTONDOWN SetCapture, а в WM_LBUTTONUP ReleaseCapture.
0
А зачем освобождать device context, когда он не создается? Ведь GetDC возвращает уже готовый контекст окна
0
Скажем так: это зависит от флагов класса окна (в частности CS_OWNDC). Т.е. не во всех случаях GetDC будет возвращать один и тот же DC при каждом вызове, что будет вести к утечке ресурсов. Ну и кроме того, все же освобождать ресурс после его использования и перед новой его аллокацией — таки правило хорошего тона.
+1
Чтобы не мерцало — вместо TRUE, передавайте FALSE:
InvalidateRect(hwnd, NULL, FALSE)
0
Горшочек, не вари!
+10
64k demo, всем 30-строчникам туда.
+6
Можно ещё немного сократить:
Здесь можно убрать break, раз есть return;
А лучше вообще
Поменять на
Тогда уложишься в 30 строк
Здесь можно убрать break, раз есть return;
return TRUE;
break;
А лучше вообще
case WM_INITDIALOG:
status = false;
return TRUE;
break;
Поменять на
case WM_INITDIALOG:
return !(status = false);
Тогда уложишься в 30 строк
+23
Sign up to leave a comment.
Рисовалка под Windows на C++, или «Ребята, я тоже ненормальный!» (30+ строк кода)