日本国产亚洲-日本国产一区-日本国产一区二区三区-日本韩国欧美一区-日本韩国欧美在线-日本韩国欧美在线观看

當(dāng)前位置:雨林木風(fēng)下載站 > 技術(shù)開發(fā)教程 > 詳細(xì)頁面

完成以復(fù)雜線條為基礎(chǔ)的圖形繪圖

完成以復(fù)雜線條為基礎(chǔ)的圖形繪圖

更新時間:2022-05-04 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

郎銳

一、引言
在GIS(地理信息系統(tǒng))類軟件設(shè)計中經(jīng)常需要在繪圖時使用一些相對固定但又頻繁使用的一些用以代表地理狀態(tài)的符號如河流、鐵路、海岸線等等。每一種符號均有其各自的風(fēng)格,但在不同的位置的具體表示卻不盡相同,比如代表鐵路的符號是一段黑白相間的細(xì)矩形,但有時是平直的,在拐彎時用彎曲的矩形來表示。因此對于上述符號的繪制一般不易用固定的圖標(biāo)去實(shí)現(xiàn),而多采用靈活多變的用函數(shù)來直接繪制的方法。顯然作為GIS基本符號的圖形一般都是相對比較復(fù)雜的線條,在MFC提供的基本類庫中并未提供可以直接使用的相關(guān)函數(shù)。即使是在繪圖功能比較強(qiáng)大的CDC中也僅僅提供了LineTo()、SetPixel()等一些通用的最基本的繪圖函數(shù),雖然也可以使用這些基本函數(shù)來繪制GIS里的基本符號,但這是效率比較低下的一種辦法,這在大量的繪圖操作中將會表現(xiàn)的比較明顯,因此不宜提倡。本文下面將介紹一種使用Win32 API函數(shù)LineDDA來繪制復(fù)雜風(fēng)格線條的方法來解決上述類似問題。
二、把復(fù)雜風(fēng)格的線條作為基本繪圖操作
在Windows NT 3.1中首次出現(xiàn)了Win32 API函數(shù)LineDDA,用以創(chuàng)建虛線或點(diǎn)劃線,以及其他一些更復(fù)雜的線條。因此可以從該函數(shù)入手來解決以復(fù)雜線條作為基本繪圖操作的問題。LineDDA函數(shù)主要是通過回調(diào)機(jī)制來實(shí)現(xiàn)其功能的,其繪制線條總是被使用當(dāng)前顯示分辨率的缺省轉(zhuǎn)換和映射模式來計算的。如果不使用缺省方式,也可以向其回調(diào)函數(shù)LineDDAProc傳遞手工轉(zhuǎn)換的X和Y值。LineDDA是一個32位的圖形設(shè)備接口庫函數(shù)調(diào)用,從如下所示的函數(shù)原形中可以看出其入口參數(shù)是一組線條坐標(biāo)、一個回調(diào)函數(shù)的地址以及一個指向應(yīng)用程序定義數(shù)據(jù)的指針:
BOOL LineDDA( int nXStart, // 線條起點(diǎn)的X坐標(biāo)
int nYStart, // 線條起點(diǎn)的Y坐標(biāo)
int nXEnd, // 線條終點(diǎn)的X坐標(biāo)
int nYEnd, // 線條終點(diǎn)的Y坐標(biāo)
LINEDDAPROC lpLineFunc, // 回調(diào)函數(shù)的指針
LPARAM lpData // 應(yīng)用程序定義數(shù)據(jù)的指針);
由lpLineFunc指針指向的回調(diào)函數(shù)將在除終點(diǎn)外的線段的每個點(diǎn)上被調(diào)用,顯然這里是實(shí)現(xiàn)復(fù)雜線條算法的最佳地方。該回調(diào)函數(shù)一般可以定義如下:
VOID CALLBACK LineDDAProc(int X, // 被求值點(diǎn)的X坐標(biāo)
int Y, // 被求值點(diǎn)的Y坐標(biāo)
LPARAM lpData // 應(yīng)用程序定義數(shù)據(jù)的指針);
在實(shí)際調(diào)用時一般選當(dāng)前的設(shè)備環(huán)境句柄作為應(yīng)用程序定義數(shù)據(jù)的指針,該指針會在調(diào)用LineDDA函數(shù)時將其傳送給回調(diào)函數(shù)LineDDAProc,在回調(diào)函數(shù)中通過CDC* pDC= (CDC*)lpData;強(qiáng)制轉(zhuǎn)換即可在其中使用當(dāng)前的設(shè)備環(huán)境句柄,并通過該句柄進(jìn)行繪圖等工作。下面通過一個具體實(shí)例來做進(jìn)一步的介紹:
類似于CDC類庫中的繪圖函數(shù),當(dāng)我們把某種較復(fù)雜線條作為一個整體元素進(jìn)行繪圖操作時有以下幾個元素需要確定:起始點(diǎn)、終止點(diǎn)坐標(biāo),繪圖時用的顏色等。因此可以初步確定繪制復(fù)雜線條的函數(shù)采取如下形式:
void CLineDDAView::DrawWave(CPoint ptFrom, CPoint ptTo, COLORREF crValue)
{
g_crValue=crValue; //繪制圖形用的顏色
CDC* pDC=GetDC(); //獲取當(dāng)前設(shè)備環(huán)境句柄
//通過LineDDA函數(shù)調(diào)用回調(diào)函數(shù)Proc以完成復(fù)雜線條的繪圖工作
LineDDA(ptFrom.x,ptFrom.y,ptTo.x,ptTo.y,(LINEDDAPROC)Proc,(long)pDC);
ReleaseDC(pDC); //釋放申請到的設(shè)備環(huán)境句柄
}
具體的實(shí)質(zhì)性工作一般都是放在回調(diào)函數(shù)中進(jìn)行的,在這里只是象征性的實(shí)現(xiàn)一個波浪曲線的繪圖工作:
VOID CALLBACK Proc(int X, int Y, LPARAM lpData)
{
//使用lpData傳遞用于繪圖的CDC對象的引用
CDC* pDC;
pDC = (CDC*)lpData;
//該回調(diào)函數(shù)將在線上每個點(diǎn)處被調(diào)用,因此隨著X坐標(biāo)的變化,縱坐標(biāo)Y+sin(X)
//也就呈正弦波形波動,通過CDC類的SetPixel函數(shù)將計算出的波浪線上的每一點(diǎn)
//都顯示出來。
pDC->SetPixel(X,Y+sin(X),g_crValue);
}
在應(yīng)用時應(yīng)當(dāng)根據(jù)需求的不同采取不同的線條風(fēng)格設(shè)計算法,甚至可以在回調(diào)函數(shù)中使用TextOut函數(shù)實(shí)現(xiàn)文本文字的曲線顯示等效果。在使用我們設(shè)計的DrawWave函數(shù)進(jìn)行繪圖操作時,可以象是使用CDC提供的LineTo等函數(shù)一樣非常簡單的畫出一條在CDC類中并未提供的波浪線。
小結(jié):LineDDA函數(shù)為畫出復(fù)雜線條類型提供了一種解決辦法。雖然是一種Win32的解決辦法,在MFC中并不直接支持,但作為一個一般的解決辦法,它還是十分有用的,而且它能解決一些沒有直接解決辦法的比較獨(dú)特的問題。通過對LineDDA函數(shù)的挖掘可以設(shè)計出適合自己需要的可以作為繪圖基本單元的復(fù)雜線條。本程序在Windows 98下,以Microsoft Visual C++ 6.0編譯通過。 

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

本類教程下載

系統(tǒng)下載排行

主站蜘蛛池模板: 韩日中文字幕 | 成人a大片高清在线观看 | 日韩精品一区二区三区中文 | 国产不卡视频一区二区在线观看 | 91视频.com| 大片在线播放日本一级毛片 | 老司机免费福利视频无毒午夜 | 日本视频在线观看播放免费 | 国产精品lululu在线观看 | 日本人xxxxx视频在线 | 久久全国免费久久青青小草 | 浮力影院欧美 | 久久久久久不卡 | 日韩欧美一区二区精品久久 | 国产乱人视频在线播放不卡 | 亚洲一区二区免费视频 | 国产成人精品亚洲2020 | 中文偷拍视频在线观看 | 国产精品久久久久久影院 | 2o2o天天看夜夜看狠狠看 | 亚洲欧美高清视频 | 99国产精品免费视频观看 | 国产精品久久久久久久久夜色 | 天天做夜夜做久久做狠狠 | 美女极品粉嫩美鲍35p | 超pen个人视频国产免费观看 | 日韩欧美伦理 | 天天在线欧美精品免费看 | 99九九成人免费视频精品 | 免费毛片在线视频 | 99蜜臀噜噜噜在线视频观看 | 亚洲日韩中文字幕在线播放 | 国产亚洲一区二区三区在线 | 夜夜操网 | 午夜影院免费观看视频 | 毛片免费高清免费 | 日韩黄色一级大片 | 日本一区二区视频在线 | 日韩在线观看不卡 | 久久综合九色综合欧美播 | 精品老司机在线观看视频 |