2012-07-31 73 views
1

由於我是Visual C++的新手,這可能是與選擇GDI對象有關的一個非常基本的問題。如何通過SelectObject函數選擇和銷燬GDI對象

以下代碼片段繪製了一個無邊框的淺灰色圓圈。

cPen pen(PS_NULL, 0, (RGB(0,0,0))); 
dc.SelectObject(& pen); 
CBrush brush (RGB (192,192,192)); 
dc.SelectObject (&brush); 
dc.Ellipse(0,0, 100,100); 

所有我從代碼片段明白的是首先是創建筆的對象,它是一個NULL筆這將使邊界消失,刷然後創建灰色的圓,而是如何做dc使用如果它已經使用筆刷?這有點令人困惑。

如何使用dc.SelectObject()兩次幫助?如果使用純色畫筆對象創建灰色圓圈,則創建畫筆對象時如何幫助創建畫筆對象?這個東西究竟是如何工作的?

回答

4

SelectObject函數用於選擇五種不同類型的對象轉換成DC

  1. 字體
  2. Bitmap和
  3. 地區

的文檔狀態那 The newly selected object replaces the previous object of the same type。所以這意味着你可以選擇筆和畫筆而沒有任何問題,但是你不能選擇筆兩次。

而且避免資源泄漏,你需要選擇不管你選擇了舊筆/刷早期

CPen pen(PS_NULL, 0, (RGB(0,0,0))); 
CPen *oldPen = dc.SelectObject(& pen); 
CBrush brush (RGB (192,192,192)); 
CBrush *oldBrush = dc.SelectObject (&brush); 
dc.Ellipse(0,0, 100,100); 

dc.SelectObject(oldPen); 
dc.SelectObject(oldBrush); 
+0

沒問題,所以實際情況是,使用畫筆繪製一個圓,並使用NULL PEN或其他東西在這裏發生的邊界被刪除? – vin 2012-07-31 06:57:29

+1

是的你的權利,它使用筆繪製邊界,並使用畫筆填充區域 – Jeeva 2012-07-31 07:01:59

+0

謝謝,這有幫助!現在有更多的事情是清楚的! :) – vin 2012-07-31 07:06:56

1

DC對象有電流刷,當前筆,當前字體等。也就是說,目前的對象具體類型。因此,您可以同時選擇筆和筆刷,但不能同時選擇兩支筆。 SelectObject內部可以看到手柄的類型。

此外,SelectObject返回您以前的當前目標的相同類型的對象,該對象在選擇您提供的手柄時未被選中。您應該保存並在完成後進行恢復。