2013-03-08 4 views
0

В MSDN, я прочитал этоВопросы о вовлечении без WM_PAINT сообщения

При рисовании без использования сообщения WM_PAINT, приложение обычно не отменяет окно. Вместо этого он рисует таким образом , что он может легко восстановить окно и удалить чертеж.

Что это значит? Becuase Я написал программу GIS, я хочу реализовать функцию «Zoom In», Мышь левая кнопка вниз и переместите мышь, чтобы нарисовать прямоугольник, она рисует прямоугольник, но прямоугольник покрывает карту, сначала я думаю, что это потому, что прямоугольник не прозрачен, то я использую AlphaBlend() для рисования прозрачного прямоугольника, это то же самое. Что мне делать?

draw a rectangle

LRESULT OnMouseMove(UINT nflags, CPoint point) 
{ 
    if (m_bZoomInMode) 
    { 
     m_curScreenPoint.x = point.x; 
     m_curScreenPoint.y = point.y; 
     HDC hdc = GetDC(); 
     SelectObject(hdc, (HBRUSH)NULL_BRUSH); 
     Rectangle(hdc, m_startScreenPoint.x, m_startScreenPoint.y, point.x, point.y); 
     ReleaseDC(hdc); 
     return 0; 
    } 
} 
+0

Комментарий в MSDN не связан с вашей проблемой. –

+2

Трюк рисования прямоугольника выбора заключается в том, чтобы установить ручку рисования в режим XOR 'SetROP2 (hDC, R2_XORPEN);' и с полым щеткой. В первой ничьей будет рисовать прямоугольник, который инвертирует исходные пиксели экрана, вторая жеребьевка на том же прямоугольнике будет восстанавливать исходные пиксели. См. Этот пример: http://www.programmersheaven.com/mb/windows/104684/104684/drawing-a-selection-box-on-screen-with-the-mouse---example-code/ – mfc

+1

Если вы используют MFC в своем проекте, вы можете просто использовать класс 'CRectTracker'. – mfc

ответ

1

Чтобы нарисовать прямоугольник, вы можете нарисовать 4 линии. Или используйте чистую кисть - это стиль кисти BS_HOLLOW.

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

  1. Позвоните InvalidateRect, проложив прямоугольник для предыдущего расположения прямоугольника масштабирования.
  2. Позвоните UpdateRect, чтобы заставить цикл краски и нарисовать то, что было под предыдущим прямоугольником масштабирования.
  3. Нарисуйте новый прямоугольник зума.
Смежные вопросы