国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
MFC中CDC的使用?繪圖

MFC中CDC的使用 繪圖

 

繪圖一般在視圖類的(屏幕/打印機)繪圖消息響應函數OnDraw中進行,例如:
void CTestView::OnDraw(CDC* ) {
         CTestDoc* pDoc = GetDocument();
         ASSERT_VALID(pDoc);
         if (!pDoc)
                return;
         // TODO: 在此處為本機數據添加繪制代碼

}
每次需要重繪窗口時(程序啟動/窗口大小改變/全部或部分窗口重現/程序員調用RedrawWindow或UpdateWindow),應用程序框架都會調用該CWnd的消息響應成員函數(的覆蓋)來繪制窗口客戶區(qū)。
在Windows中,繪圖一般在視圖窗口的客戶區(qū)進行,使用的是MFC的設備上下文(DC = Device-Context)類CDC中各種繪圖函數。
在繪圖前,必須先得到客戶區(qū)大小和DC、設置繪圖顏色,然后再根據文檔數據或用戶操作來繪制圖形。
1 幾何對象的結構和類
為了使用繪圖函數,應該先了解繪圖所用到的幾種表示幾何對象的結構和類。這些結構和類分別定義在頭文件windef.h和afxwin.h中。
1.點
1)點結構POINT
點數據結構POINT用來表示一點的x、y坐標:
typedef struct tagPOINT {
      LONG x;
      LONG y;
} POINT;
2)點類CPoint
點類CPoint為一個沒有基類的獨立類,封裝了POINT結構,有成員變量x和y,其構造函數有5種:
CPoint( );
CPoint( int initX, int initY );
CPoint( POINT initPt );
CPoint( SIZE initSize );
CPoint( LPARAM dwPoint ); // 低字設為x、高字設為y
CPoint類還定義了4個平移和設置函數:
void Offset(int xOffset, int yOffset);
void Offset(POINT point);
void Offset(SIZE size);
void SetPoint(int X, int Y);
CPoint類還重載了+、-、+=、-=、==、!=等運算符來支持CPoint對象和CPoint、POINT、SIZE對象之間的運算。
2.大小
1)大小結構SIZE
大小(size尺寸)結構SIZE用來表示矩形的寬cx和高cy:
typedef struct tagSIZE {
      LONG cx;
      LONG cy;
} SIZE;
2)大小類CSize
大小類CSize也為一個沒有基類的獨立類,封裝了SIZE結構,有成員變量cx和cy,其構造函數也有5種:
CSize( );
CSize( int initCX, int initCY );
CSize( SIZE initSize );
CSize( POINT initPt );
CSize( DWORD dwSize ); // 低字設為cx、高字設為cy
CSizet類也重載了+、-、+=、-=、==、!=等運算符來支持CSize對象和CSize、POINT、SIZE、RECT對象之間的運算。
3.矩形
1)矩形結構RECT
矩形結構RECT定義了矩形的左上角與右下角的坐標:
typedef struct tagRECT {
     LONG left;
     LONG top;
     LONG right;
     LONG bottom;
} RECT;
2)矩形類CRect
矩形類CRect也為一個沒有基類的獨立類,封裝了RECT結構,有成員變量left、top、right和bottom,其構造函數有6種:
CRect( );
CRect( int l, int t, int r, int b );
CRect( const RECT& srcRect );
CRect( LPCRECT lpSrcRect );
CRect( POINT point, SIZE size );
CRect( POINT topLeft, POINT bottomRight );
CRect類重載了=,+、-,+=、-=,==、!=,&、|,&=、|=等運算符來支持CRect對象和CRect、POINT、SIZE、RECT對象之間的運算。還定義了轉換符LPCRECT和LPRECT來自動完成CRect對象到矩形結構和類指針LPCRECT和LPRECT的轉換。
CRect類中常用的屬性和成員函數有:
int Width( ) const;
int Height( ) const;
CSize Size( ) const;
CPoint& TopLeft( );
CPoint& BottomRight( );
CPoint CenterPoint( ) const;
void SwapLeftRight();
BOOL IsRectEmpty( ) const;
BOOL PtInRect( POINT point ) const;
void SetRect( int x1, int y1, int x2, int y2 );
void SetRect(POINT topLeft, POINT bottomRight);
void OffsetRect(int x, int y);
void MoveToXY(int x, int y);
3) 判斷點是否在矩形中
有時需要判斷某點(如鼠標位置)是否在某一矩形區(qū)域中,這可以調用CRect類的PtInRect函數來做:
BOOL PtInRect( POINT point ) const;
該函數當點point在其矩形區(qū)域內時,返回真。注意,該矩形區(qū)域不包括矩形的右邊界和底邊界。例如:
CRect rect( 10, 10, 371, 267 );
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
         // TODO: Add your message handler code here and/or call default
         if ( rect.PtInRect( point ) ) {
... ...
         }
... ...
         CView::OnLButtonUp(nFlags, point);
}

2 客戶區(qū)大小和DC
在繪圖前,必須先得到客戶區(qū)大小和設備上下文DC。
1.獲得客戶區(qū)
繪圖一般都是在視圖窗口的客戶區(qū)進行,而客戶區(qū)的大小在運行時可由用戶改變,為了使繪制的圖形能隨窗口大小自動改變,必須先得到當前客戶區(qū)大小的數據(寬w和高h)。
獲取客戶區(qū)大小的方法有如下兩種:
1)在消息響應函數OnSize中獲得
利用屬性窗口的信息頁,在視圖類中添加WM_SIZE消息的響應函數OnSize。該函數在窗口第一次顯示或窗口大小被改變時會被Windows系統(tǒng)調用。其輸入參數中的cx和cy就是客戶區(qū)大小的寬和高,可將它們賦值給類變量(如m_iW和m_iH)供繪圖時使用。例如
void CDrawView::OnSize(UINT nType, int cx, int cy) {
        CView::OnSize(nType, cx, cy);

        // TODO: 在此處添加消息處理程序代碼
        m_iW = cx;    m_iH = cy;
}
其中,nType的值為:
<!--[if !supportLists]-->l           <!--[endif]-->SIZE_MAXIMIZED(窗口已被最大化)
<!--[if !supportLists]-->l           <!--[endif]-->SIZE_MINIMIZED(窗口已被最小化)
<!--[if !supportLists]-->l           <!--[endif]-->SIZE_RESTORED(窗口已被改變大?。?br><!--[if !supportLists]-->l           <!--[endif]-->SIZE_MAXHIDE(其他窗口被最大化)
<!--[if !supportLists]-->l           <!--[endif]-->SIZE_MAXSHOW(其他窗口從最大化還原)
2)調用成員函數GetClientRect得到
可在繪圖前,定義一個矩形變量rect,然后再調用CWnd類的成員函數GetClientRect:
void GetClientRect( LPRECT lpRect ) const;
得到當前客戶區(qū)矩形的數據,其中的右(right)與底(bottom)就是客戶區(qū)的寬與高(其左left與頂top都為0)。例如:
         RECT rect;
         GetClientRect(&rect);
         int w = rect.right, h = rect.bottom;
2.DC
在Windows中,繪圖使用的是MFC的DC(Device-Context, 設備上下文)類CDC中各種繪圖函數。
0)CDC類
CDC是CObject的直接派生類,CDC類自己也有若干派生類,其中包括窗口客戶區(qū)DC所對應的CClientDC類、OnPaint和OnDraw消息響應函數的輸入參數中使用的CPaintDC類、圖元文件對應的CMetaFileDC類和整個窗口所對應的CWindowDC類。
CDC類中有許多成員函數,可以用來設置各種繪圖環(huán)境、屬性和參數,以及繪制各種圖形和圖像等,將在后面陸續(xù)加以介紹。
1)獲得DC
可以從OnDraw函數的輸入參數pDC或調用CWnd的成員函數GetDC:
CDC* GetDC( );
來獲得DC的指針。
2)釋放DC
因為Windows限制可用DC的數量,所以DC屬于稀缺的公用資源。因此,對每次獲得的DC,在使用完成后必須立即釋放。
從OnDraw函數的輸入參數pDC獲得的DC,在該函數運行結束后,系統(tǒng)會自動釋放。但由GetDC所獲得的DC,必須自己來釋放,這可以通過調用CWnd的成員函數ReleaseDC來完成:
int ReleaseDC( CDC* pDC ); // 成功返回非0
例如:
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
         ReleaseCapture();
         if (m_bLButtonDown) {
                CDC* pDC = GetDC();
                pDC->SelectObject(new CPen(PS_SOLID, 0, RGB(255, 0, 0)));
                pDC->SelectStockObject(NULL_BRUSH);
                pDC-> Ellipse (rect);
                ReleaseDC(pDC);
                m_bLButtonDown = FALSE;
         }
         CView::OnLButtonUp(nFlags, point);
}
3)類DC
每次從OnDraw函數的輸入參數或調用GetDC所獲得的DC,都是一個全新的臨時缺省DC。它不能用類變量來長期保存,而且原來選入的各種GDI對象全都被作廢,必須從頭再來。
為了使選入的各種GDI對象一直有效,必須在視圖類的PreCreateWindow函數中調用CWnd類的成員函數AfxRegisterWndClass:
LPCTSTR AFXAPI AfxRegisterWndClass( UINT nClassStyle, HCURSOR hCursor = 0,
HBRUSH hbrBackground = 0, HICON hIcon = 0 );
來修改窗口類的風格屬性中的DC為類DC:CS_CLASSDC。如
BOOL CDrawView::PreCreateWindow(CREATESTRUCT& cs) {
      cs.lpszClass = AfxRegisterWndClass(CS_DBLCLKS | CS_HREDRAW |
CS_VREDRAW | CS_CLASSDC, 0,
::CreateSolidBrush(RGB(255, 255, 255)));
         return CView::PreCreateWindow(cs);
}
4)安全DC句柄
也可以用CDC類的成員函數:
HDC GetSafeHdc();
來獲取CD所對應窗口(如客戶區(qū))的安全DC句柄,該句柄在窗口存在期間一直是有效的。例如,可先定義類變量HDC m_hDC;,再在適當的地方給它賦值m_hDC = GetDC()->GetSafeHdc();,然后就可以放心地使用了。例如,可以使用CDC類的成員函數
BOOL Attach(HDC hDC); // 成功返回非0
來將CDC對象與DC句柄連接在一起。

本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
CPoint,CSize,CRect類說明收藏
MFC常用類、成員函數、數組類、Cstring類、CTime類、CPoint類
[轉載]CDC::DrawDragRect應用實例
MFC中常用類,宏,函數介紹
關于CRect類的一點知識
NormalizeRect
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯系客服!

聯系客服