2014-11-23 43 views
-1

我正在編寫一個像Paint一樣的MFC應用程序。 我畫兩條線(按住並移動鼠標):如何在MFC中刪除行

第1步:處理WM_LBUTTONDOWN並獲取startPoint。

步驟2:使用LineTo()函數處理WM_MOUSEMOVE(使用MK_LBUTTON)來獲取endPoint,並從startPoint繪製一條線到endPoint。

但是在步驟2中,它在接收WM_MOUSEMOVE時繪製一行,因此創建了太多行。我想在這一步中刪除舊線並繪製新線。 (接收WM_LBUTTONUP時只繪製一條線)。 你能幫我嗎。謝謝大家。對不起,如果我的英語太糟糕了。

回答

0

在WM_MOUSEMOVE中設置endPoint變量但不繪製。而是調用Invalidate。這將導致擦除和重繪。所以在OnPaint/OnDraw中從startPoint到endPoint畫一條線。

+0

感謝您的回答。我是MFC新手。如果我調用Invalidate(),OnPaint()會清除客戶區中的所有內容?但我只想刪除以前的WM_MOUSEMOVE消息中的舊行並繪製當前行。你能幫我嗎? – 2014-11-24 07:10:33

+0

如果你想控制線的顏色和寬度,那麼它必須按照我所描述的完成。還有另一種使用XOR筆的方式,通常用於讓用戶拖動橡皮線或矩形。 XOR筆可以通過重畫來擦除。要研究這種方法,請在MSDN中查找SetROP2。 – 2014-11-24 15:04:52

+0

我有一些小問題,我需要你的幫助。你可以給我雅虎ID或其他我可以和你聊天的東西嗎?謝謝。 – 2014-11-26 12:03:10

1

在WM_LBUTTONDOWN中,將一個新的成員變量m_pMouseObject設置爲NULL。

在WM_MOUSEMOVE中,如果m_pMouseObject == NULL,則將m_pMouseObject設置爲新創建的線對象,否則在鼠標移動時繼續修改m_pMouseObject。

在WM_LBUTTONUP中,從m_pMouseObject創建最終的行對象並設置m_pMouseObject = NULL。

+0

感謝您的回答。但是我不知道我是否「來自m_pMouseObject的明確行對象」(調用Invalidate()),它將刪除我在客戶區繪製的所有形狀,不是嗎?我是MFC新手,我需要你的幫助。非常感謝你。 – 2014-11-24 07:14:02

+0

如果您遵循標準繪畫方式(當您收到WM_PAINT而不是鼠標移動時),invalidate將正確繪製對象 - 您還需要在鼠標移動過程中使對象的矩形失效 – 2014-11-24 07:32:38