MFC單文檔應(yīng)用程序基礎(chǔ)訓(xùn)練——文本輸出、繪圖_第1頁
MFC單文檔應(yīng)用程序基礎(chǔ)訓(xùn)練——文本輸出、繪圖_第2頁
MFC單文檔應(yīng)用程序基礎(chǔ)訓(xùn)練——文本輸出、繪圖_第3頁
MFC單文檔應(yīng)用程序基礎(chǔ)訓(xùn)練——文本輸出、繪圖_第4頁
MFC單文檔應(yīng)用程序基礎(chǔ)訓(xùn)練——文本輸出、繪圖_第5頁
已閱讀5頁,還剩14頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、MFC單文檔基礎(chǔ)訓(xùn)練文本輸出、繪圖等1. 一個簡單的單文檔應(yīng)用程序文件->新建項目->MFC應(yīng)用程序 ,出現(xiàn)窗口按“下一步”,出現(xiàn)下面窗口 選擇單文檔 點 "調(diào)試>運行",最后運行界面為下圖:一個簡單的單文檔應(yīng)用程序向?qū)ё詣咏⑽鍌€類:向?qū)ё詣咏⒌念愊鄳?yīng)源文件其他源文件相應(yīng)頭文件其他頭文件CAboutDlgStdAfx.cppStdAfx.hCXxxAppXxx.cppXxx.rcXxx.hResource.hCXxxViewXxxView.cppXxxView.hCXxxDocXxxDoc.cppXxxDoc.hCMainFrameMainFrame.

2、cppMainFrame.h視(View)顯示用戶程序的數(shù)據(jù)及處理用戶與文檔的交互文檔對象永久存儲(磁盤文件)MainFrame框架窗口文檔視結(jié)構(gòu)每個類的主要函數(shù):void CAboutDlg:DoDataExchange(CDataExchange* pDX)int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)/創(chuàng)建窗體的工具欄,狀態(tài)欄等BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs)BOOL CXxxApp:InitInstance()void CXxxApp:OnAppAbo

3、ut()BOOL CXxxDoc:OnNewDocument()/初始化文檔字符數(shù)據(jù)、字體信息等void CXxxDoc:Serialize(CArchive& ar)BOOL CXxxView:PreCreateWindow(CREATESTRUCT& cs)void CXxxView:OnDraw(CDC* pDC) BOOL CXxxView:OnPreparePrinting(CPrintInfo* pInfo)/彈出打印對話框void CXxxView:OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo) void CXxxView

4、:OnEndPrinting(CDC* pDC, CPrintInfo* pInfo)CXxxDoc* CXxxView:GetDocument() / non-debug version is inline創(chuàng)建單文檔應(yīng)用程序的一般步驟:l 利用AppWizard創(chuàng)建應(yīng)用程序框架l 在文檔內(nèi)中聲明保存文檔數(shù)據(jù)所需要數(shù)據(jù)對象l 完成文檔類的OnNewDocument函數(shù),初始化新文檔l 完成文檔類的Serialize函數(shù),保持和加載文檔數(shù)據(jù)l 完成視類的OnInitialUpdate函數(shù),初始化顯示l 完成視類的OnDraw函數(shù),顯示當前文檔內(nèi)容l 在視類中加入可以使用戶編輯文檔數(shù)據(jù)所需的代碼2

5、.簡單文本和圖形輸出建立一個簡單的單文檔應(yīng)用程序SimpleTextPicture,通過修改OnDraw函數(shù)在視(View)中輸出信息或畫圖。找到函數(shù)OnDraw(CDC* /*pDC*/),改為OnDraw(CDC* pDC);OnDraw函數(shù)在SimpleTextPicture.cpp文件中,專門用于輸出信息或畫圖。負責(zé)視圖顯示功能(包括打印、顯示、預(yù)覽等)例21 顯示正方形和文本void CSimpleTextPictureView:OnDraw(CDC* pDC)CSimpleTextPictureDoc* pDoc = GetDocument();ASSERT_VALID(pDoc)

6、;/ TODO: add draw code for native data herepDC->TextOut(10,120,_T("Hello World!");pDC->Rectangle(20,20,100,100);在AppWizard生成的OnDraw函數(shù)中加入以黑體字給出的兩行代碼,運行程序,顯示如下:例22顯示彩色圖形和文本void CSimpleTextPictureView:OnDraw(CDC* pDC)CSimpleTextPictureDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO:

7、 add draw code for native data hereCPen pen;CBrush brush;pen.CreatePen(PS_SOLID, 3, RGB(250,0,0);brush.CreateSolidBrush(RGB(0,250,0);pDC->SelectObject(pen);pDC->SelectObject(brush);pDC->Ellipse(100,200,300,300);DeleteObject(pen);DeleteObject(brush);CString str(_T("Hello World!");

8、/用UNICODE編碼pDC->SetTextColor(RGB(0,0,250);pDC->TextOut(120,150,str);pDC->SetTextColor(RGB(125,125,125);double a=31.4,888.54;char ch10;CString str1;str1.Format(_T("%f"),a0);pDC->TextOut(20,40,str1);str1.Format(_T("%f"),a1);pDC->TextOut(20,60,str1);3.滾動字幕創(chuàng)建一個簡單的單文檔應(yīng)用

9、程序Xxx2; 1 在Xxx2View.h中添加代碼如下:public:virtual CXxx2View();#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endifprotected:private:int n;/定義變量2 在CXxx2View構(gòu)造函數(shù)中初始化變量nCXxx2View:CXxx2View()/ TODO: add construction code heren=0;3 在Xxx2View.cpp文件中修改OnDraw函數(shù):void C

10、Xxx2View:OnDraw(CDC* pDC)CXxx2Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc);if (!pDoc)return;pDC->SetTextColor(RGB(0,0,235);pDC->SetBkMode(TRANSPARENT);CFont font;font.CreateFont(28,15,0,0,FW_NORMAL,false,false,false,DEFAULT_CHARSET,OUT_DEVICE_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT

11、_PITCH,_T("隸書");pDC->SelectObject(&font);pDC->TextOut(n,100,_T("世上無難事,只要肯登攀!");n=n+20;RECT r;GetClientRect(&r); /獲得窗口if(n>r.right-r.left)/窗口如果n> 右坐標減去左坐標n=0; 4添加三條消息映射,并加入相應(yīng)代碼。通過菜單命令:視圖/類視圖,找到CXxx2View類,在CXxx2View類上點擊“右鍵->屬性”,找到消息按扭,如下圖: 點擊 void CXxx2View:O

12、nLButtonDblClk(UINT nFlags, CPoint point) /鼠標左雙擊函數(shù)/ TODO: Add your message handler code here and/or call defaultSetTimer(1,500,NULL);CView:OnLButtonDblClk(nFlags, point);void CXxx2View:OnRButtonDblClk(UINT nFlags, CPoint point) /鼠標右雙擊函數(shù)/ TODO: Add your message handler code here and/or call defaultKi

13、llTimer(1);CView:OnRButtonDblClk(nFlags, point);void CXxx2View:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call defaultInvalidate(); /擦除背景,重新繪制CView:OnTimer(nIDEvent);5添加菜單控制與代理點擊視圖->資源視圖,如下圖,雙擊IDR_MAINFRAME,進入菜單編輯。在資源Menu中添加運行子菜單:啟動(IDC_MOVE)和停止(IDC_STOP)及其消息映射(右鍵-&g

14、t;添加事件處理程序)。改為OnMove下為“啟動”對應(yīng)的消息映射:改為OnMove并修改代碼:void CXxx2View:OnMove() /啟動對應(yīng)消息/ TODO: Add your command handler code hereSetTimer(1,300,NULL);void CXxx2View:OnStop() /停止對應(yīng)的消息/ TODO: Add your command handler code hereKillTimer(1);4.使用計算數(shù)據(jù)畫直方圖1 使用AppWixard生成單文檔工程Plot2 在PlotDoc.h中類 CPlotDoc的定義之前加入類Max的

15、定義:class Maxdouble x1,x2,x3,x4;double Max2(double,double);public:Max(double,double,double,double);double Max4();3 在PlotDoc.cpp的文件尾部加入類Max的實現(xiàn)部分:/ CPlotDoc commandsdouble Max:Max2(double a, double b)if(a>=b) return a;else return b;Max:Max(double a, double b, double c, double d)x1=a;x2=b;x3=c;x4=d;d

16、ouble Max:Max4()return Max2(Max2(x1,x2),Max2(x3,x4);4 為CPlotDoc類增加一個公有的void類型的成員函數(shù)Find和一個公有int數(shù)據(jù)成員數(shù)組m_num5,使用類產(chǎn)生對象并計算它們的最大值,將它們轉(zhuǎn)換成int,存入整數(shù)數(shù)組m_num。void CPlotDoc:Find()Max a(110.5, 120.8, 110, 68);Max b(130, 256.5, 90, 200);Max c(125, 406.8, 350, 330);Max d(120, 356.8, 300, 280.5);Max e(102, 256.8, 12

17、0, 105);m_num0 = (int) a. Max4();m_num1 = (int) b. Max4();m_num2 = (int) c. Max4();m_num3 = (int) d. Max4();m_num4 = (int) e. Max4();5 為CPlotDoc類的成員函數(shù)OnNewDocument增加調(diào)用語句準備數(shù)據(jù)。BOOL CPlotDoc:OnNewDocument()if (!CDocument:OnNewDocument()return FALSE;/ TODO: add reinitialization code here/ (SDI documents

18、 will reuse this document)Find();/增加的語句return TRUE;6 在視類中畫圖寫字void CPlotView:OnDraw(CDC* pDC)CPlotDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data herepDC->SetMapMode(MM_ISOTROPIC);pDC->SetViewportOrg(50,250);pDC->MoveTo(0,0);pDC->LineTo(1100,0);pDC->M

19、oveTo(0,0);pDC->LineTo(0,600);int width = 40;int ch = 'A' CString str1;CBrush brush;brush.CreateSolidBrush(RGB(50, 250,0);pDC->SelectObject(brush);for(int i = 1; i<6; i+, ch+)pDC->Rectangle(200*i, 0, 200*i+width, pDoc->m_numi-1); str1.Format(_T("%c"),ch); /整型以字符格式賦給s

20、tr1 pDC->TextOut(200*i+10,-10, str1); /輸出ABCDECFont font;font.CreateFont(0,0,0,0,800,0,0,0,OEM_CHARSET, OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,_T("楷體"));pDC->SelectObject(&font);pDC->TextOut(200,550, _T("各公司銷售點水果月銷售量直方圖");7 運行程序,結(jié)果如下: 5.

21、 單文檔串行化編程之一SerialRect應(yīng)用程序串行化一個矩形數(shù)據(jù),用對話框修改數(shù)據(jù),用編輯/修改菜單打開對話框。2. 用AppWizard建立一個普通單文檔SerialRect工程,按下一步,直到出現(xiàn)下圖,將CSerialRectView的基類設(shè)為CFormView。改為CFormView3. 初始界面如下:4. 在Form上添加控件5. 添加變量Edit1Edit4整型(m_x1, m_y1, m_x2, m_y2),取值范圍0300,Edit5為Control-CEdit型(m_Ctrl)6. 用右鍵選擇控件的Events修改Edit1的黙認EN_CHANGE消息處理OnChangeE

22、dit1為自定義的OnChangeEdit。其他三個Edit也映射到這個函數(shù)。7. 在Doc頭文件SerialRectDoc.h中添加變量:class CSerialRectDoc : public CDocumentprotected: / create from serialization onlyCSerialRectDoc();DECLARE_DYNCREATE(CSerialRectDoc)/ Attributespublic:int x1, y1, x2, y2;/ Operations6. 在SerialRectDoc.cpp的構(gòu)造函數(shù)中初始化變量:CSerialRectDoc:

23、CSerialRectDoc()/ TODO: add one-time construction code herex1=y1=x2=y2=0;7. SerialRectView.cpp中添加下面內(nèi)容:void CSerialRectView:OnChangeEdit() / TODO: Add your control notification handler code hereUpdateData();CSerialRectDoc* pDoc= GetDocument();if(m_x1!=pDoc-> x1) pDoc-> x1 =m_x1;if(m_y1!=pDoc-&g

24、t; y1) pDoc-> y1 =m_y1;if(m_x2!=pDoc-> x2) pDoc-> x2 =m_x2;if(m_y2!=pDoc-> y2) pDoc-> y2 =m_y2;Invalidate(true);void CSerialRectView:OnInitialUpdate()CFormView:OnInitialUpdate();GetParentFrame()->RecalcLayout();ResizeParentToFit();m_x1=GetDocument()->x1;m_x2=GetDocument()->x2

25、;m_y1=GetDocument()->y1;m_y2=GetDocument()->y2;UpdateData(false);8. 在SerialRectDoc.cpp的串行化代碼:void CSerialRectDoc:Serialize(CArchive& ar)if (ar.IsStoring()/ TODO: add storing code herear<<x1<<y1<<x2<<y2;else/ TODO: add loading code herear>>x1>>y1>>x

26、2>>y2;9. 為CSerialRectView類添加OnDraw函數(shù)在工作區(qū)類視圖中右鍵單擊CSerialRectView類,選擇Add Member Function彈出對話框:void CSerialRectView:OnDraw(CDC *pDC)m_Ctrl.UpdateWindow();pDC=m_Ctrl.GetWindowDC();pDC->Rectangle(m_x1,m_y1,m_x2,m_y2);UpdateData(false);6.單文檔串行化編程之二 SerialData應(yīng)用程序串行化日期結(jié)構(gòu)數(shù)據(jù),用對話框修改數(shù)據(jù),用編輯/修改菜單打開對話框。1

27、. 用AppWizard建立一個普通單文檔SerialDate工程2. 添加一個對話框資源如下:并為三個編輯框添加變量m_nYear, m_nMonth, m_nDay,3. 用ClassWizard添加類CDateDialog(其基類為CDialog)4. 在Doc頭文件SerialDateDoc.h中添加下面內(nèi)容:struct Dateint m_nYear;int m_nMonth;int m_nDay;#include "DateDialog.h"class CSerialDateDoc : public CDocumentprotected: / create from serialization onlyCSerialDateDoc();DECLARE_DYNCREATE(CSerialDateDoc)/ Attributespublic: Date date;4. 編輯菜單中添加子菜單項,ID_EDIT_MODIFY,消息映射到SerialDateDoc.cpp文件中的OnEditModify()函數(shù)5. 在SerialDateDoc.cpp中添加代碼CSerialDateDoc:CSerialDateD

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論