日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

VC++ 利用MFC的CWindowDC类实现画线功能 在桌面窗口中画线 绘制彩色线条 CPen nPenStyle nWidth crColor

發布時間:2024/3/13 c/c++ 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。