Visual C++Net程序设计开放选修实验实验报告.docx
《Visual C++Net程序设计开放选修实验实验报告.docx》由会员分享,可在线阅读,更多相关《Visual C++Net程序设计开放选修实验实验报告.docx(44页珍藏版)》请在冰豆网上搜索。
VisualC++Net程序设计开放选修实验实验报告
实验一——对话框简单练习
实验学时:
2
实验类型:
设计
实验要求:
必修
一实验目的
通过本次上机实习,能够掌握简单的基于对话框的MFC应用程序的编写,了解Windows编程常用的数据类型,能够使用常用的Win32API函数和.Net控件,为后面实验打下基础。
二实验内容
设计一个四则运算和常用数学非初等运算的计算器。
用到的内容有:
1.多个Win32API函数,有GetDlgItem,SetWindowText,GetWindowText等。
GetDlgItem
该函数检索指定的对话框中的控件句柄。
函数原型HWNDGetDlgItem(intnlDDlgltem);nlDDlgltem:
指定将被检索的控件标识符。
返回值:
如果函数调用成功则返回值为给定控件的窗口句柄。
如果函数调用失败,则返回值为NULL,表示为一个无效的对话框句柄或一个不存在的控件。
若想获得更多错误信息,请调用GetLastError函数。
备注:
可以通过使用任何父子窗口对来使用GetDlgltem函数,而不仅只是对话框。
只要hDlg参数指定一个父窗口,且子窗口有一个独立的标识符(象CreateWindow中hMenu参数指定的或创建子窗口的CreateWindowEx指定的那样),GetDlgltem就会返回一个有效的句柄到子窗口。
GetWindowText
该函数将指定窗口的标题条文本(如果存在)拷贝到一个缓存区内。
如果指定的窗口是一个控件,则拷贝控件的文本。
但是,GetWindowText不能接收其他应用程序中控件的文本。
函数原型:
intGetWindowText(HWNDhWnd,LPTSTRlpString,IntnMaxCount);
参数:
hWnd:
带文本的窗口或控件的句柄。
IpString:
指向接收文本的缓冲区的指针。
nMaxCount:
指定要保存在缓冲区内的字符的最大个数,其中包含NULL字符。
如果文本超过界限,它就被截断。
如果函数成功,返回值是拷贝的字符串的字符个数,不包括中断的空字符;如果窗口无标题栏或文本,或标题栏为空,或窗口或控制的句柄无效,则返回值为零。
若想获得更多错误信息,请调用GetLastError函数。
函数不能返回在其他应用程序中的编辑控件的文本。
SetWindowText
函数功能:
该函数改变指定窗口的标题栏的文本内容(如果窗口有标题栏)。
如果指定窗口是一个控件,则改变控件的文本内容。
然而,SetWindowText函数不改变其他应用程序中的控件的文本内容。
函数原型:
BOOLSetWindowText(HWNDhwnd,LPCTSTRlpString);
参数:
hWnd:
要改变文本内容的窗口或控件的句柄。
lpString:
指向一个空结束的字符串的指针,该字符串将作为窗口或控件的新文本。
返回值:
如果函数成功,返回值为非零;如果函数失败,返回值为零。
2.多个MFC类,有CString类,CMenu类。
CString
CString类的成员函数
1)CString类的构造函数
CString类有很多构造函数,这里只介绍几个比较常用的:
CString(constCString&stringSrc);
将一个已经存在的CString对象stringSrc的内容拷贝到该CString对象。
例如:
CStringstr1(_T(jizhuomi));//将常量字符串拷贝到str1
CStringstr2(str1);//将str1的内容拷贝到str2
CString(LPCTSTRlpch,intnLength);
将字符串lpch中的前nLength个字符拷贝到该CString对象。
例如:
CStringstr(_T("wwwjizhuomi"),3);//构造的字符串对象内容为"www"
CString(TCHARch,intnLength=1);
使用此函数构造的CString对象中将含有nLength个重复的ch字符。
例如:
CStringstr(_T('w'),3);//str为"www"
2)CString类的大小写转换及顺序转换函数
CString&MakeLower();将字符串中的所有大写字符转换为小写字符。
CString&MakeUpper();将字符串中的所有小写字符转换为大写字符。
CString&MakeReverse();将字符串中所有字符的顺序颠倒。
例如:
CStringstr(_T("JiZhuoMi"));
str.MakeLower();//str为"jizhuomi"
str.MakeUpper();//str为"JIZHUOMI"
str.MakeReverse();//str为"IMOUHZIJ"
3)CString对象的连接
多个CString对象的连接可以通过重载运算符+、+=实现。
例如:
CStringstr(_T("jizhuomi"));//str内容为"jizhuomi"
str=_T("www")+str+_T("-");//str为"wwwjizhuomi-"
str+=_T("com");//str为wwwjizhuomi-com
4)CString对象的比较
CString对象的比较可以通过==、!
=、<;、>;、<=、>=等重载运算符实现,也可以使用Compare和CompareNoCase成员函数实现。
intCompare(PCXSTRpsz)const;
将该CString对象与psz字符串比较,如果相等则返回0,如果小于psz则返回值小于0,如果大于psz则返回值大于0。
intCompareNoCase(PCXSTRpsz)constthrow();
此函数与Compare功能类似,只是不区分大小写。
CMenu
CMenu类的成员函数:
1.CreateMenu()和CreatePopupMenu(),这两个函数用来创建一个菜单实例,CreateMenu()创建的是普通的菜单实例,如果想创建弹出式菜单,就要用CreatePopupMenu()函数。
2.AppendMenu()向菜单中添加一个子项,这个函数有两个主要的参数。
第一个UINTnFlags,这个参数表明了该子项的属性特征,可以这样说,这个参数规定了菜单的样式和功能。
后面会详细讲这个参数所能使用的值。
第二个参数UINT_PTRnIDNewItem,根据nFlags使用不同的设置,该参数将标明菜单的资源ID或在这个菜单中的索引号。
第三个参数可以省略,如果不省略,可以传入一个字符串,这个字符串将显示在菜单中(因为我准备用突破表示菜单项,所以我的工程中省略了这个参数)。
3.DrawItem(),这是一个虚函数,如果菜单设置成可以自绘类型,则这个函数将在生成菜单、弹出菜单、选中菜单、点击菜单等时由系统框架调用。
因此,这个函数是一个很有用的函数,它可以帮你绘制出各种样式的菜单。
4.MeasureItem()也是一个虚函数,当菜单被创建的时候由系统框架调用。
这个函数用来设置菜单的大小。
二、nFlags说明:
只有当nFlags设置成MF_OWNERDRAW的时候,系统框架才会重绘菜单。
MF_CHECKED:
命令旁显示默认复选标志
MF_UNCHECKED:
清除命令旁的复选标志
MF_DISABLED:
禁止此菜单命令,但是不变灰显示
MF_ENABLED:
允许此菜单命令,恢复到正常状态
MF_GRAYED:
禁止此菜单命令,变灰显示
MF_MENUBARBREAK:
对于静态菜单,放到新行;对于弹出菜单,放到新栏中,栏间有分隔线
MF_MENUBREAK:
对于静态菜单,放到新行;对于弹出菜单,放到新栏,栏间无分隔线
MF_OWNERDRAW:
指定该命令是自画式菜单命令
MF_POPUP:
指定该菜单命令有一个关联的弹出式菜单
MF_SEPARATOR:
画一条水平分隔线,只用于弹出式菜单
MF_STRING:
指定此菜单命令是一个字符串
CMenu类从CObject类派生而来。
为什么要使用CMenu类呢?
AppWzard不是把菜单做好了吗?
在资源编辑器上修改菜单不是很方便吗?
感觉学vc++稍微深入一点好,至少要能搞清楚AppWizard在背后都干了些什么东西。
事实上mfc就是用CMenu类来生成菜单的。
让我们就从CMenu开始吧。
CMenu生成的菜单有两种:
Popup类型和非Popup类型。
这两种方法里又可以分
成使用资源编辑器生成的菜单资源和不使用这个资源。
对于非Popup类型的菜单,
必须在创建出来后把它张贴到某个窗口上,它才会显示出来,从而才有用处。
Po
pup的菜单却不能张贴到窗口上。
说明之前,先定义几个常量:
#defineIDM_MENU00
#defineIDM_MENU11
#defineIDM_MENU22
#defineIDM_MENU33
#defineIDM_ITEM010
#defineIDM_ITEM111
#defineIDM_ITEM212
#defineIDM_ITEM313
#defineIDM_ITEM414
#defineIDM_ITEM515
#defineIDM_ITEM616
3.字符串到数值的转换函数,有atoi,atof。
atoi
C语言库函数名:
atoi
功能:
把字符串转换成整型数。
名字来源:
arraytointeger的缩写。
原型:
intatoi(constchar*nptr);
函数说明:
参数nptr字符串,如果第一个非空格字符不存在或者不是数字也不是正负号则返回零,否则开始做类型转换,之后检测到非数字(包括结束符\0)字符时停止转换,返回整型数。
头文件:
#include
4.若干控件,有Button,EditControl,Menu资源。
三实验组织运行要求
实验前,由任课教师落实实验任务,每个学生事先编写好算法设计源程序代码。
集中上机、调试并通过计算机图形可视化演示操作实例来测试。
四实验条件
为每个学生提供一台具有WINDOWS98/XP/NT/2000操作系统的计算机;同时提供VisualC++.Net2005编程软件。
五实验步骤
1.建立基于对话框的MFC应用程序。
2.添加需要的控件和资源。
3.编写程序并调试。
4.实验完毕后提交实验报告。
六源程序
voidCCalculatorDlg:
:
OnBnClickedButton1()
{
if(m_Seq==false)
{
if(m_Point==false)
a1=a1*10+1;
else
{
m_Time/=10;
a1+=1*m_Time;
}
CStringmStr;
mStr.Format("%f",a1);
GetDlgItem(IDC_EDIT1)->SetWindowTextA(mStr);
}
else
{
if(m_Point==false)
a2=a2*10+1;
else
{
m_Time/=10;
a2+=1*m_Time;
}
CStringmStr;
mStr.Format("%f",a2);
GetDlgItem(IDC_EDIT1)->SetWindowTextA(mStr);
}
}
voidCCalculatorDlg:
:
OnBnClickedButton12()
{
m_Seq=true;
m_Cal=0;
m_Point=false;
m_Time=1;
}
voidCCalculatorDlg:
:
OnBnClickedButton11()
{
m_Point=true;
}
voidCCalculatorDlg:
:
OnBnClickedButton16()
{
CStringmStr;
a1=a1+a2;
mStr.Format("%f",a1);
GetDlgItem(IDC_EDIT1)->SetWindowTextA(mStr);
}
实验二——图形绘制
实验学时:
4
实验类型:
设计
实验要求:
必修
一实验目的
通过该课程实习,学会使用CDC进行图形的绘制和图像显示。
二实验内容
本实验使用CDC类自动绘制自选中心和半径的五角星。
用到CDC类。
CDC类定义的是设备上下文对象的类。
CDC对象提供处理显示器或打印机等设备上下文的成员函数,以及处理与窗口客户区对应的显示上下文的成员。
通过CDC对象的成员函数进行所有的绘图。
类对设备上下文操作提供了成员函数,处理绘图工具。
安全型图形设备接口对象收集,以及处理颜色和调色板。
它还为获取和设置绘图属性、映射,处理视点、窗口扩展、转换坐标,处理区域、剪贴、绘制直线及绘制简单椭圆和多边形等形状提供了成员函数。
另外还为绘制文本、处理字体,使用打印机跳转,滚动和播放元文件提供成员函数。
使用CDC对象时要构造它,然后调用与它平等的、使用设备上下文的Windows函数的成员函数。
CDC类的数据成员:
HDCm_hDC:
CDC对象使用的输出设备上下文
HDCm_hAttribDC:
CDC对象使用的属性设备上下文
二者在CDC对象创建时指向相同的设备上下文。
需要包含头文件:
#include
使用CDC类型指针pDC前,首先需要使用GetDC函数与对话框关联,使用后需要使用ReleaseDC函数取消关联。
三实验组织运行要求
实验前,由任课教师落实实验任务,每个学生事先编写好算法设计源程序代码。
集中上机、调试并通过计算机图形可视化演示操作实例。
四实验条件
为每个学生提供一台具有WINDOWS98/XP/NT/2000操作系统的计算机;同时提供VC++/VB/JAVA/TC等集成语言开发环境。
五实验步骤
1、建立基于对话框的MFC应用程序。
2、计算给定圆心与半径的五角星的顶点坐标,并存放于数组中。
3、编程实现并调试。
4、实验完毕后提交实验报告。
六源程序
voidCDrawDlg:
:
OnBnClickedButton1()
{
CDC*pDC=GetDC();
CStringmStr;
mStr="X";
pDC->MoveTo(0,200);
pDC->LineTo(400,200);
pDC->LineTo(390,190);
pDC->MoveTo(400,200);
pDC->LineTo(390,210);
pDC->TextOutA(380,220,mStr);
mStr="Y";
pDC->MoveTo(200,400);
pDC->LineTo(200,0);
pDC->LineTo(190,10);
pDC->MoveTo(200,0);
pDC->LineTo(210,10);
pDC->TextOutA(220,20,mStr);
mStr="O";
pDC->TextOutA(220,180,mStr);
ReleaseDC(pDC);
}
voidCDrawDlg:
:
OnBnClickedButton2()
{
CStringmFilter="压缩格式|*.jpg||";
CFileDialogmDlg(true,NULL,NULL,NULL,mFilter);
if(mDlg.DoModal()!
=IDOK)
return;
m_Image.Load(mDlg.GetPathName());
CDC*pDC=GetDC();
intW=m_Image.GetWidth();
intH=m_Image.GetHeight();
m_Image.Draw(pDC->m_hDC,0,0,W,H);
ReleaseDC(pDC);
}
voidCDrawDlg:
:
OnLButtonDown(UINTnFlags,CPointpoint)
{
p_DC=GetDC();
m_Draw=true;
CDialog:
:
OnLButtonDown(nFlags,point);
}
voidCDrawDlg:
:
OnMouseMove(UINTnFlags,CPointpoint)
{
if(m_Draw==true)
{
if(m_First==false)
{
p_DC->MoveTo(point.x,point.y);
m_First=true;
}
p_DC->LineTo(point.x,point.y);
}
CDialog:
:
OnMouseMove(nFlags,point);
}
voidCDrawDlg:
:
OnLButtonUp(UINTnFlags,CPointpoint)
{
m_Draw=false;
m_First=false;
CDialog:
:
OnLButtonUp(nFlags,point);
}
实验三——文件操作
实验学时:
4
实验类型:
综合/设计
实验要求:
必修
一实验目的
通过本次实验,熟悉CFile文件类的使用。
二实验内容
本实验使用CFile类通过MFC对话框向文件中插入字符串。
CFile是MFC文件类的基类,它直接提供非缓冲的二进制磁盘输入/输出设备,并直接地通过派生类支持文本文件和内存文件。
CFile与CArchive类共同使用,支持MFC对象的串行化。
该类与其派生类的层次关系让程序通过多形CFile接口操作所有文件对象。
例如,一个内存文件相当一个磁盘文件。
使用CFile及其派生类进行一般目的的磁盘I/O,使用ofstream或其它Microsoft输入输出流类将格式化文本送到磁盘文件。
通常,一个磁盘文件在CFile构造时自动打开并在析构时关闭。
静态成员函数使你可以在不打开文件的情况下检查文件状态。
使用前包含头文件#include
CFile类的成员
数据成员
m_hFile常包含操作系统文件句柄
构造函数
CFile从一个路径或文件句柄构造一个CFile对象;
Abort不管任何警告和错误,关闭一个文件;
Duplicate构造一个基于该文件的副本;
Open带错误检验选项,安全打开一个文件;
Close关闭文件,删除对象。
输入/输出
Read从文件的当前位置读数据;
ReadHuge可从文件的当前位置读取大于64K数据,在32位编程中废弃了,见Read;
Write将文件数据写入当前文件位置;
WriteHuge可将文件的大于64K数据写到当前文件位置,在32位编程中废弃了,见Write;
Flush溢去未被写入的任何数据。
定位
Seek定位于当前文件指针;
SeekToBegin定位当前文件指针到文件开头;
SeekToEnd定位当前文件指针到文件尾;
GetLength获取文件长度;
SetLength改变文件长度。
封锁
LockRange在文件中封锁一定范围内的字节;
UnlockRange解锁一定范围内的字节。
状态
GetPosition获取当前文件指针;
GetStatus获取打开文件的状态;
GetFileName获取被选文件的文件名;
GetFileTitle获取被选文件的标题;
GetFilePath获取被选文件的完整路径;
SetFilePath设置被选文件的完整路径
静态
Rename改名指定文件(静态函数);
Remove删除指定文件(静态函数);
GetStatus获取指定文件的状态(静态,虚函数);//注,此处错误:
静态函数不会是虚函数了。
SetStatus设置指定文件的状态(静态,虚函数)//同上
三实验组织运行要求
实验前,由任课教师落实实验任务,每个学生事先编写好算法设计源程序代码。
集中上机、调试并通过计算机图形可视化程序。
四实验条件
为每个学生提供一台具有WINDOWS98/XP/NT/2000操作系统的计算机;同时提供VC++/VB/JAVA/TC等集成语言开发环境。
五实验步骤
1、建立基于对话框的MFC应用程序。
2、设计文件的创建、修改、保存模块。
3、编程实现并调试。
4、实验完毕后提交实验报告。
六源程序
CStringmStr1="c:
\\abc.txt";//CString为MFC中串类,亦包含于afx.h中,功能较string强大
CFilemFile;
mFile.Open(mStr1,CFile:
:
modeWrite|CFile:
:
modeCreate);//modeCreate模式指若无此文件,则创建之。
cout<mFile.Write("c:
\\abc.txt",sizeof("c:
\\abc.txt"));
mFile.Close();
实验四——动态链接库
实验学时:
6
实验类型:
设计
实验要求:
必修
一实验目的
通过本次实验,熟练动态链接库文件的创建和动态调用方法。
二实验内容
本实验编写计算五角星顶点的dll文件,并调用该文件绘图。
在动态链接库文件程序中将需要导出的函数前加extern”C”_declspec(dllexport)。
程序中的一些不需要被主程序直接调用的函数前不需添加。
生成dll文件后,将其拷入需调用该dll的项目文件夹中。
在项目中用LoadLibrary、GetPoreAddress和FreeLibrary函数动态调用dll文件。
LoadLibrary函数原型为HMODULELoadLibrary(LPCTSTRlpFileName);
参数为指定可执行模块的名称。
返回值类型HMODULE和HINSTANCE句柄类型可通用。
FreeLibrary的原型与LoadLibrary类似。
GetProcAddress函数检索指定的动态链接库(DLL)中的输出库函数地址。
函数原型
FARPROCGetProcAddress(
HMODULEhModule,//DLL模块句柄
LPCSTRlpProcName//函数名
);
参数
hModule
包含此函数的DLL模