2016-02-11 3 views
0

Добрый день,Рисунок: WM_MOUSEMOVE

Что лучше всего подходит для рисования мышью? Я вижу много примеров (в MSDN), когда рисунок выполняется в WM_MOUSEMOVE. Но я думаю, что лучший подход - это все рисование в WM_PAINT.

Пример:

Version 1

case WM_MOUSEMOVE: 
{ 
    DummyFunctionForClientCoords(); 
    DummyFunctionForDrawing(); 
} 
break; 

Version 2

case WM_MOUSEMOVE: 
    { 
     DummyFunctionForClientCoords(); 
     InvalidateRect(hwnd, &rc, TRUE); /* For sake of simplicity, update region is all area. */ 
    } 
    break; 

case WM_PAINT: 
    { 
     DummyFunctionForDrawing(); 
    } 
    break; 

Может быть, этот вопрос мнение основано, но я хочу знать преимущества и недостатки Версия 1 против Версия 2.

+0

Что вы рисуете при движении мыши? –

+0

Вы можете рисовать, когда захотите; единственным правилом является то, что ваш обработчик 'WM_PAINT' должен иметь возможность воссоздать весь экран по требованию. Но обратите внимание, что сообщения 'WM_PAINT' генерируются только в том случае, если в очереди нет других сообщений, поэтому, если вы не используете« UpdateWindow »для принудительной перерисовки, вы получите задержанную обратную связь, если пользователь быстро перемещает мышь. –

+0

(Кстати, вопросы, касающиеся «лучшей практики», как правило, вне темы для SO, поскольку они основаны прежде всего на мнениях). –

ответ

2

Если у вас нет заметной причины, рендеринг всегда должен выполняться в обработчике WM_PAINT. Сообщение WM_PAINT генерируется по требованию, если область обновления не пуста, и в очереди сообщений нет других сообщений с более высоким приоритетом. Это имеет два непосредственных последствия:

  • Вводные сообщения обрабатываются до (потенциально дорогостоящего) рендеринга. Это приводит к более гибкому пользовательскому интерфейсу.
  • Несколько звонков в InvalidateRect объединены в одно сообщение WM_PAINT. Это снижает общую стоимость рендеринга.

Код, который вы размещены под Version 2 способна получать прибыль от системы при условии оптимизации.

Недостаток Версия 1 заключается в том, что все, что он отображает на экране, будет перезаписано, когда система решит сгенерировать сообщение WM_PAINT. Это еще более расточительно и потенциально не дает желаемого результата.


Не специально попросил в этом вопросе, но если вам нужно больше точности событие перемещения мыши, чем те, соединялись в одно WM_MOUSEMOVE сообщения, вы можете вызвать GetMouseMovePointsEx получить до 64 предыдущих позиций указателей (промежуточные) мышей.

Смежные вопросы