使用 Direct2D 繪製
建立圖形資源之後,您就可以開始繪製。
繪製橢圓形
Circle程式會執行非常簡單的繪圖邏輯:
- 以純色填滿背景。
- 繪製填滿的圓形。
因為轉譯目標是視窗 (,而不是點陣圖或其他螢幕外表面) ,所以繪圖會回應 WM_PAINT 訊息。 下列程式碼顯示 Circle 程式的視窗程式。
LRESULT MainWindow::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_PAINT:
OnPaint();
return 0;
// Other messages not shown...
}
return DefWindowProc(m_hwnd, uMsg, wParam, lParam);
}
以下是繪製圓形的程式碼。
void MainWindow::OnPaint()
{
HRESULT hr = CreateGraphicsResources();
if (SUCCEEDED(hr))
{
PAINTSTRUCT ps;
BeginPaint(m_hwnd, &ps);
pRenderTarget->BeginDraw();
pRenderTarget->Clear( D2D1::ColorF(D2D1::ColorF::SkyBlue) );
pRenderTarget->FillEllipse(ellipse, pBrush);
hr = pRenderTarget->EndDraw();
if (FAILED(hr) || hr == D2DERR_RECREATE_TARGET)
{
DiscardGraphicsResources();
}
EndPaint(m_hwnd, &ps);
}
}
ID2D1RenderTarget介面會用於所有繪圖作業。 程式的 OnPaint
方法會執行下列動作:
- ID2D1RenderTarget::BeginDraw方法會發出繪圖開頭的訊號。
- ID2D1RenderTarget::Clear方法會以純色填滿整個轉譯目標。 色彩會以 D2D1_COLOR_F 結構的形式提供。 您可以使用 D2D1::ColorF 類別來初始化 結構。 如需詳細資訊,請參閱 在 Direct2D 中使用色彩。
- ID2D1RenderTarget::FillEllipse方法會使用指定的筆刷繪製填滿橢圓形。 橢圓形是由中心點和 x 和 y 弧度所指定。 如果 x- 和 y 弧度相同,則結果為圓形。
- ID2D1RenderTarget::EndDraw方法會發出此框架繪圖完成的訊號。 所有繪圖作業都必須在 呼叫 BeginDraw 和 EndDraw 之間放置。
BeginDraw、Clear和FillEllipse方法全都有void傳回類型。 如果在執行任何這些方法期間發生錯誤,錯誤會透過 EndDraw 方法的傳回值發出訊號。 方法 CreateGraphicsResources
會顯示在 建立 Direct2D 資源主題中。 這個方法會建立轉譯目標和純色筆刷。
裝置可能會緩衝繪圖命令,並順延強制,直到呼叫 EndDraw 為止。 您可以藉由呼叫 ID2D1RenderTarget::Flush,強制裝置執行任何擱置的繪圖命令。 不過,排清可能會降低效能。
處理裝置遺失
當您的程式正在執行時,您使用的圖形裝置可能會變成無法使用。 例如,如果顯示器解析度變更,或使用者移除顯示介面卡,裝置可能會遺失。 如果裝置遺失,轉譯目標也會變成無效,以及與裝置相關聯的任何裝置相依資源。 Direct2D 會從EndDraw方法傳回錯誤碼D2DERR_RECREATE_TARGET,以向遺失的裝置發出訊號。 如果您收到此錯誤碼,您必須重新建立轉譯目標和所有裝置相依資源。
若要捨棄資源,只要釋放該資源的介面即可。
void MainWindow::DiscardGraphicsResources()
{
SafeRelease(&pRenderTarget);
SafeRelease(&pBrush);
}
建立資源可能是昂貴的作業,因此請勿針對每個 WM_PAINT 訊息重新建立您的資源。 建立資源一次,並快取資源指標,直到資源因為裝置遺失而失效,或直到您不再需要該資源為止。
Direct2D 轉譯迴圈
無論您繪製什麼,程式都應該執行類似下列的迴圈。
- 建立與裝置無關的資源。
- 轉譯場景。
- 檢查有效的轉譯目標是否存在。 如果沒有,請建立轉譯目標和裝置相依資源。
- 呼叫 ID2D1RenderTarget::BeginDraw。
- 發出繪圖命令。
- 呼叫 ID2D1RenderTarget::EndDraw。
- 如果 EndDraw 傳回 D2DERR_RECREATE_TARGET,請捨棄轉譯目標和裝置相依的資源。
- 每當您需要更新或重新繪製場景時,重複步驟 2。
如果轉譯目標是視窗,每當視窗收到 WM_PAINT 訊息時,就會發生步驟 2。
這裡顯示的迴圈會捨棄裝置相依的資源,並在下一個迴圈開頭重新建立裝置, (步驟 2a) 。
下一個