return0;
}
实验二
(1)鼠标实验
班级:
09软件三班学号:
20095574姓名:
刘长生
实验日期:
实验成绩:
一、实验目的
1、了解MFC的基本框架;
2、掌握MFC生成程序框架的基本步骤;
3、熟悉SDI、MDI和基于对话框应用程序的框架
4..熟悉单文档,多文档MFC应用程序的创建;
5、熟悉SDI、MDI和基于对话框应用程序的框架中关键函数;
6..掌握消息的添加;
7、了解各个关键函数调用顺序和作用。
二、实验原理
利用消息映射函数添加代码。
三、实验步骤
1.创建单文档MFC应用程序;
2.为鼠标左键单击消息WM_LBUTTONDOWN和鼠标右键双击消息WM_RBUTTONDBLCLK添加相应的消息映射函数。
当单击时,弹出“左键被按下!
”的对话框;当双击鼠标右键时,弹出“右键被双击!
”的对话框;
3.设置鼠标形状,鼠标在移动过程中变为手形
4.添加WM_MOUSEMOVE消息映射函数,限定鼠标的移动范围,鼠标只能在窗口区域移动,不能移出该区域
四、实验结果
五、实验结果分析
实验结果符合实验要求,1、当单击时,弹出“左键被按下!
”的对话框;当双击鼠标右键时,弹出“右键被双击!
”的对话框;2、鼠标在移动过程中变为手形;3、鼠标只能在窗口区域内移动,不能移出该区域。
附件1:
程序源代码
//CMy2_1View消息处理程序
voidCMy2_1View:
:
OnLButtonDown(UINTnFlags,CPointpoint)
{
//TODO:
在此添加消息处理程序代码和/或调用默认值
CDC*pDc=GetDC();
CDialogdialog((LPCTSTR)"lab2_1");//=(CDialog*)GetDC();
CStringstr=(CString)"左键被按下!
";
dialog.DoModal();
dialog.MessageBox(str);
CView:
:
OnLButtonDown(nFlags,point);
}
voidCMy2_1View:
:
OnMouseMove(UINTnFlags,CPointpoint)
{
//TODO:
在此添加消息处理程序代码和/或调用默认值
CDC*pDC=GetDC();
HCURSORcursor;
RECTrcClip;
if((nFlags&MK_LBUTTON)!
=MK_LBUTTON)
{
GetWindowRect(&rcClip);
ClipCursor(&rcClip);
cursor=AfxGetApp()->LoadStandardCursor(IDC_HAND);
SetCursor(cursor);
}
CView:
:
OnMouseMove(nFlags,point);
}
voidCMy2_1View:
:
OnRButtonDblClk(UINTnFlags,CPointpoint)
{
//TODO:
在此添加消息处理程序代码和/或调用默认值
CDC*pDc=GetDC();
CDialogdialog((LPCTSTR)"lab2_1");//=(CDialog*)GetDC();
CStringstr=(CString)"右键被双击!
";
dialog.DoModal();
dialog.MessageBox(str);
实验二
(2)键盘和窗口控制实验
班级:
09软件三班学号:
20095574姓名:
刘长生
实验日期:
实验成绩:
一、实验目的
1、理解基于事件,消息处理的机制
2、掌握各种消息的处理(命令消息、控件消息和自定义消息)
二、实验原理
利用消息映射函数添加代码。
三、实验步骤
1,.新建建立单文档MFC项目,视图类的基类设为CScrollView
2.用鼠标控制窗口大小,为WM_SIZE(窗口改变大小)编写消息映射函数
3.当窗口大小发生改变时,改变窗口的背景颜色,为WM_DRAW编写消息映射函数,
4.用键盘的按键实现滚动条的控制,为WM_KEYDOWN消息编写消息映射函数
5.计算视图的合计大小,为WM_InitialUpdate消息编写消息映射函数
四、实验结果
四、实验结果分析
实验结果符合实验要求,1、当窗口大小发生改变时,改变窗口的背景颜色2、当按下上、下、左、右键时,滚动条会随之上、下、左、右移动。
附件1:
程序源代码
//lab2_2View.cpp:
Clab2_2View类的实现
//
#include"stdafx.h"
#include"lab2_2.h"
#include"lab2_2Doc.h"
#include"lab2_2View.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#endif
//Clab2_2View
IMPLEMENT_DYNCREATE(Clab2_2View,CScrollView)
BEGIN_MESSAGE_MAP(Clab2_2View,CScrollView)
//标准打印命令
ON_COMMAND(ID_FILE_PRINT,&CScrollView:
:
OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT,&CScrollView:
:
OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW,&CScrollView:
:
OnFilePrintPreview)
ON_WM_SIZE()
ON_WM_KEYDOWN()
END_MESSAGE_MAP()
//Clab2_2View构造/析构
Clab2_2View:
:
Clab2_2View()
{
//TODO:
在此处添加构造代码
}
Clab2_2View:
:
~Clab2_2View()
{
}
BOOLClab2_2View:
:
PreCreateWindow(CREATESTRUCT&cs)
{
//TODO:
在此处通过修改
//CREATESTRUCTcs来修改窗口类或样式
returnCScrollView:
:
PreCreateWindow(cs);
}
//Clab2_2View绘制
voidClab2_2View:
:
OnDraw(CDC*pDC)
{
Clab2_2Doc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
srand(time((unsignedint)NULL));
intcolorNum=rand()%256,cx=rand()%256,cy=rand()%256;
CRectclientRect;
GetClientRect(clientRect);
CBrushbrush;
brush.CreateSolidBrush(RGB(colorNum,cx,cy));
//colorNum++;cx++;cy++;
pDC->DPtoLP(clientRect);
pDC->FillRect(clientRect,&brush);
if(!
pDoc)
return;
//TODO:
在此处为本机数据添加绘制代码
}
voidClab2_2View:
:
OnInitialUpdate()
{
CScrollView:
:
OnInitialUpdate();
CSizesizeTotal;
CRectclientRect;
GetClientRect(clientRect);
CSizesizePage=clientRect.Width();
CSizesizeLine=clientRect.Width();
//TODO:
计算此视图的合计大小
sizeTotal.cx=sizeTotal.cy=2500;
SetScrollSizes(MM_TEXT,sizeTotal);
}
//Clab2_2View打印
BOOLClab2_2View:
:
OnPreparePrinting(CPrintInfo*pInfo)
{
//默认准备
returnDoPreparePrinting(pInfo);
}
voidClab2_2View:
:
OnBeginPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
{
//TODO:
添加额外的打印前进行的初始化过程
}
voidClab2_2View:
:
OnEndPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
{
//TODO:
添加打印后进行的清理过程
}
//Clab2_2View诊断
#ifdef_DEBUG
voidClab2_2View:
:
AssertValid()const
{
CScrollView:
:
AssertValid();
}
voidClab2_2View:
:
Dump(CDumpContext&dc)const
{
CScrollView:
:
Dump(dc);
}
Clab2_2Doc*Clab2_2View:
:
GetDocument()const//非调试版本是内联的
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(Clab2_2Doc)));
return(Clab2_2Doc*)m_pDocument;
}
#endif//_DEBUG
//Clab2_2View消息处理程序
voidClab2_2View:
:
OnSize(UINTnType,intcx,intcy)
{
CScrollView:
:
OnSize(nType,cx,cy);
Invalidate(TRUE);
//TODO:
在此处添加消息处理程序代码
}
voidClab2_2View:
:
OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)
{
//TODO:
在此添加消息处理程序代码和/或调用默认值
//TODO:
在此添加消息处理程序代码和/或调用默认值
switch(nChar)
{
case38:
//CScrollView*pDc=(CScrollView*)GetDocument();/制转换用时要小心,很可能出错。
//CPointpoint=pDc->GetDeviceScrollPosition();
//SendMessage(WM_MOUSEWHEEL);
//pDc->ScrollToPosition(CPoint(++point.x,++point.y));
//TStringGrida;
//number=37;
SendMessage(WM_VSCROLL);
break;
case40:
//number=40;
SendMessage(WM_VSCROLL,1);
break;
case37:
//number=37;
SendMessage(WM_HSCROLL);
break;
case39:
//number=39;
SendMessage(WM_HSCROLL,1);
break;
}
CScrollView:
:
OnKeyDown(nChar,nRepCnt,nFlags);
}
实验三菜单,状态栏,工具栏的设计
班级:
09软件三班学号:
095574姓名:
刘长生
实验日期:
实验成绩:
一、实验目的
1.了解文档与视图结构程序的工作原理
2.掌握应用程序中的菜单界面设计方法
3.掌握工具栏和状态栏等程序界面的设计方法
4.掌握文档的序列化工作原理
5.掌握使用不同的视图类编程
二、实验原理
1.Windows应用程序包括客户区、非客户区。
非客户区包括窗口的边框、标题栏、单栏、工具栏、状态栏和滚动条。
菜单分为两类,一类是依附于框架窗口的一般菜单,包括主菜单和子菜单,另一类是弹出式菜单,也叫快捷菜单或上下文菜单
2.菜单中的每一个菜单项都由菜单项名和命令ID号两个基本要素组成。
3.Windows应用程序是通过消息传递机制运作的,菜单项对命令的激发、调用是通过发送WM_COMMAND消息实现的
4.在程序中可以通过为WM_CONTEXTMENU消息添加消息映射函数来实现弹出式菜单,WM_CONTEXTMENU消息是在收到WM_RBUTTONUP消息后,由windows产生的。
但如果在WM_RBUTTONUP的消息映射函数中没有调用基类的成员函数,则应用程序不会收到WM_CONTEXTMENU消息
5.工具栏是菜单的一种快捷方式。
把最常用的菜单定义为工具栏。
6.状态栏是典型的位于应用程序主窗口底部的窗口,经常在状态栏显示文本提示信息。
当用户浏览菜单项和工具栏按钮时,MFC自动地在状态栏窗口中显示一些提示信息。
三、实验步骤
1.为程序添加一个“文本”主菜单单项“显示”和“删除”。
点击显示时显示出“欢迎”字样,点击删除时字样消失。
(1)在文档派生类Cwork3Doc添加一个成员变量m_change:
;
(2)修改视图派生类的OnDraw函数,根据m_change的值显示或删除文本;(3)为菜单项添加命令处理函.
2.为程序work3的“文本”菜单添加弹出式菜单。
在类视图中选择类Cwork3View,在“属性”窗口中单击“消息”按钮,选择“WM_CONTEXTMENU”选项,单击右侧下拉菜单中的“<添加>OnContextMenu”选项,即可在视图类Cwork3View中添加消息WM_CONTEXTMENU的消息映射函数.
3.为程序work3的“文本”菜单项添加工具栏按钮。
(1)在资源视图中展开“work3.rc”文件夹,再展开“Toolbar”文件夹,双击其下“IDR_MAINFRAME”选项,打开工具栏编辑器,屏幕上同时显示工具栏设计窗口,选择资源视图里的“work3”菜单项右击,在弹出的快捷菜单中执行“添加”——“资源”命令,会弹出“添加资源”对话框,在“资源类型”列表框中选择“Toolbar”选项,并单击“新建”按钮,系统就会默认添加一个名为“IDR_TOOLBAR1”的工具栏,屏幕上同时显示工具栏设计窗口,用户可自己设计工具栏。
(2)添加工具栏按钮.(3)设置工具栏按钮属性.
4修改的程序work3,在状态栏上显示鼠标的位置,以及当前的状态(是显示文本还是删除文本)。
(1)添加串表;
(2)添加指示器面板;(3)添加消息映射函数OnMouseMove;(4)修改OnDraw函数,添加显示当前状态的代码。
.
.
5.设置状态栏显示时间。
(1)在StringTable中添加NewString,在此定义为ID_INDICATOR_CLOCK,将其Caption设为00:
00:
00。
(2)在MainFrm.cpp中indicators声明处添加ID_INDICATOR_CLOCK,;(3)安装定时器(4)编写时间处理函数(5)销毁定时器。
6.调试,运行。
四、实验结果
五、实验结果分析
实验结果符合实验要求。
主菜单的“文本”和它的两个下拉子菜单项“显示”和“删除”。
点击显示时显示出“欢迎”字样,点击删除时字样消失。
并添加对应的按钮和弹出菜单。
状态栏显示当前状态、鼠标位置、时间
附件1:
程序源代码
一:
//work3View.cpp:
Cwork3View类的实现
//
#include"stdafx.h"
#include"work3.h"
#include"work3Doc.h"
#include"work3View.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#endif
//Cwork3View
IMPLEMENT_DYNCREATE(Cwork3View,CView)
BEGIN_MESSAGE_MAP(Cwork3View,CView)
//标准打印命令
ON_COMMAND(ID_FILE_PRINT,&CView:
:
OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT,&CView:
:
OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW,&CView:
:
OnFilePrintPreview)
ON_WM_CONTEXTMENU()
ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()
//Cwork3View构造/析构
Cwork3View:
:
Cwork3View()
{
//TODO:
在此处添加构造代码
}
Cwork3View:
:
~Cwork3View()
{}
BOOLCwork3View:
:
PreCreateWindow(CREATESTRUCT&cs)
{
//TODO:
在此处通过修改
//CREATESTRUCTcs来修改窗口类或样式
returnCView:
:
PreCreateWindow(cs);
//Cwork3View绘制
voidCwork3View:
:
OnDraw(CDC*pDC)
{
Cwork3Doc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
if(!
pDoc)
return;
//TODO:
在此处为本机数据添加绘制代码
switch(pDoc->m_change)
{
case1:
pDC->TextOut(10,10,_T("欢迎!
"));
break;
case2:
pDC->TextOut(10,10,_T(""));
break;
}
CStringstate;
//获取状态栏指针
CStatusBar*pStatus;
pStatus=(CStatusBar*)AfxGetApp()->m_pMainWnd->GetDescendantWindow(ID_VIEW_STATUS_BAR);
if(pStatus)
{
switch(pDoc->m_change)
{
case1:
state="显示";
pStatus->SetPaneText(2,state);//显示当前状态
break;
case2:
state="删除";
pStatus->SetPaneText(2,state);//显示当前状态
break;
}
}
}
//Cwork3View打印
BOOLCwork3View:
:
OnPreparePrinting(CPrintInfo*pInfo)
{
//默认准备
returnDoPreparePrinting(pInfo);
}
voidCwork3View:
:
OnBeginPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
{
//TODO:
添加额外的打印前进行的初始化过程
}
voidCwork3View:
:
OnEndPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
{
//TODO:
添加打印后进行的清理过程
}
//Cwork3View诊断
#ifdef_DEBUG
voidCwork3View:
:
AssertValid()const
{
CView:
:
AssertValid();
}
voidCwork3View:
:
Dump(CDumpContext&dc)const
{
CView:
:
Dump(dc);
}
Cwork3Doc*Cwork3View:
:
GetDocument()const//非调试版本是内联的
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(Cwork3Doc)));
return(Cwork3Doc*)m_pDocument;
}
#endif//_DEBUG
//Cwork3View消息处理程序
intCwork3View:
:
OnDraw(void)
{
return0;
}
voidCwork3View:
:
OnContextMenu(CWnd*pWnd,CPointpoint)
{
//TODO:
在此处添加消