一些常规形几何形状的绘制和效果填充(一)
源程序下載
?? 一些常規形幾何形狀的繪制和效果填充
???????????????????? ?visualsan@yahoo.cn
???? 常規幾何形狀是指三角形,多邊形,圓,圓弧,直線,點,文字等的繪制。這些基本幾何形狀經過組合可以形成各種效果圖,包括一些儀表和圖表。要實現這些效果,使用opengl是最佳選擇。但是對于不熟悉opengl編程的人來說,有些困難,而且學習opengl不是幾天的事情,而且opengl使用要遵守一定的編程規則,比較繁瑣。
?? 本人以CDC類的成員函數為基礎,經過幾天探索和研究以及綜合一些前人代碼,完成了一個基本幾何圖形繪制和效果填充的類CShape.現在介紹給大家。下面圖形是示例程序時鐘和旋轉文字運行截圖:
?
效果圖片1:
效果圖片2:
?
??? CDC類所提供的路徑操作和畫刷填充是實現這些效果的關鍵。要實現的具體圖形繪制有三種:1.幾何輪廓繪制。2.單色幾何圖形的填充。3.顏色漸變填充。
??? 幾何圖形輪廓繪制較簡單,它的顏色靠傳遞的pDC的pen決定,靠MoveTO,LineTo繪制直線,靠Arcd等繪制圓弧。關鍵在于正確計算各個點的位置。在繪圖前創建CPen并正確傳遞給pDC。單色填充使用路徑操作來實現。比如要繪制一個單色三角形,具體步驟為:
1.????? 根據需要生成指定顏色的畫刷或者是位圖畫刷,并正確傳遞給pDC。
2.????? 使用路徑畫三角形并填充:
??????????? pDC->BeginPath();//開始定義路徑
?????? ???? pDC->MoveTo(p1);//三點定義三角形
?????? ???? pDC->LineTo(p2);
?????? ???? pDC->LineTo(p3);
?????? ???? pDC->LineTo(p1);
?????? ???? pDC->EndPath();//結束,路徑一定要封閉
?????? ???? pDC->FillPath();//使用當前畫刷填充三角形
??? 對于其他圖形比如多邊形,一定角度的圓環等幾何形狀,其繪制關鍵在于確定形成幾何圖形的參數個數,然后正確計算各個點的數值,然后BeginPath()和EndPath()創建路徑。之后用指定畫刷填充FillPath()。對于矩形和圓可以直接用CDC的rectangle和ellipse來繪制填充。但是復雜圖形就必須用路徑來繪制了。
CDC可以實現單色填充和位圖填充,但是不提供顏色漸變。要實現漸變,我目前所知道的方法有兩種:
??? 1.用位圖填充。
????2.使用window API函數GradientFill實現矩形和三角形的漸變填充。
具體介紹如下。
??? 位圖填充是指先在內存中繪制一幅覆蓋目標區域的位圖,然后形成位圖畫刷進行填充。具體步驟為:
方法1.直接繪制填充位圖
????? CDC* pDC=GetDC();
????? CBitmap bt,*oldbt;
????? CDC meDC;
????? bt.CreateCompatibleBitmap(pDC, R.Width(), R.Height());
????? //生成空間的//內存位圖
????? meDC.CreateCompatibleDC(pDC);//生成內存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實現漸變填充,參考了一些網上的代碼和文獻,現在就GradientFill的使用總結如下:
1.????? 生成全局變量
??? typedef UINT (CALLBACK* LPFNDLLFUNC1)(HDC,CONST?? PTRIVERTEX,DWORD,CONST PVOID,DWORD,DWORD);
?
???? LPFNDLLFUNC1 handle_GradientFill;
?????? HINSTANCE hinst_msimg32;
?????? bool m_bGradientFillInit;
在初始化時載入動態鏈接庫: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.在程序結束時釋放動態鏈接庫:
i??????? f (m_bGradientFillInit)
?????? ?? {
????????????? ??? FreeLibrary( hinst_msimg32 );
?????? ?? }
2.????? 可利用GradientFill實現的填充圖形有兩種:三角形和矩形。三角形的效果是指定三個點的顏色,然后實現顏色漸變。矩形有兩種效果:從左到右實現顏色漸變和從上倒下實現顏色漸變。經過適當的擴展,我增加了三種效果:中心大左右,中心到上下,以及中心到四周的填充效果。具體做法是將矩形分成若干個三角形或矩形,然后分別填充即可實現不同的填充效果。比如中心到左右的填充效果實現如下:先把矩形分成左右兩個矩形,對左邊矩形實現從左到右的填充,對右邊矩形實現從右向左的填充,如此總體效果是從中心到兩邊的漸變效果。
?
總結
以上是生活随笔為你收集整理的一些常规形几何形状的绘制和效果填充(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从numpy里加载_PyTorch强化:
- 下一篇: sql读取excel数据_Python