




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
C++面向?qū)ο蟪绦蛟O(shè)計實驗報告姓名:班級:學(xué)號:實驗一,畫線在visualC++6.0里面文獻->新建->工程里面的MFCAppwizard[EXE]除了第二步選單文檔,基本上都是默認的。建一個文獻進行一下操作intm;CPointp1,p2;在構(gòu)造函數(shù)里面初使化mCZuoBiaoView::CZuoBiaoView(){//TODO:addconstructioncodeherem=0;}在資源文獻Menu中的IDR_MAINFRAME中添加消息句柄OnLButtonDown,OnLButtonUp,OnMouseMove.再回到ZuoBiaoView.cpp中編譯一下程序voidCZuoBiaoView::OnLButtonDown(UINTnFlags,CPointpoint){//TODO:Addyourmessagehandlercodehereand/orcalldefaultCClientDCdc(this);m=1;p1=point;CView::OnLButtonDown(nFlags,point);}voidCZuoBiaoView::OnLButtonUp(UINTnFlags,CPointpoint){//TODO:Addyourmessagehandlercodehereand/orcalldefaultp2=point;CClientDCdc(this);OnPrepareDC(&dc);dc.MoveTo(p1);dc.LineTo(p2);m=0;CView::OnLButtonUp(nFlags,point);}voidCZuoBiaoView::OnMouseMove(UINTnFlags,CPointpoint){//TO(shè)DO:Addyourmessagehandlercodehereand/orcalldefaultstaticintn=0;switch(++n){case1:p2=point;break;case2:p1=p2;p2=point;n=0;break;}CClientDCdc(this);OnPrepareDC(&dc);if(m==1){dc.MoveTo(p1);dc.LineTo(p2);}CView::OnMouseMove(nFlags,point);}實驗二,創(chuàng)建菜單用MFC創(chuàng)建菜單按鈕具體的制作過程:一方面,生成一個MFCAppWizardEXE工程生成一個以CButton為基類的新類,名為CMenuButton,然后用ClassWizard為其添加兩個成員函數(shù):DrawItem()和PreSubclassWidnow();手工為CMenuButton類添加BOOL類型m_bDrawFocusRect成員變量,用于決定是否在按鈕上畫焦點矩形,添加SetDrawFocusRect()函數(shù)用于設(shè)立這個標志,默認為畫焦點矩形;添加兩個枚舉類型的變量m_ArrowType和m_PopupPos,用于決定所畫的箭頭的類型和菜單彈出的位置。箭頭可為右箭頭、下箭頭、小右箭頭、小下箭頭、上箭頭和左箭頭;菜單的彈出位置可認為按鈕的左上角、右上角、左下角和右下角。最后手工添加兩個函數(shù),SetArrowType()和SetMenuPopupPos(),用于設(shè)立以上各種風(fēng)格,其默值分別為畫右箭頭和在左下角彈出。假如只需要菜單而不需要畫箭頭,只需置空BS_OWNERDRAW標志位即可,添加一個SetStyle()函數(shù),用于設(shè)立是畫箭頭還是顯示文本,其默認值是畫箭頭。為方便解決按鈕的BN_CLICKED告知消息,為CMenuButton類創(chuàng)建一個公有的成員函數(shù)OnClick(),以便在BN_CLICKED的消息解決器中調(diào)用。它有兩個參數(shù),第一個是菜單資源的ID,第二個參數(shù)為子菜單的ID,默認為0。假如只有一組子菜單,則可使用其默認值0。OnClick()函數(shù)的返回值為所選的菜單項的命令I(lǐng)D,若未作任何有效選擇,則返回0。下面是程序代碼。頭文獻:#if!defined(_EWAY_MEMUBUTTON_H__INCLUDED_)#define_EWAY_MEMUBUTTON_H__INCLUDED_#if_MSC_VER>=1000#pragmaonce#endif//_MSC_VER>=1000//MenuButton.h:headerfile//classCMenuButton:publicCButton{public:CMenuButton();virtual~CMenuButton();DECLARE_DYNAMIC(CMenuButton)enumArrowType{arrowRight,//向右的箭頭;arrowDown,//向下的箭頭;arrowSmallRight,//向右的小箭頭;arrowSmallDown,//向下的小箭頭;arrowUp,//向上的箭頭;arrowLeft//向左的箭頭;}m_ArrowType;enumPopupPos{//名稱為TopLeft等等,遵守英文習(xí)慣;posTopLeft,//左上角;posBottomLeft,//左下角;posTopRight,//右上角;posBottomRight,//右下角;}m_PopupPos;virtualUINTOnClick(UINTnIDMenuResource,UINTnSubMenu=0);voidSetArrowType(CMenuButton::ArrowTypetype=CMenuButton::arrowRight);voidSetDrawFocusRect(BOOLbDrawFocusRect=TRUE);voidSetMenuPopupPos(CMenuButton::PopupPospos=CMenuButton::posBottomLeft);voidSetStyle(BOOLbDrawArrow=TRUE);//Overrides//ClassWizardgeneratedvirtualfunctionoverrides//{{AFX_VIRTUAL(CMenuButton)public:virtualvoidDrawItem(LPDRAWITEMSTRUCTlpDrawItemStruct);protected:virtualvoidPreSubclassWindow();//}}AFX_VIRTUALprotected:BOOLm_bDrawFocusRect;//{{AFX_MSG(CMenuButton)//}}AFX_MSGDECLARE_MESSAGE_MAP()};//{{AFX_INSERT_LOCATION}}//MicrosoftDeveloperStudiowillinsertadditionaldeclarationsimmediatelybeforethepreviousline.#endif//!defined(_EWAY_MEMUBUTTON_H__INCLUDED_)實現(xiàn)文獻://MenuButton.cpp:implementationfile//#include"stdafx.h"#include"MenuButtonTest.h"#include"MenuButton.h"#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif///////////////////////////////////////////////////////////////////////////////CMenuButtonIMPLEMENT_DYNAMIC(CMenuButton,CButton)CMenuButton::CMenuButton(){SetArrowType();SetDrawFocusRect();SetMenuPopupPos();}CMenuButton::~CMenuButton(){}BEGIN_MESSAGE_MAP(CMenuButton,CButton)//{{AFX_MSG_MAP(CMenuButton)//}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CMenuButtonmessagehandlersvoidCMenuButton::DrawItem(LPDRAWITEMSTRUCTlpDrawItemStruct){//使用FromeHandle()創(chuàng)建臨時的對象,若使用Attach()則必需在最后使用Detach()CDC*pDC=CDC::FromHandle(lpDrawItemStruct->hDC);//得到畫筆的顏色;CPenpen;if((lpDrawItemStruct->itemState&ODS_DISABLED)){pen.Creat(yī)ePen(PS_SOLID,0,::GetSysColor(COLOR_GRAYTEXT));}else{pen.CreatePen(PS_SOLID,0,::GetSysColor(COLOR_BTNTEXT));}CPen*pOldPen=pDC->SelectObject(&pen);CFontfont;font.Creat(yī)eFont(12,0,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,"Marlett");CFont*pOldFont=pDC->SelectObject(&font);CSizesize=pDC->GetTextExtent("4",1);//決定箭頭的樣子,具體的值可在“字符映射表”中查得;CStringstrArrow;switch(m_ArrowType){caseCMenuButton::arrowRight:strArrow="4";break;caseCMenuButton::arrowDown:strArrow="6";break;caseCMenuButton::arrowSmallRight:strArrow="8";break;caseCMenuButton::arrowSmallDown:strArrow="9";break;caseCMenuButton::arrowUp:strArrow="5";break;caseCMenuButton::arrowLeft:strArrow="3";break;default:ASSERT(FALSE);}//計算座標值,用于繪制箭頭;intx=(lpDrawItemStruct->rcItem.right-lpDrawItemStruct->rcItem.left-size.cx)/2;inty=(lpDrawItemStruct->rcItem.bottom-lpDrawItemStruct->rcItem.top-size.cy)/2;//畫按鈕與箭頭;if((lpDrawItemStruct->itemState&ODS_SELECTED)){pDC->DrawFrameControl(&lpDrawItemStruct->rcItem,DFC_BUTTON,DFCS_BUTTONPUSH|DFCS_PUSHED);//在按鈕被按下時,上面的字符要有一個向右和向下的偏移;pDC->TextOut(++x,++y,strArrow);}else{pDC->DrawFrameControl(&lpDrawItemStruct->rcItem,DFC_BUTTON,DFCS_BUTTONPUSH);pDC->TextOut(x,y,strArrow);}//假如需要,畫焦點矩形;if((lpDrawItemStruct->itemState&ODS_FOCUS)&&m_bDrawFocusRect){CRectrectFocus(lpDrawItemStruct->rcItem);rectFocus.Deflat(yī)eRect(3,3);//看起來比較接近的值;pDC->DrawFocusRect(rectFocus);}//僅將對象選回即可,不必調(diào)用DeleteTempMap();pDC->SelectObject(pOldPen);pDC->SelectObject(pOldFont);}UINTCMenuButton::OnClick(UINTnIDMenuResource,UINTnSubMenu/*=0*/){CMenumenu;//裝載菜單;VERIFY(menu.LoadMenu(nIDMenuResource));//得到子菜單;CMenu*pPopup=menu.GetSubMenu(nSubMenu);//默認為第一組子菜單;ASSERT(pPopup!=NULL);CRectrect;GetWindowRect(rect);POINTpoint;//決定彈出菜單的位置;switch(m_PopupPos){caseCMenuButton::posTopLeft://左上角;point.x=rect.left;point.y=rect.top;break;caseCMenuButton::posBottomLeft://左下角;point.x=rect.left;point.y=rect.bottom;break;caseCMenuButton::posTopRight://右上角;point.x=rect.right;point.y=rect.top;break;caseCMenuButton::posBottomRight://右下角;point.x=rect.right;point.y=rect.bottom;break;default:ASSERT(FALSE);}//彈出菜單;UINTnMenuSel=pPopup->TrackPopupMenu((TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_NONOTIFY|TPM_RETURNCMD),point.x,point.y,this);pPopup->DestroyMenu();//返回被選擇的菜單的ID,假如無任何有效的選擇,將返回0;returnnMenuSel;}voidCMenuButton::PreSubclassWindow(){CButton::PreSubclassWindow();//默認值:加入BS_OWNERDRAW風(fēng)格;ModifyStyle(0,BS_OWNERDRAW);}voidCMenuButton::SetArrowType(CMenuButton::ArrowTypetype){m_ArrowType=type;}voidCMenuButton::SetDrawFocusRect(BOOLbDrawFocusRect){m_bDrawFocusRect=bDrawFocusRect;}voidCMenuButton::SetMenuPopupPos(CMenuButton::PopupPospos){m_PopupPos=pos;}voidCMenuButton::SetStyle(BOOLbDrawArrow){if(bDrawArrow){ModifyStyle(0,BS_OWNERDRAW,SWP_NOMOVE|SWP_NOZORDER|SWP_NOSIZE);}else{ModifyStyle(BS_OWNERDRAW,0,SWP_NOMOVE|SWP_NOZORDER|SWP_NOSIZE);}}要使用這個類,為對話框添加CMenuButton類型的按鈕成員變量,若需改變默認風(fēng)格,則可在OnInitDialog中調(diào)用CMenuButton類的公有成員函數(shù)SetArrowType()、SetDrawFocusRect()、SetMenuPopupPos()或SetStyle(),在ClassWizard中為對話框添加按鈕的BN_CLICKED消息解決函數(shù),然后在其中調(diào)用CMenuButton類的OnClick()成員函數(shù),并指定一個菜單ID給它,最后解決OnClick()函數(shù)的返回值即可。下面是一個例子。voidCMenuButtonTestDlg::OnTest(){UINTnSel=m_btnTest.OnClick(IDR_POPUP);switch(nSel){caseID_APP_EXIT:SendMessage(WM_CLOSE,0,0);break;caseID_POPUP_ITEM1:AfxMessageBox("您選擇了第一項!");break;caseID_POPUP_ITEM2:AfxMessageBox("您選擇了第二項?。?;break;caseID_POPUP_ITEM3:AfxMessageBox("您選擇了第三項!");break;default://Donothing;;}}所用菜單的資源描述如下,外觀可參見文首的圖。IDR_POPUPMENUDISCARDABLEBEGINPOPUP"_POPUP_"BEGINMENUITEM"第一項",ID_POPUP_ITEM1MENUITEM"第二項",ID_POPUP_ITEM2MENUITEM"第三項",ID_POPUP_ITEM3MENUITEMSEPARATORMENUITEM"退出(&X)",ID_APP_EXITENDENDBOOLCMenuButtonTestDlg::OnInitDialog(){CDialog::OnInitDialog();//由于這幾個值都是默認值,所以注釋掉,僅為了演示用法;//m_btnTest.SetDrawFocusRect(TRUE);//m_btnTest.ArrowType(CMenuButton::arrowRight);//m_btnTest.SetStyle(TRUE);//m_btnTest.SetMenuPopupPos(CMenuButton::posBottomLeft);returnTRUE;}值得補充說明的是,使用CMenuButton類的時候,并不一定需要在對話框模板中為按鈕指定BS_OWNERDRAW風(fēng)格,由于在缺省情況下,CMenuButton類的PreSubclassWindow()函數(shù)中已經(jīng)自動加入了這一風(fēng)格。搜狗搜索猜測,此時您也許對以下內(nèi)容感愛好,點擊看看!關(guān)閉關(guān)閉提醒關(guān)閉確認取消實驗三,計算器MFC實現(xiàn)簡樸功能計算器第一步:運用MFC的AppWizard生成一個基于對話框的程序(本程序工程名為Calc),切換到Resource,在Dialog中的IDD_CALC_DIALOG上雙擊,然后添控件按鈕,做好外觀布局,改好按鈕ID和Caption;第二步:為控件按鈕增長相應(yīng)的變量和事件響應(yīng)函數(shù);第三步:在CCalcDlg類中添加相應(yīng)變量;第四步:對控件按鈕的事件響應(yīng)函數(shù)做解決;代碼如下:第一部分(運用ClassWizard添加,可不必手動修改),在CalcDlg.h中的代碼修改如下://CalcDlg.h:頭文獻//#pragmaonce//CCalcDlg對話框classCCalcDlg:publicCDialog{//構(gòu)造public:CCalcDlg(CWnd*pParent=NULL);//標準構(gòu)造函數(shù)//對話框數(shù)據(jù)enum{IDD=IDD_CALC_DIALOG};protected:virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDV支持//實現(xiàn)protected:HICONm_hIcon;//生成的消息映射函數(shù)virtualBOOLOnInitDialog();afx_msgvoidOnSysCommand(UINTnID,LPARAMlParam);afx_msgvoidOnPaint();afx_msgHCURSOROnQueryDragIcon();DECLARE_MESSAGE_MAP()public:afx_msgvoidOnBnClickedBtnnum0();public:afx_msgvoidOnBnClickedBtnnum1();public:afx_msgvoidOnBnClickedBtnnum2();public:afx_msgvoidOnBnClickedBtnnum3();public:afx_msgvoidOnBnClickedBtnnum4();public:afx_msgvoidOnBnClickedBtnnum5();public:afx_msgvoidOnBnClickedBtnnum6();public:afx_msgvoidOnBnClickedBtnnum7();public:afx_msgvoidOnBnClickedBtnnum8();public:afx_msgvoidOnBnClickedBtnnum9();public:afx_msgvoidOnBnClickedBtnopadd();public:afx_msgvoidOnBnClickedBtnopsub();public:afx_msgvoidOnBnClickedBtnopmulti();public:afx_msgvoidOnBnClickedBtnopdiv();public:afx_msgvoidOnBnClickedBtnopequal();public:afx_msgvoidOnBnClickedBtnclean();public:afx_msgvoidOnBnClickedBtnnumradix();protected:CStringm_csEditText;//保存運算符右操作數(shù)的字符串,按下運算符按鈕時將其賦給m_csFirstNumber,//然后清空,從新接受數(shù)字CStringm_csFirstNumber;//用來保存運算符的左操作數(shù)的字符串boolm_bRadixFlag;//小數(shù)點標志,用來保證一個數(shù)字中只包含一個小數(shù)點doublem_dFirstNumber;//用來保存從m_csFirstNumber中提取出來的浮點數(shù)doublem_dSecondNumber;//用來保存按下運算符按鈕更新后的m_csEditText所包含的浮點數(shù)字doublem_dResualt;//用來保存運算結(jié)果的浮點數(shù)intm_nOperat(yī)orFlag;//用來標志運算符charm_cInsetNumber;//用來保存按下數(shù)字按鈕時的相應(yīng)數(shù)字,然后把它動態(tài)加入到m_csEditText中,構(gòu)成新數(shù)字字符串};第二部分,在CalcDlg.cpp中修改代碼如下://CalcDlg.cpp:實現(xiàn)文獻//#include"stdafx.h"#include"Calc.h"#include"CalcDlg.h"#ifdef_DEBUG#definenewDEBUG_NEW#endif//用于應(yīng)用程序“關(guān)于”菜單項的CAboutDlg對話框classCAboutDlg:publicCDialog{public:CAboutDlg();//對話框數(shù)據(jù)enum{IDD=IDD_ABOUTBOX};protected:virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDV支持//實現(xiàn)protected:DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg():CDialog(CAboutDlg::IDD){}voidCAboutDlg::DoDataExchange(CDataEx
溫馨提示
- 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)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 個人出售房產(chǎn)合同范本
- 加裝空調(diào)工程合同范本
- 購房合同有購房合同范本
- 單位合伙建房合同范例
- 關(guān)于獨家合同范本
- 醫(yī)藥會議合同范本
- 單位給買車合同范本
- 化工項目整體承建合同范本
- 產(chǎn)品總經(jīng)銷合同范本
- 醫(yī)院加盟合同范本
- 2024屆江蘇省南通市如皋市高三下學(xué)期二模物理試題
- 2024年春學(xué)期人教版pep版小學(xué)英語五年級下冊教學(xué)進度表
- 普通高中政治課程標準測試題及答案
- 2024年知識競賽-《民用爆炸物品安全管理條例》知識競賽筆試參考題庫含答案
- 出師表(選擇題)答案版
- (正式版)JBT 9229-2024 剪叉式升降工作平臺
- 屋頂 屋頂?shù)呐潘O(shè)計 屋頂?shù)呐潘绞剑ńㄖ?gòu)造)
- Web-of-sciencenew文獻檢索-課件
- (高清版)DZT 0368-2021 巖礦石標本物性測量技術(shù)規(guī)程
- 礦山開采與環(huán)境保護
- 企業(yè)事業(yè)部制的管理與監(jiān)督機制
評論
0/150
提交評論