中南大学数学院大三年级面向对象实验报告Word格式文档下载.docx
《中南大学数学院大三年级面向对象实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《中南大学数学院大三年级面向对象实验报告Word格式文档下载.docx(19页珍藏版)》请在冰豆网上搜索。
dc.MoveTo(p1);
dc.LineTo(p2);
OnLButtonUp(nFlags,point);
OnMouseMove(UINTnFlags,CPointpoint)
staticintn=0;
switch(++n)
case1:
p2=point;
break;
case2:
p1=p2;
n=0;
if(m==1)
OnMouseMove(nFlags,point);
实验二,创建菜单
用MFC创建菜单按钮
具体的制作过程:
首先,生成一个MFCAppWizardEXE工程
生成一个以CButton为基类的新类,名为CMenuButton,然后用ClassWizard为其添加两个成员函数:
DrawItem()和PreSubclassWidnow();
手工为CMenuButton类添加BOOL类型m_bDrawFocusRect成员变量,用于决定是否在按钮上画焦点矩形,添加SetDrawFocusRect()函数用于设置这个标志,默认为画焦点矩形;
添加两个枚举类型的变量m_ArrowType和m_PopupPos,用于决定所画的箭头的类型和菜单弹出的位置。
箭头可为右箭头、下箭头、小右箭头、小下箭头、上箭头和左箭头;
菜单的弹出位置可以为按钮的左上角、右上角、左下角和右下角。
最后手工添加两个函数,SetArrowType()和SetMenuPopupPos(),用于设置以上各种风格,其默值分别为画右箭头和在左下角弹出。
如果只需要菜单而不需要画箭头,只需置空BS_OWNERDRAW标志位即可,添加一个SetStyle()函数,用于设置是画箭头还是显示文本,其默认值是画箭头。
为方便处理按钮的BN_CLICKED通知消息,为CMenuButton类创建一个公有的成员函数OnClick(),以便在BN_CLICKED的消息处理器中调用。
它有两个参数,第一个是菜单资源的ID,第二个参数为子菜单的ID,默认为0。
如果只有一组子菜单,则可使用其默认值0。
OnClick()函数的返回值为所选的菜单项的命令ID,若未作任何有效选择,则返回0。
下面是程序代码。
头文件:
#if!
defined(_EWAY_MEMUBUTTON_H__INCLUDED_)
#define_EWAY_MEMUBUTTON_H__INCLUDED_
#if_MSC_VER>
=1000
#pragmaonce
#endif//_MSC_VER>
//MenuButton.h:
headerfile
//
classCMenuButton:
publicCButton
public:
CMenuButton();
virtual~CMenuButton();
DECLARE_DYNAMIC(CMenuButton)
enumArrowType
arrowRight,//向右的箭头;
arrowDown,//向下的箭头;
arrowSmallRight,//向右的小箭头;
arrowSmallDown,//向下的小箭头;
arrowUp,//向上的箭头;
arrowLeft//向左的箭头;
}m_ArrowType;
enumPopupPos
//名称为TopLeft等等,遵守英文习惯;
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)
virtualvoidDrawItem(LPDRAWITEMSTRUCTlpDrawItemStruct);
protected:
virtualvoidPreSubclassWindow();
//}}AFX_VIRTUAL
BOOLm_bDrawFocusRect;
//{{AFX_MSG(CMenuButton)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
//MicrosoftDeveloperStudiowillinsertadditionaldeclarationsimmediatelybeforethepreviousline.
#endif//!
实现文件:
//MenuButton.cpp:
implementationfile
#include"
stdafx.h"
MenuButtonTest.h"
MenuButton.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CMenuButton
IMPLEMENT_DYNAMIC(CMenuButton,CButton)
CMenuButton:
CMenuButton()
SetArrowType();
SetDrawFocusRect();
SetMenuPopupPos();
~CMenuButton()
BEGIN_MESSAGE_MAP(CMenuButton,CButton)
//{{AFX_MSG_MAP(CMenuButton)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//CMenuButtonmessagehandlers
voidCMenuButton:
DrawItem(LPDRAWITEMSTRUCTlpDrawItemStruct)
//使用FromeHandle()创建临时的对象,若使用Attach()则必需在最后使用Detach()
CDC*pDC=CDC:
FromHandle(lpDrawItemStruct->
hDC);
//得到画笔的颜色;
CPenpen;
if((lpDrawItemStruct->
itemState&
ODS_DISABLED))
pen.CreatePen(PS_SOLID,0,:
GetSysColor(COLOR_GRAYTEXT));
else
GetSysColor(COLOR_BTNTEXT));
CPen*pOldPen=pDC->
SelectObject(&
pen);
CFontfont;
font.CreateFont(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->
font);
CSizesize=pDC->
GetTextExtent("
4"
1);
//决定箭头的样子,具体的值可在“字符映射表”中查得;
CStringstrArrow;
switch(m_ArrowType)
caseCMenuButton:
arrowRight:
strArrow="
;
break;
arrowDown:
6"
arrowSmallRight:
8"
arrowSmallDown:
9"
arrowUp:
5"
arrowLeft:
3"
default:
ASSERT(FALSE);
//计算座标值,用于绘制箭头;
intx=(lpDrawItemStruct->
rcItem.right-lpDrawItemStruct->
rcItem.left-size.cx)/2;
inty=(lpDrawItemStruct->
rcItem.bottom-lpDrawItemStruct->
rcItem.top-size.cy)/2;
//画按钮与箭头;
ODS_SELECTED))
pDC->
DrawFrameControl(&
lpDrawItemStruct->
rcItem,DFC_BUTTON,DFCS_BUTTONPUSH|DFCS_PUSHED);
//在按钮被按下时,上面的字符要有一个向右和向下的偏移;
TextOut(++x,++y,strArrow);
rcItem,DFC_BUTTON,DFCS_BUTTONPUSH);
TextOut(x,y,strArrow);
//如果需要,画焦点矩形;
ODS_FOCUS)&
&
m_bDrawFocusRect)
CRectrectFocus(lpDrawItemStruct->
rcItem);
rectFocus.DeflateRect(3,3);
//看起来比较接近的值;
DrawFocusRect(rectFocus);
//仅将对象选回即可,不必调用DeleteTempMap();
SelectObject(pOldPen);
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)
posTopLeft:
//左上角;
point.x=rect.left;
point.y=rect.top;
posBottomLeft:
//左下角;
point.y=rect.bottom;
posTopRight:
//右上角;
point.x=rect.right;
posBottomRight:
//右下角;
//弹出菜单;
UINTnMenuSel=pPopup->
TrackPopupMenu((TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_NONOTIFY|TPM_RETURNCMD),point.x,point.y,this);
pPopup->
DestroyMenu();
//返回被选择的菜单的ID,如果无任何有效的选择,将返回0;
returnnMenuSel;
PreSubclassWindow()
CButton:
PreSubclassWindow();
//默认值:
加入BS_OWNERDRAW风格;
ModifyStyle(0,BS_OWNERDRAW);
SetArrowType(CMenuButton:
ArrowTypetype)
m_ArrowType=type;
SetDrawFocusRect(BOOLbDrawFocusRect)
m_bDrawFocusRect=bDrawFocusRect;
SetMenuPopupPos(CMenuButton:
PopupPospos)
m_PopupPos=pos;
SetStyle(BOOLbDrawArrow)
if(bDrawArrow)
ModifyStyle(0,BS_OWNERDRAW,SWP_NOMOVE|SWP_NOZORDER|SWP_NOSIZE);
ModifyStyle(BS_OWNERDRAW,0,SWP_NOMOVE|SWP_NOZORDER|SWP_NOSIZE);
要使用这个类,为对话框添加CMenuButton类型的按钮成员变量,若需改变默认风格,则可在OnInitDialog中调用CMenuButton类的公有成员函数SetArrowType()、SetDrawFocusRect()、SetMenuPopupPos()或SetStyle(),在ClassWizard中为对话框添加按钮的BN_CLICKED消息处理函数,然后在其中调用CMenuButton类的OnClick()成员函数,并指定一个菜单ID给它,最后处理OnClick()函数的返回值即可。
下面是一个例子。
voidCMenuButtonTestDlg:
OnTest()
UINTnSel=m_btnTest.OnClick(IDR_POPUP);
switch(nSel)
caseID_APP_EXIT:
SendMessage(WM_CLOSE,0,0);
caseID_POPUP_ITEM1:
AfxMessageBox("
您选择了第一项!
"
caseID_POPUP_ITEM2:
您选择了第二项!
caseID_POPUP_ITEM3:
您选择了第三项!
//Donothing;
所用菜单的资源描述如下,外观可参见文首的图。
IDR_POPUPMENUDISCARDABLE
BEGIN
POPUP"
_POPUP_"
MENUITEM"
第一项"
ID_POPUP_ITEM1
第二项"
ID_POPUP_ITEM2
第三项"
ID_POPUP_ITEM3
MENUITEMSEPARATOR
退出(&
X)"
ID_APP_EXIT
END
BOOLCMenuButtonTestDlg:
OnInitDialog()
CDialog:
OnInitDialog();
//因为这几个值都是默认值,所以注释掉,仅为了演示用法;
//m_btnTest.SetDrawFocusRect(TRUE);
//m_btnTest.ArrowType(CMenuButton:
//m_btnTest.SetStyle(TRUE);
//m_btnTest.SetMenuPopupPos(CMenuButton:
returnTRUE;
值得补充说明的是,使用CMenuButton类的时候,并不一定需要在对话框模板中为按钮指定BS_OWNERDRAW风格,因为在缺省情况下,CMenuButton类的PreSubclassWindow()函数中已经自动加入了这一风格。
搜狗搜索猜测,此时您可能对以下内容感兴趣,点击看看!
关闭关闭提示关闭
确认取消
实验三,计算器
MFC实现简单功能计算器
第一步:
利用MFC的AppWizard生成一个基于对话框的程序(本程序工程名为Calc),切换到Resource,在Dialog中的IDD_CALC_DIALOG上双击,然后添控件按钮,做好外观布局,改好按钮ID和Caption;
第二步:
为控件按钮增加相应的变量和事件响应函数;
第三步:
在CCalcDlg类中添加相应变量;
第四步:
对控件按钮的事件响应函数做处理;
代码如下:
第一部分(利用ClassWizard添加,可不必手动修改),在CalcDlg.h中的代码修改如下:
//CalcDlg.h:
头文件
//
#pragmaonce
//CCalcDlg对话框
classCCalcDlg:
publicCDialog
{
//构造
CCalcDlg(CWnd*pParent=NULL);
//标准构造函数
//对话框数据
enum{IDD=IDD_CALC_DIALOG};
virtualvoidDoDataExchange(CDataExchange*pDX);
//DDX/DDV支持
//实现
HICONm_hIcon;
//生成的消息映射函数
virtualBOOLOnInitDialog();
afx_msgvoidOnSysCommand(UINTnID,LPARAMlParam);
afx_msgvoidOnPaint();
afx_msgHCURSOROnQueryDragIcon();
DECLARE_MESSAGE_MAP()
afx_msgvoidOnBnClickedBtnnum0();
afx_msgvoidOnBnClickedBtnnum1();
afx_msgvoidOnBnClickedBtnnum2();
afx_msgvoidOnBnClickedBtnnum3();
afx_msgvoidOnBnClickedBtnnum4();