MFC:繪圖基礎


2.1 Windows GDI

用設備描述表(DC)來繪制圖形,不同的繪畫程序擁有不同的設備描述表(DC)

//獲取設備信息,屏幕的寬和高
CClientDC dc(this);
int cx=dc.GetDeviceCaps(HORZRES);
int cy=dc.GetDeviceCaps(VERTRES);
 
//獲取設備信息,分辨率
CClientDC dc(this);
int nPlanes=dc.GetDeviceCaps(PLANES);
int nBPP=dc.GetDeviceCaps(BITSPIXEL);
int nColors=1<<(nPlanes*nBPP);
 
 
//GetDeviceCaps參數
HORZRES    以像素點數目表示的顯示平面寬度
VERTRES    以像素點數目表示的顯示平面高度
HORZSIZE    以毫米表示的顯示平面寬度
VERTSIZE    以毫米表示的顯示平面高度
LOGPIXELSX    水平方向上每邏輯英寸內像素點的數目
LOGPIXELSY    豎直方向上每邏輯英寸內像素點的數目
NUMCOLORS    返回靜態顏色數目
BITSPIXEL    每個像素點的位的數目
PLANES    位平面的數目
RASTERCAPS    設備特性標志位
TECHNOLOGY    設備類型標志位

 

2.2 MFC設備描述表類

MFC繪圖設備類有CDC基類,

                   派生出CPaintDC子類,用於在窗口客戶區畫圖(僅限於OnPaint())

                              CWindowDC子類,用於在窗口客戶區畫圖(除了OnPaint())

                              CClientDC子類

                              CMetaFileDC子類

 

2.2.1.CDC基類

//普通函數內
CDC* pDC=GetDC();  //CWnd::GetWindowDC
//Do Some drawing
ReleaseDC(pDC);

 

//OnPaint消息內
PAINTSTRUCT ps;
CDC* pDC=BeginPaint(&ps);
//Do Some Drawing
EndPaint(&ps);

 

2.2.2.CPaintDC子類

//在MFC的消息映射OnPaint()之中,一定要調用CPaintDC
//否則OnPaint消息會一直不斷重復調用刷新,其中的原理在於MFC調用WinSDK之中隱藏掉了BeginPaint()和//EndPaint()兩個函數
 
CPaintDC dc(this);
 
CPaintDC *pDC=new CPaintDC(this);
delete pDC;

 

2.2.3.CClientDC子類

void CMainWindow::OnLButtonDown(UINT nFlags,CPoint point){
    
    CRect rect;
    GetClientRect(&rect);
 
    CClientDC dc(this);
    dc.MoveTo(rect.left,rect.top);
    dc.LineTo(rect.right,rect.bottom);
    dc.MoveTo(rect.right,rect.top);
    dc.LineTo(rect.left,rect.bottom);
 
    dc.Ellipse(0,0,100,100);
 
}

 

2.2.4.CWindowDC子類

繪制非客戶區使用,借助OnNcPaint捕獲WM_NCPAINT消息(不需要調用BeginPaint和EndPaint)

 

2.2.5.CMetaFileDC子類

 

2.3 設備描述表屬性

設備描述表(DC)擁有文本顏色 背景顏色 背景模式  映射模式 繪圖模式 當前位置 當前畫筆 當前筆刷 當前字體等多種屬性

可以用SelectObject()將畫筆(Pen) 畫刷(Brush) 字體(Font) 位圖(Bitmap) 調色板(Palette) 區域(Region)屬性添加進設備描述表

2.4 繪圖模式

GDI將像素點輸出到邏輯顯示平面上時,它不只是簡單地將輸出像素點顏色.相反它通過一系列布爾運算將輸出像素點的顏色和輸出目標位置上像素點的顏色合在一起.它所使用的邏輯關系由設備描述表當前的繪圖模式確定

 

2.5 映射模式

2.5.1 可編程映射模式

MM_ISOTROPIC和MM_ANISOTROPIC映射模式與其他映射模式不同,即是用戶決定從邏輯坐標值轉換為設備坐標值的方式

 

2.5.2 坐標轉換

調用CDC::LPtoDP()可將邏輯坐標值轉換為設備坐標值

調用CDC::DPtoLP()可將設備坐標值轉換為邏輯坐標值

 

2.5.3 移動原點

調用CDC::SetWindowOrg()移動窗口的原點

調用CDC::SetViewportOrg()移動視口的原點

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM