2015-08-08 42 views
0

我是新來使用GDI +,我不知道如何解決創建和配置,我有對象的一塌糊塗。現在所有的程序需要做的是處理重複WM_PAINT消息和增加度更新DrawPie各一次。如何正確WM_PAINT油漆與GDI +

我在窗口啓動時調用了GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);,在WM_DESTROY上調用了GdiplusShutdown(gdiplusToken);

度接近頂部定義的全局變量:

volatile double degrees = 0;

這裏是我的WM_PAINT

case WM_PAINT: { 
    hdc = BeginPaint(hWnd, &ps); 

    Graphics g(hdc); 
    Pen p(Color::Green); 
    if (degrees > 0) { 
     if (degrees == 360) { 
      g.DrawEllipse(&p, 0, 0, 100, 100); 
     } else { 
      g.DrawPie(&p, 0, 0, 100, 100, -90, degrees); 
     } 
    } 

    EndPaint(hWnd, &ps); 
    break; 
} 

這裏是更新程度和更新窗口中的功能(這是在單獨線程):

void UpdateDegrees() { 
    for (;;) { 
     if (globalHWND != NULL) { 
      degrees += 0.1; 
      InvalidateRect(globalHWND, NULL, TRUE); 
      UpdateWindow(globalHWND); 
     } 
    } 
} 

如果我運行它,我得到一個「實」的餅形象this,我以爲它只是在每一個角度重新繪製本身。它需要像this,換言之,清除圖形它每次重繪自己之前。 (對不起,我想我需要10個代表來發布內嵌圖片)

我知道我沒有正確初始化和/或處理我的圖形,但我真的不知道該怎麼做。任何幫助將不勝感激!謝謝。

+0

永遠不要從工作線程執行此操作,繪畫不是線程安全的。如果想要動畫,則使用SetTimer(),選擇15或31的間隔,然後調用InvalidateRect()。計算一個合適的角度增量。 –

回答

0

有很多方法可以做到這一點,標準之一是處理WM_ERASEBKGND消息。

爲了簡單起見,可以只填滿整個剪輯RECT一個白色矩形(在PS中指定),其將清除被塗的背景。

SolidBrush backGroundBrush(Color(255,255,255)); 
Rect clipRect(ps->rcPaint.left, ps.rcPaint.top, ps->rcPaint.right - ps->rcPaint.left, ps->rcPaint.bottom - ps.rcPaint.top); 
g.FillRectangle(&backgroundBrush, Rect(ps->rcPaint.left, ps.rcPaint));