李超
(鶴壁市機(jī)電信息工程學(xué)校,河南 鶴壁 458030)
基于MFC的繪畫板系統(tǒng)的研究
李超
(鶴壁市機(jī)電信息工程學(xué)校,河南 鶴壁 458030)
針對(duì)當(dāng)前繪畫板軟件的使用比較復(fù)雜的問題,本文針對(duì)初學(xué)者設(shè)計(jì)了繪畫板系統(tǒng)來滿足使用者的需求。首先對(duì)系統(tǒng)的功能和界面進(jìn)行了分析,對(duì)系統(tǒng)開發(fā)的軟硬件環(huán)境進(jìn)行了描述;其次對(duì)系統(tǒng)的部分模塊進(jìn)行了詳細(xì)的分析。本文對(duì)軟件開發(fā)初學(xué)者和一線教學(xué)工作者都具有積極的意義。
MFC;繪畫板;面向?qū)ο?/p>
隨著信息技術(shù)的飛速發(fā)展,人們的工作和生活領(lǐng)域與信息技術(shù)的結(jié)合越來越緊密,計(jì)算機(jī)在很多領(lǐng)域上開始淘汰傳統(tǒng)的手工勞作方式,利用計(jì)算機(jī)進(jìn)行繪畫制圖已經(jīng)成為一種時(shí)尚。繪圖板工具的普及為人們打開了一扇新的藝術(shù)大門,輔助人們更好地發(fā)揮藝術(shù)才能。繪圖最常用的軟件有金山畫王、我行我素、Photoshop和Painter等。雖然這些繪圖軟件功能強(qiáng)大,但是操作復(fù)雜,對(duì)于只需要對(duì)圖片做簡(jiǎn)單編輯或者繪制簡(jiǎn)單圖形的用戶來說,不可能花費(fèi)大量的時(shí)間來通過學(xué)習(xí)完成對(duì)這些復(fù)雜軟件的操作。因此,根據(jù)實(shí)際情況,開發(fā)簡(jiǎn)易繪畫板系統(tǒng),能夠滿足用戶的簡(jiǎn)單需求。
2.1 功能介紹
繪圖板系統(tǒng)的功能比較多,但結(jié)合當(dāng)前一般用戶的需求,主要有以下幾個(gè)功能:鉛筆、毛筆、縮放、噴槍、橡皮、畫刷、色板等。
在繪制圖圖形時(shí),主要利用鼠標(biāo)進(jìn)行操作,無論是畫線還是繪圖,采用先選中對(duì)應(yīng)的功能模塊,然后將鼠標(biāo)移至繪圖區(qū)域,按下鼠標(biāo)左鍵不放,同時(shí)按照所繪制圖形的軌跡移動(dòng)鼠標(biāo)。色板是根據(jù)RGB三原色的原理,在系統(tǒng)的界面上進(jìn)行調(diào)色,得到相應(yīng)的顏色,并將其應(yīng)用在對(duì)應(yīng)的工具(畫筆、噴槍、繪圖及畫刷等)上,豐富圖形的色彩。其功能結(jié)構(gòu)如圖1所示:
圖1 系統(tǒng)的功能結(jié)構(gòu)
2.2 界面分析
按照面向?qū)ο蟪绦蛟O(shè)計(jì)的思想,分析得出了系統(tǒng)所需的各種類,包括畫刷類、橢圓類、字體類、線形類、多邊形類、矩形類、直線類等,每一個(gè)類都存儲(chǔ)了用戶繪制圖形時(shí)所需存儲(chǔ)的信息。軟件的界面風(fēng)格力求簡(jiǎn)潔、操作簡(jiǎn)便、實(shí)用靈活的原則,每個(gè)功能模塊也就是主界面上的一個(gè)菜單項(xiàng)或者工具欄中的一項(xiàng)按鈕,這樣可以讓用戶感覺功能模塊比較清晰,使用起來比較方便。
界面介紹:
(1)縱向工具欄:用戶可以從中選擇繪圖工具;
(2)橫向工具欄:用戶可以從中選擇選型,線寬,畫刷種類;
(3)色板:用戶調(diào)色;
(4)圖形繪制區(qū)域:用戶繪圖操作區(qū)。
2.3 系統(tǒng)開發(fā)及運(yùn)行環(huán)境
(1)硬件環(huán)境
CPU:1.3GHZ或者更高;內(nèi)存:256MB以上;24位色彩分辨率及以上。
(2)軟件環(huán)境
操作系統(tǒng):Windows 2000,Windows Xp或者更高;開發(fā)環(huán)境:VC++6.0。
3.1 文字編輯功能模塊
顯示文本要使用CDC類的成員函數(shù)Wordedit,函數(shù)參數(shù)為:
BOOLWordedit(int x,int y,const CString zifu)
其中,x是待編輯的文本在編輯區(qū)中的水平位置;y是對(duì)應(yīng)的垂直位置;zifu是待編輯的內(nèi)容。
存儲(chǔ)字體的信息采用一個(gè)結(jié)構(gòu)體類型進(jìn)行描述,在WINDOWS中,結(jié)構(gòu)體名為TextMETRIC,獲得字體的具體信息通過以下函數(shù):
BOOL GetTextMetrics(LPTEXTMETRIC sjzt)
其中,參數(shù)sjzt是用戶定義的結(jié)構(gòu)體類型TEXTMETRIC的指針。在調(diào)用繪圖函數(shù)的過程中利用GetTextMetrics函數(shù)得到字體的結(jié)構(gòu)體信息。
另外,為了接收用戶輸入的字符,當(dāng)用戶按下非系統(tǒng)鍵時(shí)產(chǎn)生的消息,則會(huì)產(chǎn)生WM_CHAR消息,在消息結(jié)構(gòu)體tagMSG的成員wParam則保存了用戶所按鍵的ASCII碼。將獲取的鍵的ASCII碼存入對(duì)象數(shù)組,最后調(diào)用OnDraw()函數(shù)對(duì)獲取的文字信息作為一個(gè)圖片繪制到編輯區(qū)中,具體代碼如下:
void CPaintView::OnFonts()
{
Draw_Style=DRAW_FONTS;國(guó)//用戶點(diǎn)擊了工具欄中的文字編輯按鈕
}
void CPaintView::OnChar(UINT nChar,UINT nRepCnt, UINT nFlags) //在畫板上寫字
{
if(Draw_Style==DRAW_FONTS)//文字編輯按鈕被選中
{
m_bFontSelect=true;
//CFont font;
CClientDC dc(this);
TEXTMETRIC tm;//創(chuàng)建TEXTMETRIC結(jié)構(gòu)變量存儲(chǔ)字體信息
dc.GetTextMetrics(&tm);//獲得字體信息
Out_Fonts+=nChar;
if(0x0d==nChar)//用戶敲擊回車鍵,0x0d為回車鍵的ASCII碼
{
CPaintDoc*pDoc=GetDocument(); CShape*pShape; pShape=new CFonts(m_ptFontDian, Out_Fonts);
pDoc->AddShape(pShape);//添加到對(duì)象數(shù)組
Out_Fonts.Empty();
m_ptFontDian.y+=tm.tmHeight;
}
CSize sz=dc.GetTextExtent(Out_Fonts); CDian pt;
pt.x=m_ptFontDian.x+sz.cx;
pt.y=m_ptFontDian.y;
SetCaretPos(pt);//設(shè)定光標(biāo)位置
dc.TextOut(m_ptFontDian.x,m_ptFontDian.y,
Out_Fonts);//輸出文字
CScrollView::OnChar(nChar,nRepCnt,nFlags);
}
}
繪制文字函數(shù)的代碼:
void CPaintView::DrawFonts(CDian dian)//繪制文字
{
CPaintDoc*pDoc=GetDocument();//獲取存儲(chǔ)的對(duì)象信息
CShape*pShape;
if(Draw_Style==DRAW_FONTS)
{
SetCaretPos(dian);//選擇光標(biāo)位置
m_ptFontDian=dian; ShowCaret(); //顯示光標(biāo)
}
if(true==m_bFontSelect && Draw_Style! = DRAW_FONTS)
{
pShape=new CFonts(m_ptFontDian,Out_Fonts); pDoc->AddShape(pShape); Out_Fonts="";
HideCaret(); //隱藏光標(biāo)
}
3.2 調(diào)色板模塊
作為調(diào)色的控件懸浮于用戶工作區(qū),通過創(chuàng)建CColor-Panel的對(duì)象m_pColorPanel,然后調(diào)用CcolorPanel的Create ()函數(shù)創(chuàng)建工具欄,用戶在色板區(qū)域通過滑動(dòng)紅、綠、藍(lán)下的滑塊,根據(jù)需要調(diào)整畫筆的RGB,將調(diào)好顏色的畫筆載入設(shè)備描述環(huán)境,隨后便能夠用該顏色的畫筆進(jìn)行繪圖了。
class CColorPanel:public Cdialog//色板繼承類
{
public:
CView*m_pView;
CColorPanel(CView*pView);
BOOL Create();//創(chuàng)建色板工具欄
COLORREF clrButn;
...........
}
創(chuàng)建色板工具欄:
m_pColorPanel->Create();//其 中 m_pColorPanel 為CcolorPanel類的對(duì)象
3.3 放大縮小功能設(shè)計(jì)
在VC6.0利用MFC進(jìn)行系統(tǒng)設(shè)計(jì),其中設(shè)備環(huán)境CDC中有兩個(gè)成員函數(shù)StretchBlt()和BitBlt(),可以通過改變函數(shù)的參數(shù)值來實(shí)現(xiàn)當(dāng)前視圖的縮放范圍,進(jìn)而對(duì)位圖進(jìn)行放大或縮小顯示,其核心代碼如下所示:
CDC*tpzj=GetDC(); CRect jxkh;
GetClientRect(&jxkh);
if(Draw_Style==HTQYIN)
tpzj->StretchBlt(- dian.x/len,- dian.y/len,jxkh.right*len, jxkh.bottom*len,tpzj,0,0,jxkh.right,jxkh.bottom,SRCCOPY);
//對(duì)選中的圖片進(jìn)行放大操作
if(Draw_Style==HTQYOUT)
tpzj->StretchBlt(- dian.x/len,- dian.y/len,jxkh.right/len, jxkh.bottom/len,tpzj,0,0,jxkh.right,jxkh.bottom,SRCCOPY);
/對(duì)選中的圖片進(jìn)行縮小操作
本文針對(duì)簡(jiǎn)易的繪圖板系統(tǒng)進(jìn)行研究,當(dāng)前社會(huì)上畫圖工具種類比較多,但是大部分使用起來需要專門的學(xué)習(xí)或培訓(xùn),極大地限制了使用者的積極性。簡(jiǎn)易的繪圖板系統(tǒng)無需專門的培訓(xùn)即可進(jìn)行操作。本文由于篇幅所限,只對(duì)關(guān)鍵部分的實(shí)現(xiàn)進(jìn)行了分析,希望為軟件開發(fā)初學(xué)者和教學(xué)工作者提供一些參考。
[1]David J.Kruglinski etc(希望圖書創(chuàng)作室).Visual C++6.0技術(shù)內(nèi)幕[M].北京:北京希望電子出版社,1999.
[2]李烜,周家紀(jì).設(shè)備場(chǎng)景(DC)在Windows GD I中的應(yīng)用[J].物探化探計(jì)算技術(shù),1998,20(1):76.
[3]Eugene Olafsen,Kenn Scribner,K.DavidWhite,et al.MFC Visual C++6編程技術(shù)內(nèi)幕(王建華,陳一飛,張煥生等譯)[M].北京:機(jī)械工業(yè)出版社,2000.
[4]孫永強(qiáng),陸波,楊麗昆.Framework程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2001.
[5]郭中華,連億東,伍馮潔,等.基于嵌入式的人臉圖像采集顯示系統(tǒng)的制作[J].電腦與電信,2015(7):32-34.
Research on the Drawing Board System Based on MFC
Li Chao
(Hebi Mechanical and Electrical Information Engineering School,Hebi 458030,Henan)
In view of the complex problems in the current drawing board software,this paper designs a drawing board system for beginners.At first,the function and the interface of the system are analyzed,and the software and hardware environment of the system is described.Then,some modules of the system are analyzed in detail.This article has the positive significance to the software development beginners and the first teaching staff.
MFC;drawing board;object-oriented
TP391.41
A
1008-6609(2016)07-0092-03
李超,男,河南信陽(yáng)人,本科,講師,研究方向:計(jì)算機(jī)科學(xué)與技術(shù)。