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()移動視口的原點