void CTestoneView::OnDraw(CDC* pDC) { CTestoneDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here CRect rect; //定義矩形 GetClientRect(&rect); //得到客戶區矩形 pDC->SetMapMode(MM_ANISOTROPIC); //設置映射模式 pDC->SetWindowExt(rect.Width(),rect.Height()); //設置窗口 pDC->SetViewportExt(rect.Width(),-rect.Height()); //設置視區:x軸水平向右爲正,y軸垂直向上爲正 pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2); //設置客戶區中心爲座標系原點 rect.OffsetRect(-rect.Width()/2,-rect.Height()/2); //客戶區矩形校訂 }
CRect rect; //定義矩形 GetClientRect(&rect); //得到客戶區矩形 pDC->SetMapMode(MM_ANISOTROPIC); //設置映射模式 pDC->SetWindowExt(rect.Width(),rect.Height()); //設置窗口 pDC->SetViewportExt(rect.Width(),-rect.Height()); //設置視區:x軸水平向右爲正,y軸垂直向上爲正 pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2); //設置客戶區中心爲座標系原點 rect.OffsetRect(-rect.Width()/2,-rect.Height()/2); //客戶區矩形校訂 srand((unsigned)time(NULL)); //使用系統時間初始化隨機種子,使得每次產生不一樣的隨機數 COLORRET crColor; //聲明一個COLORRET變量crColor,用於存放像素點的顏色值 int x,y; //聲明像素點位置座標 /* 用隨機顏色在x軸負向繪製對角點爲(-150,-50)和(-50,50)的正方形*/ for(y=-50;y<50;y++) for(x=-150;x<-50;x++) pDC->SetPixelV(x,y,RGB(rand()%255,rand()%255,rand()%255)); //產生0~255的隨機數 /* 讀取正方形內每一個像素點的顏色crColor,並在x軸正向的對稱位置上繪製該正方形*/ for(y=-50;y<50;y++) for(x=-150;x<-50;x++) { crColor=pDC->GetPixel(x,y); pDC->SetPixelV(-x,y,crColor); }
CRect rect; //定義矩形 GetClientRect(&rect); //得到客戶區矩形 pDC->SetMapMode(MM_ANISOTROPIC); //設置映射模式 pDC->SetWindowExt(rect.Width(),rect.Height()); //設置窗口 pDC->SetViewportExt(rect.Width(),-rect.Height()); //設置視區:x軸水平向右爲正,y軸垂直向上爲正 pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2); //設置客戶區中心爲座標系原點 rect.OffsetRect(-rect.Width()/2,-rect.Height()/2); //客戶區矩形校訂 CPoint p0(-100,-50),p1(100,50); //定義直線段的起點座標和終點座標 CPen NewPen,*pOldPen; //定義一個CPen類的畫筆對象NewPen和一個畫筆對象指針pOldPen NewPen.CreatePen(PS_SOLID,1,RGB(0,0,255)); //調用Cpen類的CreatePen()成員函數,建立一個像素寬的藍色實線畫筆 pOldPen=pDC->SelectObject(&NewPen); //調用CDC類的SelectObject()成員函數將新畫筆選入設備上下文,同時用pOldPen指針保存原畫筆指針 pDC->MoveTo(p0); //將當前位置移動到直線段起點p0 pDC->LineTo(p1); //從起點繪製直線段到終點p1 pDC->SelectObject(pOldPen); //在新畫筆使用完畢後,調用CDC類的SelectObject()成員函數,用pOldPen指針保存的原畫筆將設備上下文恢復原狀
CRect rect; //定義矩形 GetClientRect(&rect); //得到客戶區矩形 pDC->SetMapMode(MM_ANISOTROPIC); //設置映射模式 pDC->SetWindowExt(rect.Width(),rect.Height()); //設置窗口 pDC->SetViewportExt(rect.Width(),-rect.Height()); //設置視區:x軸水平向右爲正,y軸垂直向上爲正 pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2); //設置客戶區中心爲座標系原點 rect.OffsetRect(-rect.Width()/2,-rect.Height()/2); //客戶區矩形校訂 rect.DeflateRect(100,100); //將矩形兩個方向都縮小100個像素 CPen NewPen,*pOldPen; //定義一個CPen類的畫刷對象NewPen和一個畫刷對象指針pOldPen NewPen.CreatePen(PS_SOLID,1,RGB(0,0,255)); //建立一個1像素寬的藍色實線畫筆 pOldPen=pDC->SelectObject(&NewPen); //將新畫筆選入設備上下文,同時用pOldPen指針保存原畫筆指針 pDC->Rectangle(rect); //繪製方角矩形 CBrush NewBrush,*pOldBrush; //定義一個CBrush類的畫刷對象NewBrush和一個畫刷對象指針pOldBrush NewBrush.CreateSolidBrush(RGB(255,0,0)); //建立一個紅色畫刷 pOldBrush=pDC->SelectObject(&NewBrush); //將新畫刷選入設備上下文,同時用pOldBrush指針保存原畫刷指針 pDC->RoundRect(rect,CPoint(200,200)); //繪製圓角矩形 /*將設備上下文恢復原狀*/ pDC->SelectObject(pOldPen); pDC->SelectObject(pOldBrush);
注:因爲是將客戶區縮小100個像素定義的矩形,因此隨着窗口大小的改變,矩形能自動改變大小。
函數
CRect rect; //定義矩形 GetClientRect(&rect); //得到客戶區矩形 pDC->SetMapMode(MM_ANISOTROPIC); //設置映射模式 pDC->SetWindowExt(rect.Width(),rect.Height()); //設置窗口 pDC->SetViewportExt(rect.Width(),-rect.Height()); //設置視區:x軸水平向右爲正,y軸垂直向上爲正 pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2); //設置客戶區中心爲座標系原點 rect.OffsetRect(-rect.Width()/2,-rect.Height()/2); //客戶區矩形校訂 rect.OffsetRect(rect.Width()/2,-rect.Height()/2); /*定義兩個矩形*/ CRect rect1(CPoint(-250,50),CPoint(250,150)); CRect rect2(CPoint(-250,-150),CPoint(250,-50)); CBrush Brush(HS_BDIAGONAL,RGB(255,0,0)); //構造紅色陰影畫刷,也能夠用CratHatchBrush()函數來定義 pDC->FillRect(&rect1,&Brush); //使用陰影畫刷填充rect1 pDC->FillSolidRect(&rect2,RGB(255,0,0)); //使用紅色填充rect2
注:陰影畫刷定義後,能夠直接在Fillrect函數中使用,並不須要進入系統。spa
CRect rect; //定義矩形 GetClientRect(&rect); //得到客戶區矩形 pDC->SetMapMode(MM_ANISOTROPIC); //設置映射模式 pDC->SetWindowExt(rect.Width(),rect.Height()); //設置窗口 pDC->SetViewportExt(rect.Width(),-rect.Height()); //設置視區:x軸水平向右爲正,y軸垂直向上爲正 pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2); //設置客戶區中心爲座標系原點 rect.OffsetRect(-rect.Width()/2,-rect.Height()/2); //客戶區矩形校訂 rect.DeflateRect(100,100); CBrush *pOldBrush; pOldBrush=(CBrush*)pDC->SelectStockObject(NULL_BRUSH); //爲設備上下文選入透明畫刷 int r=rect.Height()/2; //根據矩形rect的高度定義圓的半徑 CRect rect1(CPoint(-r,-r),CPoint(r,r)); //定義圓的外接矩形 pDC->Ellipse(rect1); //繪製圓 pDC->Ellipse(rect); //繪製橢圓 pDC->Rectangle(rect); //繪製外接矩形 pDC->SelectObject(pOldBrush); //將設備上下文恢復原狀
注:1,因爲SelectStockObject()函數的返回類型是CGdiObject*,而pOldBrush的類型是CBrush*,須要進行強制類型轉換。指針
2,若是不適用透明畫刷,按照先畫圓,後畫橢圓、矩形的順序繪製,由於圖形使用默認的白色畫刷填充,繪製結果只有矩形,圓和橢圓會被遮擋。code
CRect rect; //定義矩形 GetClientRect(&rect); //得到客戶區矩形 pDC->SetMapMode(MM_ANISOTROPIC); //設置映射模式 pDC->SetWindowExt(rect.Width(),rect.Height()); //設置窗口 pDC->SetViewportExt(rect.Width(),-rect.Height()); //設置視區:x軸水平向右爲正,y軸垂直向上爲正 pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2); //設置客戶區中心爲座標系原點 rect.OffsetRect(-rect.Width()/2,-rect.Height()/2); //客戶區矩形校訂 CPoint Twelve(0,rect.Height()/2),Three(rect.Width()/2,0); //定義12點和3點的位置 CPen penBlack,penBlue,*pOldPen; penBlue.CreatePen(PS_SOLID,1,RGB(0,0,255)); //藍色實線畫筆 penBlack.CreatePen(PS_DASHDOT,1,RGB(0,0,0)); //黑色點劃線畫筆 /*從12點到3點順時針繪製藍色實線橢圓弧*/ pDC->SetArcDirection(AD_CLOCKWISE); //順時針繪製12點到3點 pOldPen=pDC->SelectObject(&penBlue); pDC->Arc(rect,Twelve,Three); /*從12點到3點逆時針繪製黑色點劃線橢圓弧*/ pDC->SetArcDirection(AD_COUNTERCLOCKWISE); //逆時針繪製12點到3點 pOldPen=pDC->SelectObject(&penBlack); pDC->Arc(rect,Twelve,Three); pDC->SelectObject(pOldPen);