路徑是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,使用者可以選擇多個...