Win32中新增的GDI物件 路徑

2021-06-18 08:17:36 字數 3040 閱讀 9624

路徑是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)啟動v

c++,建立乙個單文件應用,專案名取為path,其它選項保留原預設設定。

(2)在cpathview類中增加乙個成員變數:

// pathview.h : inte***ce of the cpathview class

…… class cpathview : public cview

cpathview::~cpathview()

(3)在cpathview::ondraw()函式中新增如下**:

void cpathview::ondraw(cdc* pdc)

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

} 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)編譯,連線,執行該應用程式。

WIN32中使用GDI 入門

方法和我前面寫過的vs2013使用gdi 一樣 2 配置 專案 屬性 配置屬性 聯結器 輸入 附加依賴庫中新增 gdiplus.lib 3 新增標頭檔案,放在主函式標頭檔案中,這個位置隨意 include include gdiplus.h using namespace gdiplus pragm...

Win32 下使用 GDI 遇到的問題

許多人提出過,在非mfc模式下,編譯gdi 程式,會出現多達130個錯誤,多數類似 不支援預設型別表示.云云.解決方法也很快提出來了,在gdi 頭 include之前加上 之類的mfc的標頭檔案.算然可以一定程度解決問題 dll 程式下還需要注釋掉 define win32 lean and mea...

Win32中的listbox學習

列表框樣式 visual studio 2013 其他版本 當列表框不包含足夠的項滾動時,lbs disablenoscroll列表框顯示乙個禁用的垂直滾動條。若無此樣式,當列表框不包含足夠的項時,滾動條將隱藏。使用 shift 鍵和滑鼠或特定組合鍵lbs extendedsel,使用者可以選擇多個...