版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 簡單畫圖程序</b></p><p><b> 1 基本功能描述</b></p><p> 1) 在單文檔菜單中,在菜單行中可插入一個菜單項(xiàng),命名為繪圖,在下拉菜單中可分別設(shè)置繪制的圖形形狀,如直線、矩形及橢圓,隨手畫選項(xiàng),有1-5可供選擇,按默認(rèn)的畫筆,畫刷來繪制選擇的圖形。</p><p&
2、gt; 2) 選擇好圖形后,通過鼠標(biāo)可以繪制出相應(yīng)的直線,矩形或橢圓,鼠標(biāo)的按下確定圖形的起點(diǎn),鼠標(biāo)的拖動則確定了圖形的終點(diǎn),即通過鼠標(biāo)的拖動來決定圖形的大小,當(dāng)鼠標(biāo)彈起,此圖形則繪制完畢。</p><p><b> 2 設(shè)計思路</b></p><p> 1) 對需要用到的變量進(jìn)行初始化。</p><p> 2) 選擇相應(yīng)的圖形之后就
3、響應(yīng)相應(yīng)的消息處理函數(shù)。選擇不同的線寬,即可改變畫筆的屬性。</p><p> 3) 鼠標(biāo)的按下響應(yīng)函數(shù)OnLButtonDown(),捕捉鼠標(biāo)當(dāng)前位置得到起點(diǎn)的坐標(biāo),鼠標(biāo)的拖動響函數(shù)OnMouseMove()改變終點(diǎn)的坐標(biāo),鼠標(biāo)的彈起響應(yīng)OnLButtonUp(),確定終點(diǎn)坐標(biāo),刷新,得到繪制圖形。</p><p> 4) 選擇圖形或其它屬性,可進(jìn)行下一次繪制。</p>
4、<p><b> 3 軟件設(shè)計</b></p><p><b> 3.1 設(shè)計步驟</b></p><p><b> 1)創(chuàng)建單文檔</b></p><p> 創(chuàng)建一個MFC AppWizard[exe]工程,命名為“draw”,,并創(chuàng)建單文檔。創(chuàng)建成功后,系統(tǒng)自動生成相應(yīng)的類。&
5、lt;/p><p><b> 編輯菜單</b></p><p> 添加需要的菜單項(xiàng),并在菜單的屬性中設(shè)定好所對應(yīng)的ID,(其中線寬菜單為彈出菜單,只需在菜單項(xiàng)目屬性中的彈出選項(xiàng)前打勾即可,分隔線亦只需在菜單項(xiàng)目屬性中選中分隔符選項(xiàng)即可)。</p><p> 建立類向?qū)?,在視圖類CdrawView中,對各菜單項(xiàng)添加對應(yīng)的COMMAND消息處理函
6、數(shù),部分菜單項(xiàng)還添加對應(yīng)的UPDATE_COMMAND_UI消息函數(shù),。</p><p><b> 建立類向?qū)?lt;/b></p><p> 在插入處選擇資源,新建工具欄, </p><p> 在工具欄上添加相應(yīng)的按鈕,在屬性處更改其ID, </p><p> 4)在相應(yīng)消息函數(shù)處添加代碼,實(shí)現(xiàn)其功能</p&g
7、t;<p> 建立類向?qū)?,在視圖類CdrawView中,添加WM_PAINT消息,以及WM_LBUTTONDOWN、WM_LBUTTONUP、WM_MOUSEMOVE消息,并在其中添加相應(yīng)的代碼。 </p><p> 3.3 關(guān)鍵功能實(shí)現(xiàn)</p><p> 1)選擇要繪制的圖形</p><p> 在直線、矩形以及橢圓的消息處理函數(shù)里為shape
8、分別賦值為1,2,3,在OnPaint()函數(shù)里添加3個if語句的代碼來這實(shí)現(xiàn)這三個圖形的繪制:當(dāng)選擇畫直線時,shape=1,則執(zhí)行繪制直線代碼,當(dāng)選擇畫矩形時,shape =2,則執(zhí)行繪制矩形的代碼,當(dāng)性選擇畫橢圓時,shape=3,則執(zhí)行繪制橢圓的代碼。</p><p><b> 5)繪制圖形</b></p><p> 鼠標(biāo)左鍵按下,則捕獲鼠標(biāo)此時的位置坐標(biāo)
9、為畫圖的起點(diǎn),此時在OnLButtonDown()函數(shù)里,將捕獲的坐標(biāo)值賦給定義作為起點(diǎn)的變量opoint;按下鼠標(biāo)左鍵拖動鼠標(biāo)時,捕捉鼠標(biāo)當(dāng)前位置坐標(biāo)值為終點(diǎn)坐標(biāo)值,此時在OnMouseMove()函數(shù)里,把捕獲的坐標(biāo)值賦給定義作為終點(diǎn)的變量cpoint,OnPaint()中繪圖的代碼中的坐標(biāo)都得到了,進(jìn)行繪圖;鼠標(biāo)左鍵彈起時,此時繪圖結(jié)束,鼠標(biāo)彈起時所在位置就是畫圖的最終終點(diǎn)位置,畫圖結(jié)束后,刷新窗口,以便重新畫圖,此時執(zhí)行的是On
10、LButtonUp()函數(shù)。</p><p><b> 4 結(jié)論與心得體會</b></p><p> 這次課程設(shè)計我成功的完成了。通過本次課程設(shè)計,我完成了用移動鼠標(biāo)對直線,矩形,橢圓的簡單繪制工具的的制作,其中完成了繪圖形狀的選擇的設(shè)置。</p><p> 基于平時課外上機(jī)實(shí)驗(yàn)的練習(xí),對菜單的創(chuàng)建,COMMAND消息處理函數(shù)和 UPDA
11、TE_COMMAND_UI消息函數(shù)的添加過程比較熟練,這部分還算簡單。難的是代碼的添加,對繪制圖形的程序有大概的思路,但具體編寫時變量的運(yùn)用以及函數(shù)的調(diào)用設(shè)置。這次實(shí)驗(yàn)中關(guān)鍵就是確定畫圖起點(diǎn)及終點(diǎn)坐標(biāo),因?yàn)槭怯檬髽?biāo)繪制圖形,所以需用函數(shù)來捕獲鼠標(biāo)當(dāng)前所在位置的坐標(biāo),因此我設(shè)置了OnLButtonDown()函數(shù)來捕獲起點(diǎn)坐標(biāo),OnMouseMove()函數(shù)來捕獲鼠標(biāo)移動是的當(dāng)前位置坐標(biāo),OnLButtonUp()函數(shù)來捕獲終點(diǎn)坐標(biāo)。而繪
12、制圖形使用的函數(shù)是OnPaint(),將圖形的起點(diǎn)和終點(diǎn)坐標(biāo)和鼠標(biāo)的位置坐標(biāo)相聯(lián)系后就能用鼠標(biāo)來繪制圖形了,所以在它們之間用opoint和cpoint兩變量實(shí)現(xiàn)鏈接。另外我覺得將繪圖語句集中在OnPaint()函數(shù)中,然后其他函數(shù)來調(diào)用OnPaint()函數(shù),這樣不容易引起混亂,同時程序更簡單,更有條理,便于修改。</p><p> 這次課程設(shè)計雖只是做了一個極其簡單的繪圖工具的制作,但也讓我從設(shè)計者的角度看到
13、了設(shè)計程序以及電腦軟件工具的實(shí)質(zhì)及難度,看似一個很簡單的工具,其制作的背后工作是很大的,不光是圖標(biāo),按鈕的設(shè)置,程序的編寫,代碼的實(shí)現(xiàn)都是很精密且不容許一點(diǎn)錯誤的工作。平時我們使用的很順手的一個小小工具,其開發(fā)的各項(xiàng)小號都不可小覷,由此,我們需要學(xué)的東西還太多太多。</p><p><b> 5. 參考文獻(xiàn)</b></p><p><b> Csdn 朱
14、志強(qiáng)</b></p><p><b> 6 測試結(jié)果</b></p><p> 1)點(diǎn)擊鏈接,編譯,運(yùn)行后的窗口所示。</p><p><b> 7 主要代碼</b></p><p> // DrawView.cpp : implementation of the CDraw
15、View class</p><p><b> //</b></p><p> #include "stdafx.h"</p><p> #include "Draw.h"</p><p> #include "DrawDoc.h"</p>
16、<p> #include "DrawView.h"</p><p> #ifdef _DEBUG</p><p> #define new DEBUG_NEW</p><p> #undef THIS_FILE</p><p> static char THIS_FILE[] = __FILE__;
17、</p><p><b> #endif</b></p><p> /////////////////////////////////////////////////////////////////////////////</p><p> // CDrawView</p><p> IMPLEMENT_DYNC
18、REATE(CDrawView, CView)</p><p> BEGIN_MESSAGE_MAP(CDrawView, CView)</p><p> //{{AFX_MSG_MAP(CDrawView)</p><p> ON_COMMAND(ID_DRAW_ELLIPSE, OnDrawEllipse)</p><p> ON
19、_COMMAND(ID_DRAW_RECTANGLE, OnDrawRectangle)</p><p> ON_COMMAND(ID_DRAW_SKETCH, OnDrawSketch)</p><p> ON_WM_LBUTTONDOWN()</p><p> ON_WM_LBUTTONUP()</p><p> ON_WM_MO
20、USEMOVE()</p><p> ON_UPDATE_COMMAND_UI(ID_DRAW_ELLIPSE, OnUpdateDrawEllipse)</p><p> ON_UPDATE_COMMAND_UI(ID_DRAW_RECTANGLE, OnUpdateDrawRectangle)</p><p> ON_UPDATE_COMMAND_UI(I
21、D_DRAW_SKETCH, OnUpdateDrawSketch)</p><p> //}}AFX_MSG_MAP</p><p> // Standard printing commands</p><p> ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)</p><p> ON_CO
22、MMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)</p><p> ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)</p><p> END_MESSAGE_MAP()</p><p> ///////////////////////////
23、//////////////////////////////////////////////////</p><p> // CDrawView construction/destruction</p><p> CDrawView::CDrawView()</p><p><b> {</b></p><p>
24、 // TODO: add construction code here</p><p> CDrawApp theApp;</p><p> /////////////////////////////////////////////////////////////////////////////</p><p> // CDrawApp initializa
25、tion</p><p> BOOL CDrawApp::InitInstance()</p><p><b> {</b></p><p> AfxEnableControlContainer();</p><p> // Standard initialization</p><p>
26、 // If you are not using these features and wish to reduce the size</p><p> // of your final executable, you should remove from the following</p><p> // the specific initialization routines
27、 you do not need.</p><p> #ifdef _AFXDLL</p><p> Enable3dControls();// Call this when using MFC in a shared DLL</p><p><b> #else</b></p><p> Enable3d
28、ControlsStatic();// Call this when linking to MFC statically</p><p><b> #endif</b></p><p> // Change the registry key under which our settings are stored.</p><p> //
29、 TODO: You should modify this string to be something appropriate</p><p> // such as the name of your company or organization.</p><p> SetRegistryKey(_T("Local AppWizard-Generated Applicat
30、ions"));</p><p> LoadStdProfileSettings(); // Load standard INI file options (including MRU)</p><p> // Register the application's document templates. Document templates</p>
31、<p> // serve as the connection between documents, frame windows and views.</p><p> CSingleDocTemplate* pDocTemplate;</p><p> pDocTemplate = new CSingleDocTemplate(</p><p>
32、 IDR_MAINFRAME,</p><p> RUNTIME_CLASS(CDrawDoc),</p><p> RUNTIME_CLASS(CMainFrame), // main SDI frame window</p><p> RUNTIME_CLASS(CDrawView));</p><p> AddDo
33、cTemplate(pDocTemplate);</p><p> // Parse command line for standard shell commands, DDE, file open</p><p> CCommandLineInfo cmdInfo;</p><p> ParseCommandLine(cmdInfo);</p>
34、<p> // Dispatch commands specified on the command line</p><p> if (!ProcessShellCommand(cmdInfo))</p><p> return FALSE;</p><p> // The one and only window has been initia
35、lized, so show and update it.</p><p> m_pMainWnd->ShowWindow(SW_SHOW);</p><p> m_pMainWnd->UpdateWindow();</p><p> return TRUE;</p><p><b> }</b>&l
36、t;/p><p> /////////////////////////////////////////////////////////////////////////////</p><p> // CAboutDlg dialog used for App About</p><p> class CAboutDlg : public CDialog</p
37、><p><b> {</b></p><p><b> public:</b></p><p> CAboutDlg();</p><p> // Dialog Data</p><p> //{{AFX_DATA(CAboutDlg)</p><
38、p> enum { IDD = IDD_ABOUTBOX };</p><p> //}}AFX_DATA</p><p> // ClassWizard generated virtual function overrides</p><p> //{{AFX_VIRTUAL(CAboutDlg)</p><p> prot
39、ected:</p><p> virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support</p><p> //}}AFX_VIRTUAL</p><p> // Implementation</p><p> protected:</p>
40、<p> //{{AFX_MSG(CAboutDlg)</p><p> // No message handlers</p><p> //}}AFX_MSG</p><p> DECLARE_MESSAGE_MAP()</p><p><b> };</b></p><p&
41、gt; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)</p><p><b> {</b></p><p> //{{AFX_DATA_INIT(CAboutDlg)</p><p> //}}AFX_DATA_INIT</p><p><b> }
42、</b></p><p> void CAboutDlg::DoDataExchange(CDataExchange* pDX)</p><p><b> {</b></p><p> CDialog::DoDataExchange(pDX);</p><p> //{{AFX_DATA_MAP(CA
43、boutDlg)</p><p> //}}AFX_DATA_MAP</p><p><b> }</b></p><p> BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)</p><p> //{{AFX_MSG_MAP(CAboutDlg)</p><p>
44、 // No message handlers</p><p> //}}AFX_MSG_MAP</p><p> END_MESSAGE_MAP()</p><p> // App command to run the dialog</p><p> void CDrawApp::OnAppAbout()</p>&
45、lt;p><b> {</b></p><p> CAboutDlg aboutDlg;</p><p> aboutDlg.DoModal();</p><p><b> }</b></p><p> ////////////////////////////////////////
46、/////////////////////////////////////</p><p> // CDrawApp message handlers</p><p> // DrawDoc.cpp : implementation of the CDrawDoc class</p><p><b> //</b></p>
47、<p> #include "stdafx.h"</p><p> #include "Draw.h"</p><p> #include "DrawDoc.h"</p><p> #ifdef _DEBUG</p><p> #define new DEBUG_
48、NEW</p><p> #undef THIS_FILE</p><p> static char THIS_FILE[] = __FILE__;</p><p><b> #endif</b></p><p> /////////////////////////////////////////////////
49、////////////////////////////</p><p> // CDrawDoc</p><p> IMPLEMENT_DYNCREATE(CDrawDoc, CDocument)</p><p> BEGIN_MESSAGE_MAP(CDrawDoc, CDocument)</p><p> //{{AFX_MSG
50、_MAP(CDrawDoc)</p><p> // NOTE - the ClassWizard will add and remove mapping macros here.</p><p> // DO NOT EDIT what you see in these blocks of generated code!</p><p> //}}AF
51、X_MSG_MAP</p><p> END_MESSAGE_MAP()</p><p> /////////////////////////////////////////////////////////////////////////////</p><p> // CDrawDoc construction/destruction</p>
52、<p> CDrawDoc::CDrawDoc()</p><p><b> {</b></p><p> // TODO: add one-time construction code here</p><p><b> }</b></p><p> CDrawDoc::~CD
53、rawDoc()</p><p><b> {</b></p><p><b> }</b></p><p> BOOL CDrawDoc::OnNewDocument()</p><p><b> {</b></p><p> if (!CD
54、ocument::OnNewDocument())</p><p> return FALSE;</p><p> // TODO: add reinitialization code here</p><p> // (SDI documents will reuse this document)</p><p> return T
55、RUE;</p><p><b> }</b></p><p> /////////////////////////////////////////////////////////////////////////////</p><p> // CDrawDoc serialization</p><p> vo
56、id CDrawDoc::Serialize(CArchive& ar)</p><p><b> {</b></p><p> if (ar.IsStoring())</p><p><b> {</b></p><p> // TODO: add storing code her
57、e</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> // TODO: add loading code here</p><p><b> }&
58、lt;/b></p><p><b> }</b></p><p> /////////////////////////////////////////////////////////////////////////////</p><p> // CDrawDoc diagnostics</p><p>
59、 #ifdef _DEBUG</p><p> void CDrawDoc::AssertValid() const</p><p><b> {</b></p><p> CDocument::AssertValid();</p><p><b> }</b></p><
60、;p> void CDrawDoc::Dump(CDumpContext& dc) const</p><p><b> {</b></p><p> CDocument::Dump(dc);</p><p><b> }</b></p><p> #endif //_DEB
61、UG</p><p> /////////////////////////////////////////////////////////////////////////////</p><p> // CDrawDoc commands</p><p> // MainFrm.cpp : implementation of the CMainFrame cl
62、ass</p><p><b> //</b></p><p> #include "stdafx.h"</p><p> #include "Draw.h"</p><p> #include "MainFrm.h"</p><p&
63、gt; #ifdef _DEBUG</p><p> #define new DEBUG_NEW</p><p> #undef THIS_FILE</p><p> static char THIS_FILE[] = __FILE__;</p><p><b> #endif</b></p>&
64、lt;p> /////////////////////////////////////////////////////////////////////////////</p><p> // CMainFrame</p><p> IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)</p><p> BEGIN_MES
65、SAGE_MAP(CMainFrame, CFrameWnd)</p><p> //{{AFX_MSG_MAP(CMainFrame)</p><p> // NOTE - the ClassWizard will add and remove mapping macros here.</p><p> // DO NOT EDIT what you
66、see in these blocks of generated code !</p><p> ON_WM_CREATE()</p><p> //}}AFX_MSG_MAP</p><p> END_MESSAGE_MAP()</p><p> static UINT indicators[] =</p><p
67、><b> {</b></p><p> ID_SEPARATOR, // status line indicator</p><p> ID_INDICATOR_CAPS,</p><p> ID_INDICATOR_NUM,</p><p> ID_INDICATOR_SCRL,&
68、lt;/p><p><b> };</b></p><p> /////////////////////////////////////////////////////////////////////////////</p><p> // CMainFrame construction/destruction</p><
69、p> CMainFrame::CMainFrame()</p><p><b> {</b></p><p> // TODO: add member initialization code here</p><p><b> }</b></p><p> CMainFrame::~
70、CMainFrame()</p><p><b> {</b></p><p><b> }</b></p><p> int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)</p><p><b> {</b>&
71、lt;/p><p> if (CFrameWnd::OnCreate(lpCreateStruct) == -1)</p><p> return -1;</p><p> if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP</p><p
72、> | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||</p><p> !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))</p><p><b> {</b></p><p> TRACE0("Fail
73、ed to create toolbar\n");</p><p> return -1; // fail to create</p><p><b> }</b></p><p> if (!m_wndStatusBar.Create(this) ||</p><p> !m_wndStat
74、usBar.SetIndicators(indicators,</p><p> sizeof(indicators)/sizeof(UINT)))</p><p><b> {</b></p><p> TRACE0("Failed to create status bar\n");</p><p
75、> return -1; // fail to create</p><p><b> }</b></p><p> // TODO: Delete these three lines if you don't want the toolbar to</p><p> // be dockable</p&
76、gt;<p> m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);</p><p> EnableDocking(CBRS_ALIGN_ANY);</p><p> DockControlBar(&m_wndToolBar);</p><p><b> return 0;</b>
77、</p><p><b> }</b></p><p> BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)</p><p><b> {</b></p><p> if( !CFrameWnd::PreCreateWindow(cs
78、) )</p><p> return FALSE;</p><p> // TODO: Modify the Window class or styles here by modifying</p><p> // the CREATESTRUCT cs</p><p> return TRUE;</p><p
79、><b> }</b></p><p> /////////////////////////////////////////////////////////////////////////////</p><p> // CMainFrame diagnostics</p><p> #ifdef _DEBUG</p>
80、<p> void CMainFrame::AssertValid() const</p><p><b> {</b></p><p> CFrameWnd::AssertValid();</p><p><b> }</b></p><p> void CMainFram
81、e::Dump(CDumpContext& dc) const</p><p><b> {</b></p><p> CFrameWnd::Dump(dc);</p><p><b> }</b></p><p> #endif //_DEBUG</p><p&
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 簡單畫圖程序課程設(shè)計報告
- 簡單畫圖程序課程設(shè)計
- 簡單畫圖程序-課程設(shè)計
- 畫圖板課程設(shè)計報告
- java畫圖板課程設(shè)計報告
- java畫圖板課程設(shè)計報告
- java課程設(shè)計--簡單的網(wǎng)絡(luò)聊天程序
- 操作系統(tǒng)課程設(shè)計--簡單的聊天程序
- 操作系統(tǒng)課程設(shè)計--簡單的聊天程序
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計——簡單行編輯程序
- java課程設(shè)計--簡單記事本程序的設(shè)計
- 簡單計算器課程設(shè)計報告
- 程序設(shè)計課程設(shè)計報告
- 程序設(shè)計課程設(shè)計報告
- 簡單頻率計課程設(shè)計報告
- 簡單計算器課程設(shè)計報告
- 簡單投票管理系統(tǒng)課程設(shè)計報告
- 課程設(shè)計一個簡單的網(wǎng)絡(luò)聊天程序
- 算術(shù)測試程序課程設(shè)計報告
- 面向?qū)ο蟪绦蛘n程設(shè)計報告
評論
0/150
提交評論