VC++ 利用MFC的CWindowDC类实现画线功能 在桌面窗口中画线 绘制彩色线条 CPen nPenStyle nWidth crColor
目錄
利用MFC的CWindowDC類實現畫線功能
在桌面窗口中畫線
繪制彩色線條
CPen
nPenStyle
nWidth
crColor
接上:VC++ 繪制線條 OnLButtonDown函數(DrawView.cpp) 利用SDK全局函數實現畫線功能 利用MFC的CDC類實現畫線功能 利用MFC的CClientDC類實現畫線功能
接下:VC++使用畫刷繪圖 簡單畫刷 FillRect函數 位圖畫刷 透明畫刷
利用MFC的CWindowDC類實現畫線功能
先介紹一個MFC類:CWindowDC,這個類也派生于CDC類,并且在構造時調用GetWindowDC函數獲得相應的設備描述表對象,在析構時調用ReleaseDC函數釋放該設備描述對象所占用的資源。也就是說,當我們利用CWindowDC對象繪圖時,也不需要顯式地調用GetDC和ReleaseDC函數,該對象會自動獲取和釋放設備描述表資源。使用CWindowDC對象有哪些好處呢?該對象可以訪問整個窗口區域,包括框架窗口的非客戶區和客戶區。該對象的構造與CClientDC對象相同,如果要構造一個與視類窗口相關的設備描述表,則可以利用視類對象的指針來構造這個CWindowDC對象。如下所示是利用CWindowDC對象實現畫線功能的代碼。
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) {CWindowDC dc(this);dc.MoveTo(m_ptOrigin);dc.LineTo(point);CView::OnLButtonUp(nFlags, point); }編譯并運行Draw程序,將會發現這段代碼實現的功能與利用CClientDC類畫線時沒什么區別,也只能在視類窗口中畫線,因為這時創建的設備描述表與視類窗口相關。
接著,把上面代碼中構造設備描述表對象時使用的參數this指針換為指向視類父窗口的指針。
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) {CWindowDC dc(GetParent());dc.MoveTo(m_ptOrigin);dc.LineTo(point);CView::OnLButtonUp(nFlags, point); }編譯并運行Draw程序,將會發現此時線條可以畫到工具欄和菜單欄上,程序運行結果下如圖所示。
知識點:通常都是在客戶區中繪圖。但是如果利用 CWindowDC 類,就可以實現在工具欄和菜單上繪圖。?
在桌面窗口中畫線
如果獲得了一個與桌面窗口相關的設備描述表,就可以在桌面窗口中繪圖。CWnd類的 GetDesktopWindow 成員函數可以獲得 Windows 桌面窗口的句柄。修改構造設備描述表的代碼,結果如下所示。
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) {CWindowDC dc(GetDesktopWindow());dc.MoveTo(m_ptOrigin);dc.LineTo(point);CView::OnLButtonUp(nFlags, point); }再次 Build 并運行 Draw 程序,并拖動鼠標畫線,發現這時可以在整個屏幕窗口上畫線。(但是截圖后不顯示)
繪制彩色線條
上述各種方法實現的畫線功能所繪制的都是黑色線條。這是因為在設備描述表中有一個默認的黑色畫筆,因此繪制的線條都是黑色的。如果想要繪制其他顏色的線條,首先需要創建一個特定顏色的畫筆,然后將此畫筆選入設備描述表中,接下來繪制的線條的顏色就由這個新畫筆的顏色決定了。可以利用MFC提供的類CPen來創建畫筆對象。該類封裝了與畫筆相關的操作,它有三個構造函數。
CPen
CPen( ); CPen(int nPenStyle,int nWidth,COLORREF crColor ); CPen(int nPenStyle,int nWidth,const LOGBRUSH* pLogBrush,int nStyleCount = 0,const DWORD* lpStyle = NULL );其中一個構造函數的原型聲明如下所示:
CPen(int nPenStyle,int nWidth,COLORREF crColor );nPenStyle
指定鋼筆的樣式。 在構造函數的第一個版本的此參數可以是下列值之一:
-
PS_SOLID 創建實心鋼筆。
-
PS_DASH 創建一個虛線鋼筆。 有效,僅當鋼筆的寬度為1或更小,在組件度量單位。
-
PS_DOT 創建一個虛線鋼筆的。 有效,僅當鋼筆的寬度為1或更小,在組件度量單位。
-
PS_DASHDOT 使用交替短劃線和點創建一個鋼筆。 有效,僅當鋼筆的寬度為1或更小,在組件度量單位。
-
PS_DASHDOTDOT 使用交替短劃線和double點創建一個鋼筆。 有效,僅當鋼筆的寬度為1或更小,在組件度量單位。
-
PS_NULL 創建一個空鋼筆。
-
PS_INSIDEFRAME 創建例如繪制在Windows GDI輸出功能生成的閉合的形狀內部幀的一行指定一個邊框的一個筆(, Ellipse、 Rectangle、 RoundRect、 Pie和 Chord 成員函數)。 在此樣式使用Windows GDI未指定一個邊框的輸出功能(例如, LineTo 成員函數),鋼筆的繪圖區未由幀限制。
CPen 構造函數的第二個版本指定類型,樣式,終止線帽的組合,并連接屬性。 應按位組合可以使用或運算符,從每個類別的值(|)。 鋼筆類型可為下列值之一:
-
PS_GEOMETRIC 創建一個幾何圖形鋼筆。
-
PS_COSMETIC 創建一個裝飾性的鋼筆。
CPen 構造函數的第二個版本添加 nPenStyle的以下鋼筆樣式:
-
PS_ALTERNATE 創建設置其他像素的一個鋼筆。 (此樣式為裝飾性的筆只適用)。
-
PS_USERSTYLE 創建使用用戶提供的一個樣式數組的一個鋼筆。
終止線帽可為下列值之一:
-
PS_ENDCAP_ROUND 終止線是圓形的。
-
PS_ENDCAP_SQUARE 終止線是正方形。
-
PS_ENDCAP_FLAT 終止線保持不變。
連接可為下列值之一:
-
PS_JOIN_BEVEL Joins為、。
-
并在 SetMiterLimit 函數時,設置的當前限制內 PS_JOIN_MITER Joins是斜接。 如果連接超出此限制,其轉換為、。
-
PS_JOIN_ROUND Joins是圓形的。
nWidth
指定鋼筆的寬度。
-
對于構造函數的第一個版本,因此,如果該值為0,無論該映射模式,如組件單位的寬度始終為1像素。
-
對于構造函數的第二個版本,因此,如果 nPenStyle 是 PS_GEOMETRIC,該寬度(以邏輯單位給定。 如果 nPenStyle 是 PS_COSMETIC,必須將寬度為1。
crColor
包含鋼筆的一個RGB顏色。
其中,第一個參數(nPenStyle)指定筆的線型(實線、點線、虛線等);第二個參數(nWidth)指定筆的線寬;第三個參數(crColor)指定筆的顏色,這個參數是COLORREF類型,利用RGB宏可以構建這種類型的值。RGB宏的聲明如下所示。
public: static int RGB(int Red, int Green, int Blue ) COLORREF RGB(BYTE bRed, BYTE bGreen, BYTE bBlue color);可以看到,RGB宏有三個參數,分別代表紅、綠、藍三種顏色的值。這三個參數都是BYTE類型,取值范圍為0~255。如果將RGB宏的三個分量全部設置為0,則得到黑色;如果全部設置為255,則得到白色;……可以將這三個分量設置成0~255之間的任意值,從而得到各種不同的顏色。
另外,在程序中,當構造一個 GDI 對象后,該對象并不會立即生效,必須選入設備描述表,它才會在以后的繪制操作中生效。利用SelectObject函數可以實現把GDI對象選入設備描述表中,并且該函數會返回指向先前被選對象的指針。這主要是為了在完成當前繪制操作后,還原設備描述表。例如,當我們在某個局部范圍內繪圖時,可能需要改變畫筆的顏色,并把新畫筆選入設備描述表。當這部分繪圖操作完成之后,需要恢復到原來的畫筆顏色,然后完成其他部分的繪圖操作。在一般情況下,在完成繪圖操作之后,都要利用SelectObject函數把先前的GDI對象選入設備描述表,以便使其恢復到先前的狀態。
如下代碼所示是在Draw程序中繪制彩色線條的程序代碼。
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) {CPen pen(PS_SOLID,1, RGB(255, 0, 0));CClientDC dc(this);CPen* pOldPen = dc.SelectObject(&pen);dc.MoveTo(m_ptOrigin);dc.LineTo(point);dc.SelectObject(pOldPen);CView::OnLButtonUp(nFlags, point); }在面所示代碼中,首先創建一個實線畫筆,其寬度為1,顏色為紅色。接著利用SelectObject函數將新畫筆對象選入設備描述表。然后利用畫線函數繪制線條。最后,再次調用SelectObject函數恢復設備描述表中的畫筆對象。編譯并運行Draw程序,并拖動鼠標畫線,這時可以看到這次繪制的是紅色的線條。可以試著修改畫筆的顏色,將會繪制出其他各種顏色的線條。也可以改變畫筆的寬度,例如改為10,此時程序運行結果如下圖所示。也可以改變畫筆的線型,例如選擇虛線線型,即用下面這行代碼替上面構造畫筆對象的那行代碼。
CPen pen(PS_DASH,10, RGB(255, 0, 0));編譯并運行Draw程序,并拖動鼠標左鍵進行畫線操作,將會發現繪制的還是一條實線,并不是想像中的虛線。這是因為當畫筆的寬度小于等于1時,虛線線型才有效。因此,可以修改構造畫筆對象的代碼,將其寬度設置為1,再次編譯并運行 Draw 程序,并拖動鼠標左鍵繪制線條,這時可以看到繪制的是虛線,如下圖所示。
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) {CPen pen(PS_DASH,1, RGB(255, 0, 0));CClientDC dc(this);CPen* pOldPen = dc.SelectObject(&pen);dc.MoveTo(m_ptOrigin);dc.LineTo(point);dc.SelectObject(pOldPen);CView::OnLButtonUp(nFlags, point); }另外,還可以繪制點線(將畫筆的線型改為 PS_DOT),程序運行結果如下圖所示。
接上:VC++ 繪制線條 OnLButtonDown函數(DrawView.cpp) 利用SDK全局函數實現畫線功能 利用MFC的CDC類實現畫線功能 利用MFC的CClientDC類實現畫線功能
接下:VC++使用畫刷繪圖 簡單畫刷 FillRect函數 位圖畫刷 透明畫刷
總結
以上是生活随笔為你收集整理的VC++ 利用MFC的CWindowDC类实现画线功能 在桌面窗口中画线 绘制彩色线条 CPen nPenStyle nWidth crColor的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 比尔盖茨的风流情史,妻子同意他与前女友同
- 下一篇: c++ 常用总结(三)