橡皮筋技术实验报告.docx
《橡皮筋技术实验报告.docx》由会员分享,可在线阅读,更多相关《橡皮筋技术实验报告.docx(35页珍藏版)》请在冰豆网上搜索。
橡皮筋技术实验报告
作业
橡皮筋技术
班级:
2015级计算机科学与技术(专升本)
学号:
150907190108
姓名:
田林玉
课程名称:
人机交互基础教程
人机交互实验报告
实验名称:
橡皮筋技术实验日期:
2016.9月
姓名:
田林玉班级:
15级计科专升本
实验目的
1.掌握橡皮筋技术的实现原理和方法;
2.掌握Vs2010C++集成编译环境的使用,常用图形程序设计、鼠标编译、橡皮筋交互技术。
实验体会:
我们认识到是通过对VS2010C++的学习,掌握C++图形程序设计的方法,为计算机图形学原理部分的算法实现提供程序工具和方法。
其实,如果需要真正做一个应用,我们会发现前面的知识还远远不够。
这项任务,也许代码不是很完善,需要改进,以后一定更加努力,争取进步。
主要代码:
MainFrm.cpp
//MainFrm.cpp:
CMainFrame类的实现
#include"stdafx.h"
#include"tly.h"
#include"MainFrm.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#endif
//CMainFrame
IMPLEMENT_DYNCREATE(CMainFrame,CFrameWndEx)
constintiMaxUserToolbars=10;
constUINTuiFirstUserToolBarId=AFX_IDW_CONTROLBAR_FIRST+40;
constUINTuiLastUserToolBarId=uiFirstUserToolBarId+iMaxUserToolbars-1;
BEGIN_MESSAGE_MAP(CMainFrame,CFrameWndEx)
ON_WM_CREATE()
ON_COMMAND(ID_VIEW_CUSTOMIZE,&CMainFrame:
:
OnViewCustomize)
ON_REGISTERED_MESSAGE(AFX_WM_CREATETOOLBAR,&CMainFrame:
:
OnToolbarCreateNew)
END_MESSAGE_MAP()
staticUINTindicators[]=
{
ID_SEPARATOR,//状态行指示器
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
//CMainFrame构造/析构
CMainFrame:
:
CMainFrame()
{
//TODO:
在此添加成员初始化代码
}
CMainFrame:
:
~CMainFrame()
{
}
intCMainFrame:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{
if(CFrameWndEx:
:
OnCreate(lpCreateStruct)==-1)
return-1;
BOOLbNameValid;
//设置用于绘制所有用户界面元素的视觉管理器
CMFCVisualManager:
:
SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2008));
if(!
m_wndMenuBar.Create(this))
{
TRACE0("未能创建菜单栏\n");
return-1;//未能创建
}
m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle()|CBRS_SIZE_DYNAMIC|CBRS_TOOLTIPS|CBRS_FLYBY);
//防止菜单栏在激活时获得焦点
CMFCPopupMenu:
:
SetForceMenuFocus(FALSE);
if(!
m_wndToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||
!
m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons?
IDR_MAINFRAME_256:
IDR_MAINFRAME))
{
TRACE0("未能创建工具栏\n");
return-1;//未能创建
}
CStringstrToolBarName;
bNameValid=strToolBarName.LoadString(IDS_TOOLBAR_STANDARD);
ASSERT(bNameValid);
m_wndToolBar.SetWindowText(strToolBarName);
CStringstrCustomize;
bNameValid=strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE);
ASSERT(bNameValid);
m_wndToolBar.EnableCustomizeButton(TRUE,ID_VIEW_CUSTOMIZE,strCustomize);
//允许用户定义的工具栏操作:
InitUserToolbars(NULL,uiFirstUserToolBarId,uiLastUserToolBarId);
if(!
m_wndStatusBar.Create(this))
{
TRACE0("未能创建状态栏\n");
return-1;//未能创建
}
m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT));
//TODO:
如果您不希望工具栏和菜单栏可停靠,请删除这五行
m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockPane(&m_wndMenuBar);
DockPane(&m_wndToolBar);
//启用VisualStudio2005样式停靠窗口行为
CDockingManager:
:
SetDockingMode(DT_SMART);
//启用VisualStudio2005样式停靠窗口自动隐藏行为
EnableAutoHidePanes(CBRS_ALIGN_ANY);
//启用工具栏和停靠窗口菜单替换
EnablePaneMenu(TRUE,ID_VIEW_CUSTOMIZE,strCustomize,ID_VIEW_TOOLBAR);
//启用快速(按住Alt拖动)工具栏自定义
CMFCToolBar:
:
EnableQuickCustomization();
if(CMFCToolBar:
:
GetUserImages()==NULL)
{
//加载用户定义的工具栏图像
if(m_UserImages.Load(_T(".\\UserImages.bmp")))
{
CMFCToolBar:
:
SetUserImages(&m_UserImages);
}
}
//启用菜单个性化(最近使用的命令)
//TODO:
定义您自己的基本命令,确保每个下拉菜单至少有一个基本命令。
CListlstBasicCommands;
lstBasicCommands.AddTail(ID_FILE_NEW);
lstBasicCommands.AddTail(ID_FILE_OPEN);
lstBasicCommands.AddTail(ID_FILE_SAVE);
lstBasicCommands.AddTail(ID_FILE_PRINT);
lstBasicCommands.AddTail(ID_APP_EXIT);
lstBasicCommands.AddTail(ID_EDIT_CUT);
lstBasicCommands.AddTail(ID_EDIT_PASTE);
lstBasicCommands.AddTail(ID_EDIT_UNDO);
lstBasicCommands.AddTail(ID_APP_ABOUT);
lstBasicCommands.AddTail(ID_VIEW_STATUS_BAR);
lstBasicCommands.AddTail(ID_VIEW_TOOLBAR);
CMFCToolBar:
:
SetBasicCommands(lstBasicCommands);
return0;
}
BOOLCMainFrame:
:
PreCreateWindow(CREATESTRUCT&cs)
{
if(!
CFrameWndEx:
:
PreCreateWindow(cs))
returnFALSE;
//TODO:
在此处通过修改
//CREATESTRUCTcs来修改窗口类或样式
returnTRUE;
}
//CMainFrame诊断
#ifdef_DEBUG
voidCMainFrame:
:
AssertValid()const
{
CFrameWndEx:
:
AssertValid();
}
voidCMainFrame:
:
Dump(CDumpContext&dc)const
{
CFrameWndEx:
:
Dump(dc);
}
#endif//_DEBUG
//CMainFrame消息处理程序
voidCMainFrame:
:
OnViewCustomize()
{
CMFCToolBarsCustomizeDialog*pDlgCust=newCMFCToolBarsCustomizeDialog(this,TRUE/*扫描菜单*/);
pDlgCust->EnableUserDefinedToolbars();
pDlgCust->Create();
}
LRESULTCMainFrame:
:
OnToolbarCreateNew(WPARAMwp,LPARAMlp)
{
LRESULTlres=CFrameWndEx:
:
OnToolbarCreateNew(wp,lp);
if(lres==0)
{
return0;
}
CMFCToolBar*pUserToolbar=(CMFCToolBar*)lres;
ASSERT_VALID(pUserToolbar);
BOOLbNameValid;
CStringstrCustomize;
bNameValid=strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE);
ASSERT(bNameValid);
pUserToolbar->EnableCustomizeButton(TRUE,ID_VIEW_CUSTOMIZE,strCustomize);
returnlres;
}
BOOLCMainFrame:
:
LoadFrame(UINTnIDResource,DWORDdwDefaultStyle,CWnd*pParentWnd,CCreateContext*pContext)
{
//基类将执行真正的工作
if(!
CFrameWndEx:
:
LoadFrame(nIDResource,dwDefaultStyle,pParentWnd,pContext))
{
returnFALSE;
}
//为所有用户工具栏启用自定义按钮
BOOLbNameValid;
CStringstrCustomize;
bNameValid=strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE);
ASSERT(bNameValid);
for(inti=0;i{
CMFCToolBar*pUserToolbar=GetUserToolBarByIndex(i);
if(pUserToolbar!
=NULL)
{
pUserToolbar->EnableCustomizeButton(TRUE,ID_VIEW_CUSTOMIZE,strCustomize);
}
}
returnTRUE;
}
MainFrm.h
//MainFrm.h:
CMainFrame类的接口
//#include
//SetConsoleTitle(L"新名字");
#pragmaonce
classCMainFrame:
publicCFrameWndEx
{
protected:
//仅从序列化创建
CMainFrame();
DECLARE_DYNCREATE(CMainFrame)
//特性
public:
//操作
public:
//重写
public:
virtualBOOLPreCreateWindow(CREATESTRUCT&cs);
virtualBOOLLoadFrame(UINTnIDResource,DWORDdwDefaultStyle=WS_OVERLAPPEDWINDOW|FWS_ADDTOTITLE,CWnd*pParentWnd=NULL,CCreateContext*pContext=NULL);
//实现
public:
virtual~CMainFrame();
#ifdef_DEBUG
virtualvoidAssertValid()const;
virtualvoidDump(CDumpContext&dc)const;
#endif
protected:
//控件条嵌入成员
CMFCMenuBarm_wndMenuBar;
CMFCToolBarm_wndToolBar;
CMFCStatusBarm_wndStatusBar;
CMFCToolBarImagesm_UserImages;
//生成的消息映射函数
protected:
afx_msgintOnCreate(LPCREATESTRUCTlpCreateStruct);
afx_msgvoidOnViewCustomize();
afx_msgLRESULTOnToolbarCreateNew(WPARAMwp,LPARAMlp);
DECLARE_MESSAGE_MAP()
};
tly.cpp
//tly.cpp:
定义应用程序的类行为。
//
#include"stdafx.h"
#include"afxwinappex.h"
#include"afxdialogex.h"
#include"tly.h"
#include"MainFrm.h"
#include"tlyDoc.h"
#include"tlyView.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#endif
//CtlyApp
BEGIN_MESSAGE_MAP(CtlyApp,CWinAppEx)
ON_COMMAND(ID_APP_ABOUT,&CtlyApp:
:
OnAppAbout)
//基于文件的标准文档命令
ON_COMMAND(ID_FILE_NEW,&CWinAppEx:
:
OnFileNew)
ON_COMMAND(ID_FILE_OPEN,&CWinAppEx:
:
OnFileOpen)
//标准打印设置命令
ON_COMMAND(ID_FILE_PRINT_SETUP,&CWinAppEx:
:
OnFilePrintSetup)
END_MESSAGE_MAP()
//CtlyApp构造
CtlyApp:
:
CtlyApp()
{
m_bHiColorIcons=TRUE;
//支持重新启动管理器
m_dwRestartManagerSupportFlags=AFX_RESTART_MANAGER_SUPPORT_ALL_ASPECTS;
#ifdef_MANAGED
//如果应用程序是利用公共语言运行时支持(/clr)构建的,则:
//1)必须有此附加设置,“重新启动管理器”支持才能正常工作。
//2)在您的项目中,您必须按照生成顺序向System.Windows.Forms添加引用。
System:
:
Windows:
:
Forms:
:
Application:
:
SetUnhandledExceptionMode(System:
:
Windows:
:
Forms:
:
UnhandledExceptionMode:
:
ThrowException);
#endif
//TODO:
将以下应用程序ID字符串替换为唯一的ID字符串;建议的字符串格式
//为CompanyName.ProductName.SubProduct.VersionInformation
SetAppID(_T("tly.AppID.NoVersion"));
//TODO:
在此处添加构造代码,
//将所有重要的初始化放置在InitInstance中
}
//唯一的一个CtlyApp对象
CtlyApptheApp;
//CtlyApp初始化
BOOLCtlyApp:
:
InitInstance()
{
//如果一个运行在WindowsXP上的应用程序清单指定要
//使用ComCtl32.dll版本6或更高版本来启用可视化方式,
//则需要InitCommonControlsEx()。
否则,将无法创建窗口。
INITCOMMONCONTROLSEXInitCtrls;
InitCtrls.dwSize=sizeof(InitCtrls);
//将它设置为包括所有要在应用程序中使用的
//公共控件类。
InitCtrls.dwICC=ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
CWinAppEx:
:
InitInstance();
//初始化OLE库
if(!
AfxOleInit())
{
AfxMessageBox(IDP_OLE_INIT_FAILED);
returnFALSE;
}
AfxEnableControlContainer();
EnableTaskbarInteraction(FALSE);
//使用RichEdit控件需要AfxInitRichEdit2()
//AfxInitRichEdit2();
//标准初始化
//如果未使用这些功能并希望减小
//最终可执行文件的大小,则应移除下列
//不需要的特定初始化例程
//更改用于存储设置的注册表项
//TODO:
应适当修改该字符串,
//例如修改为公司或组织名
SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
LoadStdProfileSettings(4);//加载标准INI文件选项(包括MRU)
InitContextMenuManager();
InitKeyboardManager();
InitTooltipManager();
CMFCToolTipInfottParams;
ttParams.m_bVislManagerTheme=TRUE;
theApp.GetTooltipManager()->SetTooltipParams(AFX_TOOLTIP_TYPE_ALL,
RUNTIME_CLASS(CMFCToolTipCtrl),&ttParams);
//注册应用程序的文档模板。
文档模板
//将用作文档、框架窗口和视图之间的连接
CSingleDocTemplate*pDocTemplate;
pDocTemplate=newCSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CtlyDoc),
RUNTIME_CLASS(CMainFrame),//主SDI框架窗口
RUNTIME_CLASS(CtlyView));
if(!
pDocTemplate)
returnFALSE;
AddDocTemplate(pDocTemplate);
//分析标准shell命令、DDE、打开文件操作的命令行
CCommandLineInfocmdInfo;
ParseCommandLine(cmdInfo);
//调度在命令行中指定的命令。
如果
//用/RegServer、/Register、/Unregserver或/Unregister启动应用程序,则返回FALSE。
if(!
ProcessShellCommand(cmdInfo))
returnFALSE;
//唯一的一个窗口已初始化,因此显示它并对其进行更新
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
//仅当具有后缀时才调用DragAcceptFiles
//在SDI应用程序中,这应在ProcessShellCommand之后发生
returnTRUE;
}
intCtlyApp:
:
ExitInstance()
{
//TODO:
处理可能已添加的附加资源
AfxOleTerm(FALSE);
returnCWinAppEx:
:
ExitInstance();
}
//CtlyApp消息处理程序
//用于应用程序“关于”菜单项的CAboutDlg对话框
classCAboutDlg:
publicCDialogEx