欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
MFC中CDC的使用?繪圖

MFC中CDC的使用 繪圖

 

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

}
每次需要重繪窗口時(shí)(程序啟動(dòng)/窗口大小改變/全部或部分窗口重現/程序員調用RedrawWindow或UpdateWindow),應用程序框架都會(huì )調用該CWnd的消息響應成員函數(的覆蓋)來(lái)繪制窗口客戶(hù)區。
在Windows中,繪圖一般在視圖窗口的客戶(hù)區進(jìn)行,使用的是MFC的設備上下文(DC = Device-Context)類(lèi)CDC中各種繪圖函數。
在繪圖前,必須先得到客戶(hù)區大小和DC、設置繪圖顏色,然后再根據文檔數據或用戶(hù)操作來(lái)繪制圖形。
1 幾何對象的結構和類(lèi)
為了使用繪圖函數,應該先了解繪圖所用到的幾種表示幾何對象的結構和類(lèi)。這些結構和類(lèi)分別定義在頭文件windef.h和afxwin.h中。
1.點(diǎn)
1)點(diǎn)結構POINT
點(diǎn)數據結構POINT用來(lái)表示一點(diǎn)的x、y坐標:
typedef struct tagPOINT {
      LONG x;
      LONG y;
} POINT;
2)點(diǎn)類(lèi)CPoint
點(diǎn)類(lèi)CPoint為一個(gè)沒(méi)有基類(lèi)的獨立類(lèi),封裝了POINT結構,有成員變量x和y,其構造函數有5種:
CPoint( );
CPoint( int initX, int initY );
CPoint( POINT initPt );
CPoint( SIZE initSize );
CPoint( LPARAM dwPoint ); // 低字設為x、高字設為y
CPoint類(lèi)還定義了4個(gè)平移和設置函數:
void Offset(int xOffset, int yOffset);
void Offset(POINT point);
void Offset(SIZE size);
void SetPoint(int X, int Y);
CPoint類(lèi)還重載了+、-、+=、-=、==、!=等運算符來(lái)支持CPoint對象和CPoint、POINT、SIZE對象之間的運算。
2.大小
1)大小結構SIZE
大小(size尺寸)結構SIZE用來(lái)表示矩形的寬cx和高cy:
typedef struct tagSIZE {
      LONG cx;
      LONG cy;
} SIZE;
2)大小類(lèi)CSize
大小類(lèi)CSize也為一個(gè)沒(méi)有基類(lèi)的獨立類(lèi),封裝了SIZE結構,有成員變量cx和cy,其構造函數也有5種:
CSize( );
CSize( int initCX, int initCY );
CSize( SIZE initSize );
CSize( POINT initPt );
CSize( DWORD dwSize ); // 低字設為cx、高字設為cy
CSizet類(lèi)也重載了+、-、+=、-=、==、!=等運算符來(lái)支持CSize對象和CSize、POINT、SIZE、RECT對象之間的運算。
3.矩形
1)矩形結構RECT
矩形結構RECT定義了矩形的左上角與右下角的坐標:
typedef struct tagRECT {
     LONG left;
     LONG top;
     LONG right;
     LONG bottom;
} RECT;
2)矩形類(lèi)CRect
矩形類(lèi)CRect也為一個(gè)沒(méi)有基類(lèi)的獨立類(lèi),封裝了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類(lèi)重載了=,+、-,+=、-=,==、!=,&、|,&=、|=等運算符來(lái)支持CRect對象和CRect、POINT、SIZE、RECT對象之間的運算。還定義了轉換符LPCRECT和LPRECT來(lái)自動(dòng)完成CRect對象到矩形結構和類(lèi)指針LPCRECT和LPRECT的轉換。
CRect類(lèi)中常用的屬性和成員函數有:
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) 判斷點(diǎn)是否在矩形中
有時(shí)需要判斷某點(diǎn)(如鼠標位置)是否在某一矩形區域中,這可以調用CRect類(lèi)的PtInRect函數來(lái)做:
BOOL PtInRect( POINT point ) const;
該函數當點(diǎn)point在其矩形區域內時(shí),返回真。注意,該矩形區域不包括矩形的右邊界和底邊界。例如:
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 客戶(hù)區大小和DC
在繪圖前,必須先得到客戶(hù)區大小和設備上下文DC。
1.獲得客戶(hù)區
繪圖一般都是在視圖窗口的客戶(hù)區進(jìn)行,而客戶(hù)區的大小在運行時(shí)可由用戶(hù)改變,為了使繪制的圖形能隨窗口大小自動(dòng)改變,必須先得到當前客戶(hù)區大小的數據(寬w和高h)。
獲取客戶(hù)區大小的方法有如下兩種:
1)在消息響應函數OnSize中獲得
利用屬性窗口的信息頁(yè),在視圖類(lèi)中添加WM_SIZE消息的響應函數OnSize。該函數在窗口第一次顯示或窗口大小被改變時(shí)會(huì )被Windows系統調用。其輸入參數中的cx和cy就是客戶(hù)區大小的寬和高,可將它們賦值給類(lèi)變量(如m_iW和m_iH)供繪圖時(shí)使用。例如
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得到
可在繪圖前,定義一個(gè)矩形變量rect,然后再調用CWnd類(lèi)的成員函數GetClientRect:
void GetClientRect( LPRECT lpRect ) const;
得到當前客戶(hù)區矩形的數據,其中的右(right)與底(bottom)就是客戶(hù)區的寬與高(其左left與頂top都為0)。例如:
         RECT rect;
         GetClientRect(&rect);
         int w = rect.right, h = rect.bottom;
2.DC
在Windows中,繪圖使用的是MFC的DC(Device-Context, 設備上下文)類(lèi)CDC中各種繪圖函數。
0)CDC類(lèi)
CDC是CObject的直接派生類(lèi),CDC類(lèi)自己也有若干派生類(lèi),其中包括窗口客戶(hù)區DC所對應的CClientDC類(lèi)、OnPaint和OnDraw消息響應函數的輸入參數中使用的CPaintDC類(lèi)、圖元文件對應的CMetaFileDC類(lèi)和整個(gè)窗口所對應的CWindowDC類(lèi)。
CDC類(lèi)中有許多成員函數,可以用來(lái)設置各種繪圖環(huán)境、屬性和參數,以及繪制各種圖形和圖像等,將在后面陸續加以介紹。
1)獲得DC
可以從OnDraw函數的輸入參數pDC或調用CWnd的成員函數GetDC:
CDC* GetDC( );
來(lái)獲得DC的指針。
2)釋放DC
因為Windows限制可用DC的數量,所以DC屬于稀缺的公用資源。因此,對每次獲得的DC,在使用完成后必須立即釋放。
從OnDraw函數的輸入參數pDC獲得的DC,在該函數運行結束后,系統會(huì )自動(dòng)釋放。但由GetDC所獲得的DC,必須自己來(lái)釋放,這可以通過(guò)調用CWnd的成員函數ReleaseDC來(lái)完成:
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)類(lèi)DC
每次從OnDraw函數的輸入參數或調用GetDC所獲得的DC,都是一個(gè)全新的臨時(shí)缺省DC。它不能用類(lèi)變量來(lái)長(cháng)期保存,而且原來(lái)選入的各種GDI對象全都被作廢,必須從頭再來(lái)。
為了使選入的各種GDI對象一直有效,必須在視圖類(lèi)的PreCreateWindow函數中調用CWnd類(lèi)的成員函數AfxRegisterWndClass:
LPCTSTR AFXAPI AfxRegisterWndClass( UINT nClassStyle, HCURSOR hCursor = 0,
HBRUSH hbrBackground = 0, HICON hIcon = 0 );
來(lái)修改窗口類(lèi)的風(fēng)格屬性中的DC為類(lèi)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類(lèi)的成員函數:
HDC GetSafeHdc();
來(lái)獲取CD所對應窗口(如客戶(hù)區)的安全DC句柄,該句柄在窗口存在期間一直是有效的。例如,可先定義類(lèi)變量HDC m_hDC;,再在適當的地方給它賦值m_hDC = GetDC()->GetSafeHdc();,然后就可以放心地使用了。例如,可以使用CDC類(lèi)的成員函數
BOOL Attach(HDC hDC); // 成功返回非0
來(lái)將CDC對象與DC句柄連接在一起。

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

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久