天天看點

MFC繪制點,線,矩形以及畫刷,字型,位圖的使用點的繪制和擷取直線的繪制弧的繪制折線Bizer曲線多樣式的線條矩形的繪制 橢圓和圓餅Pie弦多邊形GDI繪圖對象 - 畫筆GDI繪圖對象 - 畫刷GDI繪圖對象 - 位圖文字和字型              

點的繪制和擷取

      繪制: COLORREF SetPixel(

  HDC hdc, //DC句柄

  int X, //x坐标

  int Y, //y坐标

  COLORREF crColor ); // 點的顔色

      擷取: COLORREF GetPixel(

 HDC hdc,   //DC句柄

 int XPos,  //x坐标

 int nYPos ); //y坐标

傳回指定坐标位置的點的顔色

直線的繪制

      MoveToEx 移動目前點到指定位置

      LineTo 從目前點繪制直線到指定位置

弧的繪制

       Arc和AngleArc提供不同的繪制弧的方式:

 BOOL Arc( HDC hdc, 

 int nLeftRect, // 外切矩形的坐标

 int nTopRect,//外切矩形的坐标

 int nRightRect,//外切矩形的坐标

 int nBottomRect,//外切矩形的坐标

 int nXStartArc,//起始切割半徑的X坐标

 int nYStartArc,//起始切割半徑的Y坐标

 int nXEndArc, //終止切割半徑的X坐标

 int nYEndArc ); //終止切割半徑的X坐标

可以使用SetArcDirection函數,設定Arc函數

切割方向:順時針和逆時針.

BOOL AngleArc(

  HDC hdc, // handle to device context

  int X, //圓心的X坐标

  int Y, //圓心的Y坐标

  DWORD dwRadius,//圓的半徑

  FLOAT eStartAngle,//開始角度

   FLOAT eSweepAngle );//夾角

折線

BOOL Polyline(

  HDC hdc, //DC句柄

  CONST POINT *lppt,//Polyline頂點的坐标數組

  int cPoints ); //頂點數組的長度

PolylineTo 與Polyline類似, 隻是在

          繪制Polyline前,從目前點使用LineTo繪

          制直線到Polyline的第一個頂點.

繪制多組折線 PolyPolyline

          BOOL PolyPolyline( HDC hdc,

  CONST POINT *lppt,//所有點的數組

   CONST DWORD *lpdwPolyPoints,//每組點的數量

   DWORD cCount );//分組的數量

         例如:

          DWORD nGroup[] = { 4, 3 };

       PolyPolyline( hDC, ptPolyLine,nGroup, 2 );

Bizer曲線

      BOOL PolyBezier(HDC hdc, 

         CONST POINT *lppt,//點數組,最少4個點

  DWORD cPoints );//點的數量

  4個點: 1和4是端點,2.3點是控制點

         7個點: 1.4.7是端點,其餘是控制點

多樣式的線條

        BOOL PolyDraw( HDC hdc,

        CONST POINT *lppt,//各個點的數組

  CONST BYTE *lpbTypes, //從某點到下一點的繪制方式 pointer to line and curve identifiers

  int cCount); //點的數量

  lpbTypes - PT_MOVETO  移動到該點

            PT_LINETO  繪直線

                   PT_BIZERTO Biezer曲線

矩形的繪制

普通矩形 Rectangle 

        帶圓角的矩形 

        BOOL RoundRect( HDC hdc,

        int nLeftRect, //左上X坐标

   int nTopRect, //左上Y坐标

        int nRightRect,//右下X坐标

        int nBottomRect, //右下Y坐标

        int nWidth, //生成圓角的橢圓的寬度

        int nHeight );//生成圓角的橢圓的高度

 橢圓和圓

       BOOL Ellipse( HDC hdc,

       int nLeftRect, //外切矩形左上X坐标

    int nTopRect,//外切矩形左上Y坐标

       int nRightRect, //外切矩形右下X坐标

       int nBottomRect); //外切矩形右下Y坐标

餅Pie

       BOOL Pie( HDC hdc, 

       int nLeftRect, //外切矩形左上X坐标

  int nTopRect, //外切矩形左上Y坐标

       int nRightRect,  //外切矩形右下X坐标

       int nBottomRect, //外切矩形右下Y坐标

       int nXRadial1,//切割起始半徑X坐标

       int nYRadial1,//切割起始半徑Y坐标

       int nXRadial2,//切割終止半徑X坐标

    int nYRadial2 );//切割終止半徑Y坐标

       BOOL Chord( HDC hdc, 

       int nLeftRect, //外切矩形左上X坐标

  int nTopRect, //外切矩形左上Y坐标

       int nRightRect,  //外切矩形右下X坐标

       int nBottomRect, //外切矩形右下Y坐标

       int nXRadial1,//切割起始半徑X坐标

       int nYRadial1,//切割起始半徑Y坐标

       int nXRadial2,//切割終止半徑X坐标

    int nYRadial2 );//切割終止半徑Y坐标

多邊形

       BOOL Polygon( HDC hdc,

        CONST POINT *lpPoints, //多邊形的頂點

        int nCount ); //頂點的數量

       PolyPolygon 可以繪制多組多邊形

GDI繪圖對象 - 畫筆

  2.1 畫筆的作用

   可以控制線條的顔色、樣式、寬度。

  2.2 畫筆的使用

   2.2.1 建立畫筆 CreatePen

      HPEN CreatePen(

  int fnPenStyle, //畫筆的樣式

   int nWidth, //畫筆的寬度

  COLORREF crColor);//畫筆的顔色

   2.2.2 置成目前DC可以使用的畫筆

      HGDIOBJ SelectObject(

   HDC hdc, // 目前DC的句柄

          HGDIOBJ hgdiobj );//要使用的GDI對象句柄

        傳回目前DC原來使用的同類型的GDI對象句柄。

   2.2.3 繪制圖形

   2.2.4 從目前DC中取出畫筆,即将舊畫筆

      放入目前DC中

         SelectObject( hDC, hOldPen );

   2.2.5 銷毀畫筆

      DeleteObject( hPen );

      畫筆使用時,由于繪圖資源有限,一定要

      注意釋放。

GDI繪圖對象 - 畫刷

    3.1 畫刷的作用

      填充封閉圖形,包括樣式、顔色等。

    3.2 畫刷的使用

      3.2.1 建立畫刷

         CreateSolidBrush 建立實心畫刷

         CreateHatchBrush 建立陰影線的畫刷

      3.2.2 置成目前DC可以使用的畫刷

         SelectObject 和畫筆使用方式類似

      3.2.3 繪制圖形

      3.2.4 取出畫刷

         SelectObject 和畫筆使用方式類似

      3.2.5 銷毀畫刷

         DeleteObject 和畫筆使用方式類似

GDI繪圖對象 - 位圖

1 位圖 - 通過儲存圖像上每個點的顔色,生成相應

  的位圖檔案。

    光栅圖 - 可以了解為圖像點陣的儲存

    矢量圖 - 可以了解為繪圖指令的儲存

2 位圖資源的使用

 2.1 加載位圖資源

  HBITMAP LoadBitmap(

  HINSTANCE hInstance,  //位圖資源所在應用程式句柄

  LPCTSTR lpBitmapName ); //位圖資源ID字元串

傳回位圖句柄HBITMAP

 2.2 建立放置位圖的DC

    HDC CreateCompatibleDC( HDC hDC );

    建立一個和指定的hDC相比對的DC(DC中

    包含資訊一緻)

 2.3 将位圖放入建立的DC中

    SelectObject

 2.4 繪制位圖到目前DC中

    BOOL BitBlt(

        HDC hdcDest, //繪制的目的DC句柄

  int nXDest,  //繪制的目的左上x坐标

        int nYDest,  //繪制的目的左上y坐标

        int nWidth,  //繪制的目的寬

        int nHeight, //繪制的目的高

        HDC hdcSrc,  //需要繪制的DC句柄

        int nXSrc,   //需要繪制的原圖的起始X坐标

        int nYSrc,   //需要繪制的原圖的起始y坐标 

        DWORD dwRop);  //繪圖方式

      BOOL StretchBlt(

 HDC hdcDest,  //繪制的目的DC句柄

 int nXOriginDest,//繪制的目的左上x坐标

 int nYOriginDest, //繪制的目的左上y坐标

 int nWidthDest,//繪制的目的寬

 int nHeightDest,  //繪制的目的高

 HDC hdcSrc, //需要繪制的DC句柄

 int nXOriginSrc,//需要繪制的原圖的起始X坐标

 int nYOriginSrc,//需要繪制的原圖的起始y坐标

 int nWidthSrc,//需要繪制的原圖的寬

 int nHeightSrc,//需要繪制的原圖的高

 DWORD dwRop  ); //繪圖方式

 2.5 取出位圖

    SelectObject

 2.6 删除建立的DC

    DeleteDC

 2.7 删除位圖

    DeleteObject

 2.8 擷取位圖資訊

    int GetObject(

       HGDIOBJ hgdiobj,//GDI對象句柄,這裡就是HBITMAP

       int cbBuffer,//位圖資訊的BUFF的大小

       LPVOID lpvObject ); //位圖資訊的BUFF指針

       位圖的BUFF類型為 BITMAP 結構

文字和字型              

   1 文字的繪制

     1.1 TextOut

     1.2 DrawText

       int DrawText(

        HDC hDC,//DC句柄

        LPCTSTR lpString, //字元串

        int nCount,//字元串長度

        LPRECT lpRect,//繪制字元串的矩形區域

        UINT uFormat ); //繪制方式

        DT_CENTER - 水準居中 

        DT_VCENTER - 垂直居中

        DT_SINGLELINE - 單行顯示不換行

        DT_NOCLIP - 超出矩形框不剪切

        DT_WORDBREAK - 換行

      1.3 ExtTextOut

        繪制字元時,可以設定字元間距.

        對于漢字字元,由于一個字元占2個位元組,

        是以漢字字元之間的間距應該為0;

     CHAR szText2[12] = "E你xtTex好";

     INT  nText[10] = { 30, 0, 30, 30, 30, 

       30, 30, 30, 0, 10 };

     ExtTextOut( hDC, 100, 300, ETO_OPAQUE,

    NULL, szText2, strlen(szText2), nText );

 1.4 字元繪制的相關屬性

   SetTextColor 設定字元的顔色

   SetBkColor 設定背景色

   SetBkMode 繪制的方式

   2 字型的使用

     2.1 建立字型

        HFONT CreateFont(

  int nHeight, //字型邏輯高

        int nWidth, //字型邏輯寬度

        int nEscapement, //切斜度

        int nOrientation,//旋轉

        int fnWeight,//加粗

        DWORD fdwItalic,//斜體

        DWORD fdwUnderline,//下劃線

        DWORD fdwStrikeOut,//删除線

        DWORD fdwCharSet,//字元集

        DWORD fdwOutputPrecision, //輸出

        DWORD fdwClipPrecision,  //剪切

        DWORD fdwQuality, //輸出品質

        DWORD fdwPitchAndFamily, // pitch and family

        LPCTSTR lpszFace ); //字型名稱

     2.2 設定字型

        SelectObject

     2.3 繪圖

     2.4 取出字型

        SelectObject

     2.5 删除字型

        DeleteObject

     2.6 建立字型常使用TrueType字型.

上述繪圖方法有很多簡單重複的地方,是以我隻寫了幾個有代表性的代碼示例:

//擷取客戶區DC
		CDC* pClientDC = GetDC();
		/點/
		//繪制點
		pClientDC->SetPixel(10, 20, RGB(255, 0, 0));
		//得到點的顔色
		COLORREF clPixel = pClientDC->GetPixel(10, 20);
		/線/
		//繪制線
		pClientDC->MoveTo(0, 0);
		pClientDC->LineTo(100, 100);
		/矩形/畫刷的使用
		//建立畫刷
		CBrush brs;
		brs.CreateHatchBrush(HS_CROSS,RGB(0,255,0));//++類型,綠色畫刷
		//載入畫刷
		CBrush* pOldBrs = pClientDC->SelectObject(&brs);
		//繪制矩形
		pClientDC->Rectangle(50, 50, 100, 100);
		//載出畫刷
		pClientDC->SelectObject(pOldBrs);
		//删除畫刷
		brs.DeleteObject();
		///位圖的使用///
		//建立位圖
		CBitmap bmpCar;
		bmpCar.LoadBitmapW(IDB_BMP_CAR);
		//建立記憶體DC
		CDC MemClientDC;
		MemClientDC.CreateCompatibleDC(pClientDC);
		//位圖加載到記憶體DC上
		MemClientDC.SelectObject(bmpCar);
		//将記憶體DC繪制到客戶區
		pClientDC->BitBlt(0, 0, 400, 200, &MemClientDC, 0, 0, SRCCOPY);
		//删除記憶體DC和位圖
		MemClientDC.DeleteDC();
		bmpCar.DeleteObject();

//字型的繪制
		//建立字型
		CFont font;
		font.CreatePointFont(200, _T("宋體"));
		//載入字型
		CFont* pOldFont;
		pOldFont = pClientDC->SelectObject(&font);
		//繪制字
		pClientDC->TextOutW(450, 50, _T("你好"));
		//載出字型
		pClientDC->SelectObject(pOldFont);
		//删除字型
		font.DeleteObject();

		ReleaseDC(pClientDC);