簡體   English   中英

C ++ GDI繪制橢圓問題

[英]c++ gdi drawing ellipse problem

好的,我可以繪制橢圓,問題是這樣的,我試圖繪制一個橢圓,但是將其x值更改為另一個橢圓。 像這樣我畫一個橢圓,十秒鍾后x值是1我希望它的x值是10,但似乎我用x值10創建了新的橢圓。這是我的代碼

while(sd==1)//sd equal 1 
{
    sf++;//sf equals 1
    onPaint(hdc);
    InvalidateRect(hWnd,0,true);
}
//on paint function
VOID onPaint(HDC hdc)
{
   Graphics graphics(hdc);
   Pen      pen(Color(255, 0, 0, 255));
   graphics.DrawEllipse(&pen,sf , 0, 50, 50);
}

好吧,我認為無效矩形會清除所有已繪制的內容並重新繪制它,但是沒有用

您不應該嘗試一次繪制多幀動畫。

將變量sf保存在某個位置,然后在OnPaint()中增加sf ,繪制一個橢圓,然后調用Invalidate()

Invalidate將觸發OnPaint()再次被調用。

這應該可以,但是會非常閃爍:)您可以通過雙緩沖修復閃爍。

如果要制作動畫,最好設置一個計時器。

使用InvalidateRect作為生成WM_PAINT的方法似乎有點過頭了,但它所做的還遠遠不夠。 相反,您可以直接在OnTimer調用中進行繪制,因為它在WM_PAINT之外,因此您將需要使用GetDC獲取設備上下文。

例如,如果您可以使用函數DrawFrame(HDC hDC)。 OnTimer將更新當前位置並調用DrawFrame,OnPaint將調用DrawFrame但不會更新位置(這樣,如果您要停止動畫,則會繪制最后一幀)。

DrawFrame將清除背景(可能使用FillRect),並在新位置繪制圓。 如果您有較大的區域,這會閃爍,為避免出現這種情況,如Tom所建議的,您可以將內存DC和HBITMAP用於雙緩沖區。

InvalidateRect將窗口標記為“無效”,但這不會立即導致擦除和重新繪制。 僅當您的消息泵正在運行時(例如,帶有GetMessageDispatchMessage的循環),才進行擦除和繪畫。 當消息隊列耗盡時, GetMessage將為無效窗口合成WM_ERASEBKGNDWM_PAINT消息。 將這些消息分派到窗口過程后,窗口就有機會繪制。

您的onPaint函數僅繪制,不會擦除。 而且由於您的循環永遠不會退出,因此消息泵也永遠不會運行。

對於簡單的動畫,解決方案是SetTimer WM_TIMER消息的處理程序中,為單幀更新變量,調用InvalidateRect並返回(這使消息泵繼續運行)。 將會發生擦除和繪畫消息,然后計時器將再次觸發,您將獲得下一幀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM