2013-03-08 25 views
0

在MSDN,我讀這問題關於圖紙沒有WM_PAINT消息

當不使用WM_PAINT消息繪圖時,應用程序通常 不壞的窗口。相反,它以這樣的方式繪製,它可以很容易地恢復窗口並移除繪圖。

這是什麼意思?因爲我寫了一個GIS程序,我想實現「放大」功能, 鼠標左鍵按下並移動鼠標繪製一個矩形,它繪製一個矩形,但矩形覆蓋地圖,首先我認爲這是因爲矩形不透明,那麼我使用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中的評論與您的​​問題無關。 – 2013-03-08 14:39:17

+2

繪製選擇矩形的技巧是將繪圖筆設置爲異或模式'SetROP2(hDC,R2_XORPEN);'並用空心筆刷。第一次繪製將繪製一個線矩形反轉原始屏幕像素,第二次繪製在同一個矩形將恢復原始像素。參考這個例子:http://www.programmersheaven.com/mb/windows/104684/104684/drawing-a-selection-box-on-screen-with-the-mouse---example-code/ – mfc 2013-03-12 03:08:06

+1

如果你在你的項目中使用MFC,你可以簡單地使用'CRectTracker'類。 – mfc 2013-03-12 03:12:37

回答

1

以繪製矩形,可以繪製4行。或者使用清晰的筆刷 - 即使用筆刷風格BS_HOLLOW

要解決的另一個問題是,當用戶移動鼠標,縮放矩形將移動,您將需要重新繪製底下的東西。請執行以下操作:

  1. 調用InvalidateRect傳遞縮放矩形的上一個位置的矩形。
  2. 致電UpdateRect強制執行繪畫循環並繪製之前縮放矩形下的內容。
  3. 繪製新的縮放矩形。