MFC繪圖小實驗(1)

這學期開了一門計算機圖形學的課程,感受蠻有趣的,因此想把書上的那些樣例程序都實現一遍,瞭解基本的繪圖原理和要點。

1,使用用戶自定義的映射模式,設置窗口大小和視區相等的二維座標系。視區中x軸水平向右爲正,y軸垂直向上爲正,原點位於屏幕客戶區中心。

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);  //客戶區矩形校訂

}

 

 

2,在屏幕上使用SetPixelV()函數將crColor參數設置爲隨機顏色,用像素點在x軸負向畫出對角點爲(-150,-50)和(-50,50)的正方形。而後使用GetPixel()函數依次讀出該正方形內各像素點的顏色,在x軸正向的對稱位置上從新繪製該正方形。

    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);
        }

 

 

 

3,從起點P0(-100,-50)到終點P1(100,50)繪製一段1像素寬的藍色直線。

        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指針保存的原畫筆將設備上下文恢復原狀

 

4,將客戶區矩形上下文邊界各收縮100個像素繪製重疊的方角矩形和圓角矩形。矩形邊框爲1像素寬的藍色邊界線。方角矩形內部使用默認畫刷填充,圓角矩形內部填空紅色,圓角取爲(200,200)。

    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個像素定義的矩形,因此隨着窗口大小的改變,矩形能自動改變大小。

函數

5,以(-250,50)爲左下角點,以(250,150)爲右上角點繪製矩形,使用紅色HS_BDIANGONAL陰影模式填充。以(-250,-150)爲左下角點,以(250,-50)爲右上角點繪製矩形,使用紅色填充。

    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

 

6,將客戶區矩形左右邊界各收縮100個像素,分別繪製矩形、矩形內切圓和矩形內切橢圓。繪製過程按圓、橢圓和矩形順序完成。設定圓、橢圓和矩形的邊界線爲1像素寬黑色實線,內部所有使用透明畫刷填充。

    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

 

 

 

7,在客戶區內從12點到3點逆時針繪製黑色點劃線橢圓弧,從12點到3點順時針繪製藍色實線橢圓弧。

    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);

相關文章
相關標籤/搜索