999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于MFC的OpenGL簡易繪圖系統(tǒng)

2022-05-30 10:48:04尤王杰
計算機應(yīng)用文摘 2022年7期

關(guān)鍵詞:MFC;OpenGL;繪圖系統(tǒng);C++面向?qū)ο?/p>

中圖法分類號:TP391 文獻標識碼:A

1概述

MFC 是微軟公司開發(fā)的一個類庫,以C++類的形式封裝了Windows 的API,并且包含一個應(yīng)用程序框架,以減少應(yīng)用程序開發(fā)人員的工作量。其中,MFC包含大量Windows 句柄封裝類和很多Windows 的內(nèi)建控件和組件的封裝類[1] 。

OpenGL 是一個開放式圖形庫,是用于渲染2D 和3D 矢量圖形的跨語言、跨平臺的應(yīng)用程序編程接口,是一個功能強大、支持底層繪制和造型能力的軟件圖形函數(shù)庫。它獨立于硬件和窗口系統(tǒng),為程序員進行圖形學相關(guān)的程序編寫提供了極大的幫助[2] 。

繪圖軟件一般指基于計算機繪制圖形的軟件,如Windows 自帶的畫圖軟件等。它的開發(fā)語言和技術(shù)已經(jīng)十分成熟。本系統(tǒng)實現(xiàn)了基于基本類庫MFC 和OpenGL 圖形庫面向?qū)ο蟮亩S圖形繪制應(yīng)用程序,可以實現(xiàn)繪圖的功能同時也可以讓軟件開發(fā)人員對軟件開發(fā)過程有進一步了解。

2軟件開發(fā)環(huán)境

軟件主要使用C++編程語言編寫,使用了C++的基本庫類MFC 和圖形庫OpenGL 以及C++常用庫;開發(fā)軟件的操作系統(tǒng)環(huán)境為Windows 10;軟件的集成開發(fā)環(huán)境為Viusal Studio 2017;軟件開發(fā)的硬件環(huán)境為16GB 內(nèi)存,intel Core i5?9400F CPU(2.9GHz);軟件支持跨平臺使用,可以在不同操作系統(tǒng)中實現(xiàn)功能,同時可以進行本地保存[3] 。

3系統(tǒng)框架設(shè)計

本系統(tǒng)采用了C++編程語言以及面向?qū)ο蟮木幊田L格,其基本思想是將現(xiàn)實世界的事物抽象成對象,現(xiàn)實世界中的關(guān)系抽象成類、繼承,幫助人們實現(xiàn)對現(xiàn)實世界的抽象與數(shù)字建模。通過面向?qū)ο蟮姆椒ǎ谟萌死斫獾姆绞綄?fù)雜系統(tǒng)進行分析、設(shè)計與編程。同時,面向?qū)ο竽苡行岣呔幊痰男剩ㄟ^封裝技術(shù),可以更高效地開發(fā)出一個全新的系統(tǒng)[4] 。本系統(tǒng)主要包含以下文件。

Drawing_system.h:應(yīng)用程序的主頭文件。其中,包括其他項目特定的標頭(包括Resource.h),并聲明Drawing_system 應(yīng)用程序類。

Drawing_system.cpp:包含應(yīng)用程序類CDrawing_system 的主應(yīng)用程序源文件。

MainFrm.h,MainFrm.cpp: 包含框架類CMainFrame,該類派生自CMDIFrameWnd 并控制所有MDI框架功能。

ChildFrm. h,ChildFrm. cpp: 定義并實現(xiàn)CChildFrame 類,該類支持MDI 應(yīng)用程序中的子窗口。

Drawing_systemDoc.h、Drawing_systemDoc.cpp:包含CGraphics_WorkDoc 類。編輯這些文件以添加特殊文檔數(shù)據(jù),并實現(xiàn)文件保存和加載(通過CGraphics_WorkDoc::Serialize)。

Drawing_SystemView.h、Drawing_systemView.cpp:包含CGraphics_WorkView 類。CGraphics_WorkView對象用于查看CGraphics_WorkDoc 對象。

LogDialog 類:實現(xiàn)了對話框的各種主要參數(shù)的設(shè)置,同時加入了消息處理機制,與其他模塊相互連接。

通過在以上文件中進行基礎(chǔ)類、全局變量、臨時對象的申明,再結(jié)合OpenGL 庫的函數(shù)調(diào)用,通過計算機圖形學的思想實現(xiàn)圖片的繪制:先由基礎(chǔ)的點、線、多邊形,加上色彩的渲染,將這些基本圖元最終組合成一個完整的圖形。同時,提供撤銷、恢復(fù)、清空等功能,讓用戶擁有更好的使用體驗,讓程序更加健壯。此外,在圖形繪制完成后,可以將繪制的圖形存儲成規(guī)定的模式,關(guān)閉軟件后在下一次打開時再進行進一步編輯[5~8] 。

4軟件的功能設(shè)計與實現(xiàn)

本系統(tǒng)的功能主要分為以下幾個模塊,即簡單圖元繪制、自由曲線繪制、橡皮擦、顏色選擇、清空、撤銷與恢復(fù)。

(1)簡單圖元繪制

在簡單圖元繪制模塊中運用OpenGL 庫相關(guān)的函數(shù)以及消息處理機制,實現(xiàn)一部分內(nèi)置基本圖元的繪制,如直線、三角形、矩形、圓形等。如圖1 所示,這些圖原是系統(tǒng)內(nèi)部自帶的圖形。每一種圖元可以使用一個容器進行保存。OpenGL 繪制簡單圖形結(jié)構(gòu)如下。

glBegin(GL_LINES);∥繪制直線

glVertex3f(0.0, 0.0, 0.0);

glVertex3f(1.0, 1.0, 0.0);

glEnd();

glBegin(GL_POLYGON);

glVertex3f(20.0, 10.0, 0.0);∥繪制多邊形

glVertex3f(60.0, 30.0, 0.0);

glVertex3f(70.0, 45.0, 0.0);

glVertex3f(40.0, 75.0, 0.0);

glVertex3f(10.0, 60.0, 0.0);

glEnd();

(2)自由曲線繪制

在自由曲線繪制模塊中使用C++標準庫中提供的vector 容器,將繪制的曲線分段用vector 保存,通過記錄鼠標當前在窗口上的位置返回坐標信息,最后通過OpenGL 庫中曲線繪制的函數(shù)繪制出一條自由曲線。曲線實際上就是無數(shù)點的連接,設(shè)置一個很小的計時器返回實時鼠標位置坐標,在這些坐標上畫點,就可以實現(xiàn)自由曲線的繪制。

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_

BUFFER_BIT);

∥ 繪制場景

glMatrixMode(GL_MODELVIEW);

glPushMatrix();

DrawPicture();

glPopMatrix();

∥ 交換緩沖區(qū)

SwapBuffers(wglGetCurrentDC());

int R=255, G=255, B=255;

vector FreeLine;

void Display() {

glColor3d(R ? 1.0 / 255, G ? 1.0 / 255, B ?

1.0 / 255);

glLineWidth(1);

glBegin(GL_LINE_STRIP);

for (int i=0; i < (int)FreeLine.size(); i++) {

glVertex2d(FreeLine[i].x, FreeLine[i].y);}

glEnd();

glFlush();

(3)橡皮擦

橡皮擦模塊可以用于刪除之前已經(jīng)繪制的圖形元素。橡皮擦的實現(xiàn)其實是自由曲線繪制的反向操作,由于之前繪制的圖形都已經(jīng)分別保存在各自的容器中,通過選取橡皮擦工具,在要擦除的地方移動鼠標,計算當前鼠標移動的曲線與之前已經(jīng)存在的圖形是否存在交集,如果存在交集,就在對應(yīng)的圖形容器中刪去該元素即可。其基本代碼如下。

vector EraserLine;

void Display() {

glLineWidth(6);

glBegin(GL_LINE_STRIP);

glColor3d(0, 0, 0);

for (int i=0; i < (int)EraserLine.size(); i++) {

glVertex2d(EraserLine[i].x, EraserLine[i].y);}

glEnd();

glFlush();

if (Case) {

return;}

mark_eraser.push_back(0);

mark_id[Stack_top] = (int) mark_eraser.size( )- 1;

Case=0; Draw_Operator[Stack_top++] =6;

InvalidateRect(NULL, FALSE);

(4)顏色選擇

顏色選擇模塊為用戶提供了一些系統(tǒng)自帶的常見顏色種類,如黑、白、紅、黃、藍、綠等。同時,也提供了用戶自由配置顏色的選項,即用戶可以自由選擇R,G,B 顏色分量的值,預(yù)覽生成的顏色效果來選擇自己喜歡的顏色進行繪制。其基本代碼如下。

MessageBox(_T(" 請選擇直線與點的顏色"),

_T("提示"));

COLORREF color=RGB(255, 0, 0);

CColorDialog colorDlg(color);

if (IDOK= =colorDlg.DoModal()) {∥ 獲取顏色

對話框中選擇的顏色值

color=colorDlg.GetColor();∥ 獲取R、G、B 分量

m_color.R=GetRValue(color);

m_color.G=GetGValue(color);

m_color.B=GetBValue(color);

(5)清空

清空模塊為用戶提供了直接清空畫板的功能,以實現(xiàn)初始化的功能。其實清空操作十分方便,由于之前所有畫過的圖形都被保存在了各自的容器中,所以要清空畫板,將各個容器中的元素全部清空即可,可以使用vector 的clear 函數(shù)來實現(xiàn)。由于清空功能有一定的危險性,所以還需要考慮將其撤銷。

(6)撤銷與恢復(fù)

撤銷是用于取消上一步的操作,我們可以通過將每一步操作都放在一個棧中,當使用撤銷功能時,彈出棧頂操作,并將其反向執(zhí)行來實現(xiàn)撤銷的功能。而恢復(fù)就是在撤銷的基礎(chǔ)上再取消,我們同樣可以使用一個棧來保存已經(jīng)撤銷的步驟,當執(zhí)行操作時,彈出棧頂再次執(zhí)行即可。有了撤銷和恢復(fù)功能,我們就可以避免一些誤操作帶來的不良后果,讓軟件更加健壯。

5結(jié)論

基于MFC 和OpenGL,運用了面向?qū)ο缶幊趟枷腴_發(fā)的簡易繪圖系統(tǒng),為用戶提供了簡單易操作的繪圖工具。運用計算機進行圖像的繪制,減小了時間以及空間的影響,使圖形更加精確,更加有利于對圖形數(shù)據(jù)的可視化分析。采用基于MFC 與OpenGL 以及現(xiàn)代化的軟件開發(fā)框架,降低了軟件對硬件和平臺的要求,能節(jié)省計算量和內(nèi)存,對比傳統(tǒng)的繪圖系統(tǒng),本系統(tǒng)具有程序體積小、運行速度快、對硬件要求低、具有較好的適應(yīng)性等優(yōu)點。同時,軟件的整體設(shè)計過程也能對軟件開發(fā)初學者提供一些幫助。

作者簡介:

尤王杰(2000—),本科,研究方向:計算機圖形學。

主站蜘蛛池模板: 国产无码高清视频不卡| 久久久久久高潮白浆| 日韩高清成人| 免费又黄又爽又猛大片午夜| 亚洲福利网址| 呦视频在线一区二区三区| 理论片一区| 色悠久久久久久久综合网伊人| 色AV色 综合网站| 亚洲欧洲天堂色AV| 中文字幕无码av专区久久| 国产成人无码播放| 成年人国产视频| 伊人色婷婷| 青青操国产视频| 91丝袜美腿高跟国产极品老师| 女人18毛片久久| 在线免费a视频| 亚洲二区视频| 欧洲成人免费视频| 欧美午夜网| 中文字幕首页系列人妻| 亚洲欧美综合另类图片小说区| 国产精品手机在线观看你懂的| 欧美另类精品一区二区三区| 欧美亚洲香蕉| jizz亚洲高清在线观看| 久久天天躁狠狠躁夜夜2020一| 亚洲国产成人精品青青草原| 国产第二十一页| 91精品国产综合久久香蕉922 | 综合色88| 狠狠v日韩v欧美v| 亚洲最大看欧美片网站地址| 欧美天天干| 夜夜爽免费视频| 超碰免费91| 成人福利在线观看| 国产精品亚洲专区一区| 亚洲精品无码抽插日韩| 毛片a级毛片免费观看免下载| 国产18页| 亚洲欧洲日韩久久狠狠爱| 国产主播福利在线观看| 国产美女在线观看| 国产精品色婷婷在线观看| 在线日韩一区二区| 国产乱人伦AV在线A| 久久 午夜福利 张柏芝| 色婷婷色丁香| 久久久久国产精品嫩草影院| 99国产精品国产| 亚洲综合久久一本伊一区| 91在线一9|永久视频在线| 国产一区二区三区视频| 二级毛片免费观看全程| 亚洲高清资源| 人妻免费无码不卡视频| 国产精品第三页在线看| 亚洲国产日韩视频观看| 91视频日本| 国产超薄肉色丝袜网站| 亚洲色欲色欲www在线观看| 狠狠久久综合伊人不卡| 香蕉久久国产超碰青草| 国产欧美在线观看视频| 久久国产热| 福利在线不卡一区| 亚洲天堂网站在线| 国内精品久久人妻无码大片高| 亚洲一区无码在线| 91av成人日本不卡三区| 亚洲swag精品自拍一区| 色欲国产一区二区日韩欧美| 人与鲁专区| 91九色国产在线| 亚洲中文字幕久久无码精品A| 色综合成人| 欧美在线黄| 久久久久国产精品嫩草影院| 日韩不卡高清视频| 2020最新国产精品视频|