日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一些常规形几何形状的绘制和效果填充(三)

發布時間:2025/3/12 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一些常规形几何形状的绘制和效果填充(三) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
源程序下載

?

(續)????????? ???? visualsan@yahoo.cn

下面以實現鐘和旋轉文字為例具體講解CShape的使用方法:

????鐘由表盤,指針和刻度組成。具體繪圖函數在OnPaint()函數里實現,由于刷新較快,而所以繪圖都需要計算得到,故要占一定的CPU使用率,避免cpu過高的方法是把不變的部分如表盤,刻度等繪制成一張背景位圖,在OnPaint函數里載入背景位圖,這樣做可大大減低cpu使用率。另外繞一定圓旋轉一定角度的文字是一個一個字符計算位置和輸出的,顧若輸出過多的字符則cpu的使用率也很高,當然可以用位圖背景的方法來提高效率。效果圖如下:

?

?

1.初始化時繪制時鐘背景位圖

????????????? p.DeleteObject();

?????? ????? ?CDC *pDC=GetDC();

?????? ????? ?CRect rect;

????????????? GetClientRect(&rect);

????????????? CPoint pt;

????????????? pt.x=500;

????????????? pt.y=500;

?????????????

????????????? CBitmap *oldbitmap;

????????????? p.CreateCompatibleBitmap(pDC, rect.Width(),???

??????????????rect.Height());//生成空間的內存位圖

????????????? CDC me;

????????????? me.CreateCompatibleDC(pDC);//生成內存cd

????????????? oldbitmap=me.SelectObject(&p);

????????????? CBrush *oldbrush,b(RGB(120,0,0));

????????????? oldbrush=me.SelectObject(&b);

????????????? CPen *oldpen,pen(0,2,RGB(0*rand()/RAND_MAX,0,255));

????????????? oldpen=me.SelectObject(&pen);

????????????? CShape shap;

????????????? pt.x=400;

????????????? pt.y=300;

?????????? ?? shap.DrawConeGradientCenterToSide

???????????? (&me,pt,200,130,0,360,RGB(0,0,255),RGB(0,0,0));

??????

????????????? shap.DrawConeGradientSideToSide

????????????? (&me,pt,120,0,0,360,RGB(255,255,0),RGB(0,0,0));

??????

?????? ?????? shap.DrawConeGradientSideToSide

????????????? (&me,pt,100,50,45,90,RGB(120,111,200),RGB(0,0,0));

?

????????????? for ( int i=0;i<12*5;i++)

????????????? {

???????????????????? shap.DrawLine_CenterPoint_Len_Angle

???????????????????? (&me,pt,162,175,RGB(120,111,200),i*6,2);

????????????? }

????????????? for (? i=0;i<12;i++)

????????????? {

???????????????????? shap.DrawLine_CenterPoint_Len_Angle

??????????????????? ?(&me,pt,160,180,RGB(0,255,0),i*30,5);

????????????????????

????????????? }

????????????? b.DeleteObject();

????????????? b.CreateSolidBrush(RGB(0,255,0));

????????????? oldbrush=me.SelectObject(&b);

????????????? me.SelectObject(oldbrush);???

????????????? b.DeleteObject();

????????????? b.CreateSolidBrush(RGB(0,0,255));

????????????? oldbrush=me.SelectObject(&b);

????????????? me.SelectObject(oldbrush);

??????????? ? CString str;

????????????? me.SelectObject(oldbrush);

????????????? me.SelectObject(oldpen);

????????????? me.SetROP2(R2_WHITE);

???????????? ?pDC->BitBlt(0, 0, rect.Width(), rect.Height(),

?????????????& me, 0, 0, SRCCOPY);

??? ?????? ?? me.SelectObject(oldbitmap);

????????????? me.DeleteDC();

????????????? pDC->DeleteDC();

2.鐘的實現

??????????? ? CDC *pDC=GetDC();

????????????? CFont *oldfont;

????????????? double? h,m,s;

????????????? FormatTime(m,h,s);

????????????? //從當前時間里獲得時針,分針,秒針的角度h,m和s

????????????? CRect rect;

????????????? GetClientRect(&rect);

????????????? CPoint pt;//時鐘中心

????????????? pt.x=500;

????????????? pt.y=500;

?????????????

????????????? CBitmap bitmap;

????????????? CBitmap *oldbitmap;

????????????? bitmap.CreateCompatibleBitmap(pDC, rect.Width(),

???????????? ?rect.Height());

????????????? //生成空間的內存位圖

????????????? CDC me;

????????????? me.CreateCompatibleDC(pDC);//生成內存cd

????????????? oldbitmap=me.SelectObject(&bitmap);//載入背景位圖

?

????????????? CBrush *oldbrush,b(&p);

????????????? oldbrush=me.SelectObject(&b);

????????????? me.FillRect(rect,&b);//繪制背景

??????

????????????? me.SelectObject(oldbrush);

????????????? CPen *oldpen,pen(0,2,RGB(0,0,255));

????????????? oldpen=me.SelectObject(&pen);

????????????? CShape shap;

????????????? pt.x=400;

????????????? pt.y=300;

????????????? b.DeleteObject();

????????????? b.CreateSolidBrush(RGB(0,255,0));

????????????? oldbrush=me.SelectObject(&b);

????????????? me.SelectObject(oldbrush);

???????????? ?//畫分針,顏色為綠色漸變到黑色

????????????? shap.DrawDiamondGradient(&me,pt,190,40,m,RGB

??????????????(0,255,0),RGB(0,0,0),TOP_MIDDLE_BOTTOM,.8);

????????????? me.SetTextColor(RGB(0,255,0));

????????????? me.SetBkMode(TRANSPARENT);

????????????? CTime t=CTime::GetCurrentTime();

????????????? me.TextOut(370,220,t.Format("%H:%M:%S"));

????????????? //畫時針,?????????

???????????? ?shap.DrawDiamondGradient(&me,pt,120,35,h,RGB

????????????? (120,111,200),

????????????? RGB(0,0,0),TOP_MIDDLE_BOTTOM,.8);

?????????????? //畫秒針,顏色為綠色漸變到黑色

????????????? shap.DrawDiamondGradient(&me,pt,225,20,s,RGB

??????????????(255,0,0),

??????????????RGB(0,0,0),TOP_MIDDLE_BOTTOM,.7);

????????????? me.SelectObject(oldbrush);

??????????? ? //畫螺絲

????????????? shap.DrawPoint(&me,pt,RGB(0,0,255),6);

????????????? shap.DrawPoint(&me,pt,RGB(255,255,255),3);

????????????? static double angg=s;//外圍中文漢字旋轉角度

????????????? angg=angg+0.5;

????????????? shap.SetFontWide(50);//設置文字寬度和高度

????????????? shap.SwtFontHeight(60);

?????????????? /輸出非中文字符?? shap.DrawCircleABCText

??????????????(&me,pt,255,angg,"visualsan@yahoo.cn",RGB

??????????????(0,255,0),10,FONT_CLOCKWISE);

????????????? shap.SetFontWide(30);

????????????? shap.SwtFontHeight(40);

?????????????? //輸出中文字符

????????????? shap.DrawCircleChineseText(&me,pt,300,-angg,

????????????? "南京航空航天大學能源與動力學院",

????????????? RGB(0,0,255),10,FONT_CLOCKWISE);

????????????? me.SelectObject(oldbrush);

????????????? me.SelectObject(oldpen);

????????????? me.SetROP2(R2_WHITE);

??????????????pDC->BitBlt(0, 0, rect.Width(), rect.Height(),

?????????????& me, 0, 0, SRCCOPY);

??? ???? ???? me.SelectObject(oldbitmap);

??? ???? ???? bitmap.DeleteObject();

??? ???? ???? me.DeleteDC();

????????????? pDC->DeleteDC();

?????????????

實現總體效果如下:

總結:

??? CShape類可實現常規的幾何圖形的繪制和效果填充,但是能實現的幾何圖形的種類是有限的,但是可根據類似的原理添加不同的幾何圖形。填充效果也僅限于有限的幾種,前些天看到一個儀表程序的介紹,它所實現的玻璃效果特別好看,但是沒有源碼。我還不知道如何實現玻璃效果,還有待于研究。

在實現各種效果時,對于這些要定時刷新的函數來說,一定不能讓內存泄露,所以我在編寫每一個函數時特別注意。所以每實現一個效果,就一定要檢查一下也沒有內存泄露。到目前還未發現內存有泄露。祝大家學習進步!

?

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的一些常规形几何形状的绘制和效果填充(三)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。