人人做人人澡人人爽欧美,国产主播一区二区,久久久精品五月天,羞羞视频在线观看免费

當前位置:蘿卜系統下載站 > 技術開發教程 > 詳細頁面

如何運用Win32中新增的GDI對象——路徑

如何運用Win32中新增的GDI對象——路徑

更新時間:2022-10-09 文章作者:未知 信息來源:網絡 閱讀次數:

路徑是Win32中新增的一個GDI對象,下面先從概念上談起。
 1 路徑的概念
 在Windows 95/NT 這樣的Win32操作系統中,除了已有的位圖,畫筆,畫刷,字體,調色板和區域之外,還增加了一個新的GDI對象:路徑。路徑是可以被填充,畫出輪廓或同時被畫出輪廓并填充的一個或多個圖形。路徑的引入,大大地豐富了Windows的圖形功能,使得應用程序可以方便地建立復雜區域,繪制和填充不規則圖形。這里說的不規則圖形是指由直線和貝塞爾曲線組成的圖形(相對于矩形,多邊形,橢圓等規則圖形)。
 2 路徑的使用
 與其它原有的GDI對象不同的是,MFC類庫沒有專門用一個C++類來封裝路徑對象(或許在以后的版本中會得到支持)。有關路徑的定義和使用等各種操作都必須通過調用API函數(或CDC類中對應的成員函數)來實現。
 路徑的使用過程大致如下:
 (1)調用BeginPath()函數開始路徑定義;
 (2)調用GDI繪圖函數來定義路徑;
 在Win32中,可以用于定義路徑的GDI繪圖函數包括:
 AngleArc Arc ArcTo Chord *CloseFigure
 Ellipse *ExtTextOut *LineTo *MoveToEx Pie
 *PolyBezier *PolyBezierTo PolyDraw *Polygon *Polyline
 *PolyLineTo *PolyPolygon *PolyPolylin Rectangl RoundRect
 *TextOut
 其中,在Windows 95中只能使用上述帶*的GDI函數。
 (3)調用EndPath()函數結束路徑定義;
 完成路徑定義后,所定義的路徑即被同時選進設備描述表,設備描述表中原有的路徑對象在調用BeginPath()函數開始路徑定義時即被廢棄。
 (4)使用路徑對象。
 完成路徑定義工作之后,應用程序便可以利用有關GDI函數來使用路徑,這些函數包括繪制路徑輪廓StrokePath(),填充路徑FillPath(),繪制輪廓并填充StrokeAndFillPath(),把路徑轉換成區域PathToRegion(),把路徑直線化FlattenPath(),提取路徑數據GetPath(),加寬路徑WidenPath()和設置裁剪路徑SelectClipPath()等。這些函數的具體使用方法可參閱有關的SDK文檔。
 3 應用舉例
 路徑的引入為我們在應用程序中定義復雜區域提供了極大的方便,而不再局限于直線和橢圓弧這兩種線形,這一點是很容易理解的。
 另外,注意到在定義路徑時可以使用TextOut()和ExtTextOut()函數,我們便可以在文字特色顯示方面巧妙地使用路徑,克服以往文字特顯對位圖操作的倚賴,從而方便快捷地制作出堪與WPS和Word等文字處理軟件相媲美的“藝術漢字”來。
 本文下面所提供的這個示例程序執行后,在窗口中顯示出按正弦曲線起伏排列的“龍騰虎躍”五個楷體大字。窗口背景為灰色,文字前景則為一幅256色位圖,就好象是把彩圖剪成文字粘貼在窗口上一樣(見下圖)。下面具體說明該示例程序的創建方法。
 (1)啟動VC++,創建一個單文檔應用,項目名取為Path,其它選項保留原缺省設置。
 (2)在CPathView類中增加一個成員變量:
 // PathView.h : interface of the CPathView class
 ……
 class CPathView : public CView
 {
 ……
 // Implementation
 public:
 CFont m_fontKaiTi;
 ……
 并在CPathView類的構造函數中創建該Cfont對象,在CPathView類的析構函數中撤消該Cfont對象:
 // PathView.cpp : implementation of the CPathView class
 ……
 CPathView::CPathView()
 {
 // TODO: add construction code here
 m_fontKaiTi.CreateFont(200 , 0 , 0 , 0 , FW_BLACK ,
 FALSE , FALSE , FALSE ,
 GB2312_CHARSET ,
 OUT_DEFAULT_PRECIS ,
 CLIP_DEFAULT_PRECIS ,
 DEFAULT_QUALITY ,
 FIXED_PITCH | FF_MODERN,
 "楷體_GB2312");
 }
 CPathView::~CPathView()
 {
 m_fontKaiTi.DeleteObject();
 }
 (3)在CPathView::OnDraw()函數中添加如下代碼:
 void CPathView::OnDraw(CDC* pDC)
 {
 ……
 // TODO: add draw code for native data here
 RECT rect;
 GetClientRect(&rect);
 CFont* pOldFont=(CFont*)pDC->SelectObject(&m_fontKaiTi);
 pDC->SetBkMode(TRANSPARENT);
 //定義路徑
 pDC->BeginPath();{
 pDC->TextOut(0,10,"龍",2);
 pDC->TextOut(200,10,"騰",2);
 pDC->TextOut(400,10,"虎",2);
 pDC->TextOut(600,10,"躍",2); }
 pDC->EndPath();
 pDC->SelectObject(pOldFont);
 //檢取路徑數據
 int nCount=pDC->GetPath(NULL,NULL,0);
 CPoint* points=new CPoint[nCount];
 BYTE* bytes=new BYTE[nCount];
 pDC->GetPath(points,bytes,nCount);
 //對路徑定義點按正弦曲線進行變換
 int i;
 for(i=0;i< nCount;i++)>/p>
 points[i].y=points[i].y+(int)(80*sin(points[i].x
 /300.*3.1415926)+100);
 //重建一個新的路徑
 CPoint ptStart;
 pDC->BeginPath();{
 for(i=0;i< nCount;i++){>/p>
 switch(bytes[i]){
 //移動當前點位置
 case PT_MOVETO:
 pDC->MoveTo(points[i]);
 ptStart=points[i];
 break;
 //畫直線
 case PT_LINETO:
 pDC->LineTo(points[i]);
 break;
 //畫貝塞爾曲線
 case PT_BEZIERTO:
 pDC->PolyBezierTo(points+i,3);
 i=i+2;
 break;
 //畫貝塞爾曲線并封閉圖形
 case PT_BEZIERTO|PT_CLOSEFIGURE:
 points[i+2]=ptStart;
 pDC->PolyBezierTo(points+i,3);
 i=i+2;
 break;
 //畫直線并封閉圖形
 case PT_LINETO|PT_CLOSEFIGURE:
 pDC->LineTo(ptStart);
 break;
 }
 }
 pDC->CloseFigure();
 }
 pDC->EndPath();
 //繪制窗口灰色背景
 CBrush* pOldBrush=(CBrush*)(pDC->SelectStockObject(GRAY_BRUSH));
 pDC->Rectangle(&rect);
 pDC->SelectObject(pOldBrush);
 //設置裁剪路徑
 pDC->SetPolyFillMode(WINDING);
 pDC->SelectClipPath(RGN_COPY);
 //用位圖填充裁剪區域
 CBitmap bmp;
 CBitmap* pBmpOld;
 bmp.LoadBitmap(IDB_BMP);
 CDC dcMem;
 dcMem.CreateCompatibleDC(pDC);
 pBmpOld=dcMem.SelectObject(&bmp);
 pDC->StretchBlt(0,0,rect.right,rect.bottom,
 &dcMem,0,0,600,100,SRCCOPY);
 dcMem.SelectObject(pBmpOld);
 dcMem.DeleteDC();
 bmp.DeleteObject();
 }
 (4)在資源中添加文字前景位圖,其ID為IDB_BMP。
 (5)編譯,連接,運行該應用程序。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

網站地圖xml | 網站地圖html
主站蜘蛛池模板: 临洮县| 玉溪市| 凭祥市| 称多县| 额敏县| 文安县| 岐山县| 五寨县| 塘沽区| 滦南县| 大关县| 乐平市| 定陶县| 应用必备| 资源县| 德安县| 阿克陶县| 唐山市| 沈丘县| 峨山| 鹤庆县| 庄河市| 安塞县| 赤峰市| 五华县| 筠连县| 巴林左旗| 海口市| 化州市| 都江堰市| 浦城县| 博湖县| 平谷区| 全椒县| 屏南县| 邢台市| 岑溪市| 扬州市| 花莲市| 隆昌县| 襄樊市|