一些常规形几何形状的绘制和效果填充(一)
源程序下載
?? 一些常規(guī)形幾何形狀的繪制和效果填充
???????????????????? ?visualsan@yahoo.cn
???? 常規(guī)幾何形狀是指三角形,多邊形,圓,圓弧,直線,點(diǎn),文字等的繪制。這些基本幾何形狀經(jīng)過(guò)組合可以形成各種效果圖,包括一些儀表和圖表。要實(shí)現(xiàn)這些效果,使用opengl是最佳選擇。但是對(duì)于不熟悉opengl編程的人來(lái)說(shuō),有些困難,而且學(xué)習(xí)opengl不是幾天的事情,而且opengl使用要遵守一定的編程規(guī)則,比較繁瑣。
?? 本人以CDC類的成員函數(shù)為基礎(chǔ),經(jīng)過(guò)幾天探索和研究以及綜合一些前人代碼,完成了一個(gè)基本幾何圖形繪制和效果填充的類CShape.現(xiàn)在介紹給大家。下面圖形是示例程序時(shí)鐘和旋轉(zhuǎn)文字運(yùn)行截圖:
?
效果圖片1:
效果圖片2:
?
??? CDC類所提供的路徑操作和畫刷填充是實(shí)現(xiàn)這些效果的關(guān)鍵。要實(shí)現(xiàn)的具體圖形繪制有三種:1.幾何輪廓繪制。2.單色幾何圖形的填充。3.顏色漸變填充。
??? 幾何圖形輪廓繪制較簡(jiǎn)單,它的顏色靠傳遞的pDC的pen決定,靠MoveTO,LineTo繪制直線,靠Arcd等繪制圓弧。關(guān)鍵在于正確計(jì)算各個(gè)點(diǎn)的位置。在繪圖前創(chuàng)建CPen并正確傳遞給pDC。單色填充使用路徑操作來(lái)實(shí)現(xiàn)。比如要繪制一個(gè)單色三角形,具體步驟為:
1.????? 根據(jù)需要生成指定顏色的畫刷或者是位圖畫刷,并正確傳遞給pDC。
2.????? 使用路徑畫三角形并填充:
??????????? pDC->BeginPath();//開始定義路徑
?????? ???? pDC->MoveTo(p1);//三點(diǎn)定義三角形
?????? ???? pDC->LineTo(p2);
?????? ???? pDC->LineTo(p3);
?????? ???? pDC->LineTo(p1);
?????? ???? pDC->EndPath();//結(jié)束,路徑一定要封閉
?????? ???? pDC->FillPath();//使用當(dāng)前畫刷填充三角形
??? 對(duì)于其他圖形比如多邊形,一定角度的圓環(huán)等幾何形狀,其繪制關(guān)鍵在于確定形成幾何圖形的參數(shù)個(gè)數(shù),然后正確計(jì)算各個(gè)點(diǎn)的數(shù)值,然后BeginPath()和EndPath()創(chuàng)建路徑。之后用指定畫刷填充FillPath()。對(duì)于矩形和圓可以直接用CDC的rectangle和ellipse來(lái)繪制填充。但是復(fù)雜圖形就必須用路徑來(lái)繪制了。
CDC可以實(shí)現(xiàn)單色填充和位圖填充,但是不提供顏色漸變。要實(shí)現(xiàn)漸變,我目前所知道的方法有兩種:
??? 1.用位圖填充。
????2.使用window API函數(shù)GradientFill實(shí)現(xiàn)矩形和三角形的漸變填充。
具體介紹如下。
??? 位圖填充是指先在內(nèi)存中繪制一幅覆蓋目標(biāo)區(qū)域的位圖,然后形成位圖畫刷進(jìn)行填充。具體步驟為:
方法1.直接繪制填充位圖
????? CDC* pDC=GetDC();
????? CBitmap bt,*oldbt;
????? CDC meDC;
????? bt.CreateCompatibleBitmap(pDC, R.Width(), R.Height());
????? //生成空間的//內(nèi)存位圖
????? meDC.CreateCompatibleDC(pDC);//生成內(nèi)存DC
????? oldbt=meDC.SelectObject(&bt);
?? ????
?????? 形成需要的位圖,包括顏色漸變等
?????????? CBrush *old,b(RGB(0,255,0));
?????? ??? old=meDC.SelectObject(&b);
?????? ??? meDC.FillRect(R,&b);
?????? ??? meDC.SelectObject(old);
?????? ??? b.DeleteObject();
?????? /
?????? ?? b.CreatePatternBrush(&bt);//形成位圖畫刷
?????? ?? old=pDC->SelectObject(&b);//載入
?????? ?? pDC->FillRect(R,&b);//使用位圖畫刷填充圖形
?????? ?? pDC->SelectObject(old);
方法2.直接載入位圖作為畫刷:
?????? CBitmap bt,*oldbt;
?????? bt.LoadBitmap(IDB_BITMAP1);//載入位圖
?????? CRect R;
?????? GetClientRect(R);
?????? CBrush *old,b;
?????? b.CreatePatternBrush(&bt);//形成位圖畫刷
?????? old=pDC->SelectObject(&b);
?????? pDC->FillRect(R,&b);
?????? pDC->SelectObject(old);
?????? bt.DeleteObject();
?
?
?????????? ?
???????????? 填充位圖
??
?????????????????????????? 填充效果
?
另外一種方法是用GradientFill實(shí)現(xiàn)漸變填充,參考了一些網(wǎng)上的代碼和文獻(xiàn),現(xiàn)在就GradientFill的使用總結(jié)如下:
1.????? 生成全局變量
??? typedef UINT (CALLBACK* LPFNDLLFUNC1)(HDC,CONST?? PTRIVERTEX,DWORD,CONST PVOID,DWORD,DWORD);
?
???? LPFNDLLFUNC1 handle_GradientFill;
?????? HINSTANCE hinst_msimg32;
?????? bool m_bGradientFillInit;
在初始化時(shí)載入動(dòng)態(tài)鏈接庫(kù):msimg32.dll
?????? m_bGradientFillInit=false;
?????? hinst_msimg32=NULL;
?????? hinst_msimg32 = LoadLibrary( "msimg32.dll" );
?????? if(hinst_msimg32)
?????? {
????????????? m_bGradientFillInit = TRUE;?
???????????????handle_GradientFill = ((LPFNDLLFUNC1) GetProcAddress(????????
?????????????? hinst_msimg32, "GradientFill" ));
?????? }
2.在程序結(jié)束時(shí)釋放動(dòng)態(tài)鏈接庫(kù):
i??????? f (m_bGradientFillInit)
?????? ?? {
????????????? ??? FreeLibrary( hinst_msimg32 );
?????? ?? }
2.????? 可利用GradientFill實(shí)現(xiàn)的填充圖形有兩種:三角形和矩形。三角形的效果是指定三個(gè)點(diǎn)的顏色,然后實(shí)現(xiàn)顏色漸變。矩形有兩種效果:從左到右實(shí)現(xiàn)顏色漸變和從上倒下實(shí)現(xiàn)顏色漸變。經(jīng)過(guò)適當(dāng)?shù)臄U(kuò)展,我增加了三種效果:中心大左右,中心到上下,以及中心到四周的填充效果。具體做法是將矩形分成若干個(gè)三角形或矩形,然后分別填充即可實(shí)現(xiàn)不同的填充效果。比如中心到左右的填充效果實(shí)現(xiàn)如下:先把矩形分成左右兩個(gè)矩形,對(duì)左邊矩形實(shí)現(xiàn)從左到右的填充,對(duì)右邊矩形實(shí)現(xiàn)從右向左的填充,如此總體效果是從中心到兩邊的漸變效果。
?
總結(jié)
以上是生活随笔為你收集整理的一些常规形几何形状的绘制和效果填充(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 从numpy里加载_PyTorch强化:
- 下一篇: hive中导入text文件遇到的坑