实验报告Word格式.docx
《实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《实验报告Word格式.docx(28页珍藏版)》请在冰豆网上搜索。
如果发现任何的编译和连接错误或警告,VC6会在输出子窗口中给出提示。
双击该提示,会转到源程序的出错行。
可以搜索VC6的帮助以获取更多有关编译、连接错误的信息,以便排除这些错误和警告。
错误及警告更正后,应用“RebuildAll”重新进行编辑和连接。
ii.运行程序如需运行连接好的程序,可选“Build”菜单下的“Execute[工程名].exe”菜单项。
iii.调试方法要进入调试状态,可以选择“Build”菜单下“StartDebug”子菜单中的菜单项。
实验二Windows编程基础
思考与练习:
1.简述Windows应用程序的特点。
1.标准的图形界面。
窗口是Windows应用程序基本的操作单元,是应用程序与用户之间交互的接口环境,也是系统管理应用程序的基本单位。
2.Windows程序的执行顺序取决于事件发生的顺序,与硬件无关。
3.Windows应用程序利用Windows消息(事件驱动机制)与其他的Windows应用程序及Windows系统进行信息交换。
2.消息结构体中最重要的数据成员是哪几个?
简述消息附加参数的作用。
消息号、字参数和长字参数。
分别用于标识消息名和相关的附加参数。
附加信息的含义与具体消息号的值有关。
3.什么是句柄类型:
VC++中为何要引入该类型?
一个句柄是指Windows使用的一个唯一的整数值,是一个4字节长的数值,用于标识应用程序中不同的对象和同类对象中不同的实例。
windows需要向程序员提供必要地编程接口,在这些接口中,允许程序员访问、创建和销毁对象。
但是,出于封装地考虑,windows并不想向程序员返回指针。
指针包含了太多的信息。
首先指针给出了对象存储的确切位置;
其次,要操作一个指针,程序员必须知道指针所指对象的内部结构特征,也即,windows必须向程序员暴露相应的数据结构,而这些数据结构也许是操作系统想向程序员隐藏的。
如果说COM技术向用户隐藏了数据,只暴露了接口并只允许按接口定义的方法操作数据的话,句柄这种方式则允许你按自己的方式直接操作数据,但windows又不向你直接暴露数据。
直接操作数据是程序员需要的,不暴露数据是windows所需要的,句柄封装方式实现了各取所需。
应用程序通过句柄能够访问相应的对象信息。
4.简述API和MFC消息处理的特点及两者的区别。
API的全称是应用程序接口。
WindowsAPI是Windows系统和Windows应用程序间的标准程序接口。
凡是在Windows工作环境下执行的应用程式,都可以调用WindowsAPI,API编程没有使用类库编程。
MFC全称是微软基础类库,所谓的VisualC++程序设计其重点就是用MFC进行程序设计。
它使用MFC类库编程。
5.API应用程序中WinMain()函数和WndProc()函数的作用分别是什么?
(根据例程源程序叙述或者用流程图说明)
WinMain()函数,它相当于C语言中的main()函数,是应用程序的入口,这个函数主要做以下工作:
建立应用程序的窗口、建立消息循环。
WndProc()函数可以叫窗口过程或窗口函数,目的只有一个,即处理发往窗口的各种消息,按照API处理消息的模式,对各种收到的消息进行处理,这个函数内部一般是一个switch-case结构。
实验三MFC应用程序基本框架
思考与练习
1、搭建简单应用程序框架需要哪些类?
搭建文档/视图结构的应用程序框架需要哪些类?
简单用程序框架是由CWinApp类和CFrameWnd类搭建的。
文档/视图的应用程序框架是由CWinApp类、CFrameWnd类、CView类、CDocument类和CDocTemplate类搭建的。
2、在简单应用程序框架中CWinApp类和CframeWnd类分别执行了什么工作?
CWinApp类负责应用程序的启动框架窗口维护,例如工具条,菜单,状态条的显示,更新,视图的位置和显示,其他可停靠空间的停靠和动态尺寸的调整。
CframeWnd类作为主窗口管理视图和文档对象。
3、消息WM_LBUTTONDOWN的默认消息映射和消息处理函数是什么?
这一消息的附加参数IParam中存放着什么信息?
消息处理函数的参数如何对这一信息进行分割包装?
消息映射为ON_WM_LBUTTONDOWN
消息处理函数为OnLButtonDown(UINTnFlags,Cpointpoint)
参数IParam用来传递地址,它里面放的是一个指针。
4、Invalidate()函数的作用是什么?
刷新,调用这个函数后会刷新整个矩形客户区,或者部分指定的客户区,区域将会重绘
5、AppWizard和ClassWizard的作用是什么?
AppWizard简化建立项目的编程量。
提供标准化模板。
节省时间,节省操作。
使用户快速、高效地建立自己所需要的应用程序,用户在此基础上添加代码就能够实现功能丰富且具有许多Windows最新特性的应用软件。
ClassWizard创建新类。
进行消息映射。
添加成员变量。
覆盖虚拟函数。
实验四windows绘图
1.CDC类有哪些派生类?
简述CDC类和CClientDC类的一般使用方法。
CDC类的派生类有CPaintDC类CClientDC类和CWindowDC类。
创建一个UseDC的MFC单文档程序,定制7个按钮用来选择使用的DC,每个按钮由一个成员变量标识控制[互斥],其中两个按钮为boolm_bHDC----使用当前视图的对应的DC;
boolm_bCClientDC----使用CClientDC类[视图客户区域DC];
2.写出完成一下功能的消息处理函数:
单击鼠标左键,用一个黄色的三像素宽的实线笔在窗口中心画一个边长为50,50的矩形,矩形内部以黑色的水平、垂直交叉线填充。
CDC*pDC=GetDC();
CBrushnewbrush(HS_CROSS,RGB(0,125,125));
//创建一个新画刷
CBrush*poldbrush;
poldbrush=pDC->
SelectObject(&
newbrush);
//将新画刷选入设备环境
CRectrect;
GetClientRect(&
rect);
Rectangle(100,100,150,150);
pDC->
SelectObject(poldbrush);
//恢复旧画刷
CView:
:
OnLButtonDown(nFlags,point);
3.LOGFONT架构与CFont类之间是什么关系?
结构体TEXTMETRIC的作用是什么?
CFont提供创建字体的成员函数,用CFont创建字体的对象可以通过LOGFONT结构来创建,也就是说CFont是MFC的一种封装。
TEXTMETRIC是在WINGDI.H中定义的型态的结构。
有20个栏位,TEXTMETRIC类型的变量用于存储装置字体结构信息,在窗口中输出文字时需要用到。
4.简述定时器的使用步骤。
1.利用MFCAppWizard创建一个标准的工程,接受所有缺省选项。
名为s1
2.在Classview中选中“CMainFrame”类,然后按Ctrl+W激活ClassWizard,在“MessageMap”选项卡中ClassName选“CMainFrame”,接着在“Message”中选“WM_TIMER”,最后按下“AddFuncation”。
以上步骤加入了对WM_TIMER消息的映射处理。
3.回到Classview中,双击“OnCreate”成员函数,在函数的末尾添加申请Timer的语句:
SetTimer(100,1000,NULL);
//申请一个标识值为100的Timer,定时间隔为1000毫秒(1秒)。
4.在“Classview”中双击OnTimer函数,输入要定时实现的代码。
MessageBeep(1000);
;
//每隔一秒发出通告声
5.编译并执行之,我们可以每隔一秒就听到声音。
这正是我们在OnTimer函数内要求执行的。
6.当不需要计时器的时候,可以调用KillTimer(intnIDEvent)函数清除定时器
5.Invalidate()函数的作用是什么?
实验五菜单、工具栏和状态栏
1.资源描述文件的作用是什么?
资源页面的作用是什么?
资源描述文件使用户直观地了解、方便地使用应用程序所提供的各项功能,是Windows资源中最重要的资源之一。
资源页面提供了许多处理菜单和菜单项的方法,这些方法分别是菜单构造方法、菜单操作方法、菜单项操作方法和虚拟方法等。
2.resource.h文件的作用是什么?
包含所有资源的ID,如果源代码中需要使用这些ID的话,就需要包含这个文件。
3.菜单消息的消息映射为什么不采用标准的消息映射?
在MFC消息映射中,包含两个菜单消息:
WM_COMMAND和UPDATE_COMMAND_UI。
WM_COMMAND消息的消息映射为ON_COMMAND。
为了使应用程序的状态与菜单项保持同步。
4.为什么一般把快捷键和图标资源的ID定义为菜单的ID相同?
图标资源是以位图形式保存的,这一位图资源会放在工程的哪个文件夹中?
让使用者更容易的理解和使用菜单功能。
放在.app文件中。
5.在使用CStatusBar类创建状态栏时,定义了全局数组UNITIndicator[]={ID_SEPARATOR,ID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL},试说明这一全局数组的作用。
用来显示菜单项或工具按钮的提示信息。
6.工具栏类(CStatusBar)如何和工具栏资源进行链接?
创建窗口,将其连接到CStatusBar的对象。
实验六对话框
1、对话框模版怎么样与对话框类进行连接?
在对话框上右键单击,选择建立类向导,建立一个新或者选择一个已有的类进行连接。
2、对话框类拥有自己独立的消息循环,它一般处理什么消息?
按钮控件发出什么消息,其消息映射怎么写,为什么采用这种消息映射?
OnInitDialog()函数是WM_INITDIALOG消息的响应函数。
当对话框接受WM_INITDIALOG消息时,对话框框架及控件已经建立起来,但对话框中的控件还没显示出来。
这样就可在OnInitDialog()函数中设置对话框控件的外观、大小及其他相关内容。
3、IDOK和IDCANCEL按钮的默认处理函数分别是什么?
这两个函数都可以关闭对话框,但为何要使DoModal()函数的返回值不同?
voidCNPenDlg:
OnCancel()
{
CDialog:
OnCancel();
}
OnOK()
OnOK();
这样做使当用户单击OK按钮时,在关闭对话框前也需要向视图发送消息,通知视图进行重绘图形,发送消息的功能与Apply按钮功能相同。
而当单击cancel时,只会关闭对话框。
4、颜色对话框为什么要采用GetColor()函数来获取用户选择的颜色?
调用DoModal()函数显示对话框。
若DoModal()函数的返回值是IDOK,用户所选择的信息将保存在成员变量m_cc中,m_cc是一个CHOOSECOLOR结构的变量。
故通过CColorDialog的成员函数COLORREFGetColor()来获取选择的颜色。
5、文件对话框用什么函数来获取所选文件的完整路径?
GetPathName()
6、DDX数据交换语句根据什么决定控件与数据成员之间的数据交换方向?
数据有效机制(DDV)
7、如何用CFileDialog类来完成文件的打开?
可以利用CImage类来实现:
1)首先,在doc类里添加一个成员变量:
CImagem_image;
2)利用类向导,在doc类里添加打开文件的消息响应函数,在函数里编写代码:
CFileDialogdlg;
dlg.DoModal();
m_image.Load(dlg.GetPathName());
3)在view类的OnDraw函数里,在最后添加:
if(!
pDoc->
m_image.IsNull()){
m_image.Draw(...);
实验七Windows控件的使用
思考和练习
1.单选按钮如何成组?
单选按钮控件组与什么类型的变量进行数据交换?
如果控件组中第二个按钮被选中,则变量的值为多少?
单击“布局”菜单下的“Tab顺序”命令,设置单选按钮的Tab键顺序,尽量保证每一组单选按钮的Tab顺序是连续的。
添加两个单选按钮为一组。
第一个按钮选中Group。
在第二个按钮Group不能选中。
如果一组中有多个单选项,除第一个按钮的Group属性被选中外,同组中其他单选按钮的Group属性都不能被选中,这样才能真正的将按钮进行分组。
单选按钮控件组与整型的变量进行数据交换
当单选按钮控件组中第二个按钮被选中时,则数据交换后对话框数据成员值为1
2.复选框与什么类型的变量进行数据交换?
如果复选框被选中则变量的值为多少?
复选框的数据变量是一个布尔型的变量,如果复选框被选中,则变量的值为TRUE。
3.列表框的支持类是什么?
简述如何给列表框添加选项。
列表框的支持类是Cdialog。
在其消息处理函数中为列表框添加选项。
代码如下:
BOOLCListDlg:
OnInitDialog()
OnInitDialog();
m_CtrlColor.AddString("
红色"
);
绿色"
蓝色"
UpdateData(FALSE);
returnTRUE;
//returnTRUEunlessyousetthefocustoacontrol
//EXCEPTION:
OCXPropertyPagesshouldreturnFALSE
4.组合框可以分为哪几种?
简述下拉组合框与下拉列表的区别。
组合框可以分为简单式组合框、下拉式组合框和下拉列表式组合框3种。
下拉式组合框仅当用户单击了编辑控件右边的下拉箭头后列表框才被显示,下拉列表式组合框外观同下拉式组合框类似,但它的编辑框是只读的,不能输入字符。
实验八动态链接库的使用
1.动态链接和静态链接比较有何优点?
动态链接是指应用程序在执行过程中动态调用库函数,而且无论调用该函数多少次,在内存中只有该函数的一个拷贝,显然这极大地节省了内存空间。
动态链接允许一个模块仅需载入或执行一个导出的DLL函数。
动态链接不同于我们熟悉的静态链接,使用静态链接时,链接程序会把库函数代码拷贝到每个需要的模块中。
可以节省系统内存并减少交换。
调用它们的应用程序不需要进行重新编译或重新链接等等
2.说明函数LoadLibrary()和函数GetProcAddress()的作用。
LoadLibrary函数来加载动态连接库
LoadLibrary尝试使用用于隐式链接的同一搜索序列来定位DLL。
如果系统无法找到DLL或者入口点函数返回FALSE,LoadLibrary将返回NULL。
如果对LoadLibrary的调用所指定的DLL模块已映射到调用进程的地址空间中,则函数仅返回DLL的句柄并递增模块的引用数。
如果DLL有入口点函数,则操作系统在调用LoadLibrary的进程上下文中调用此函数。
GetProcAddress(Hinstance,lpname)用来获取指定的动态连接库函数的地址。
Hinstance为由LoadLibrary返回的模块句柄,lpname为文件名/函数名,返回值,成功返回动态连接库的地址,失败返回NULL。
实验九文件操作
1.什么是“串行化”?
VC++中是通过什么成员函数实现这一功能的?
串行化是指将对象存储到介质(如文件、内存缓冲区等)中或是以二进制方式通过网络传输。
之后可以通过反串行化从这些连续的字节(byte)数据重新构建一个与原始对象状态相同的对象
利用串行化函数Serialize()来完成,格式如下:
Serialize(...)
{
if(...IsStoring())//保存
<
...<
...;
else(...IsLoading())//读出
...>
>
;
2.CFile类的哪几个函数具备文件定位的功能?
BOOLGetStatus(CFileStatus&
rStatus)const;
staticBOOLPASCALGetStatus(LPCTSTRlpszFileName,CFileStatus&
rStatus);
3.怎样用CFile类和CFileDialog类配合使用来完成文件的读写操作?
在读写之前,可以使用文件的定位函数,将文件指针定位到自己需要读写的地方。
文件在刚打开时,文件指针自动定位在文件开始处。
实验10多媒体与网络编程
【测试题1】
测试内容:
编写代码实现制作一个音频文件播放器。
如下图;
只需要实现如图所示的简单界面,点击打开弹出对话框,打开一个.wav的波形音频文件,点击“播放”按钮开始播放,点击“停止”按钮则停止播放,按“关机”按钮则退出应用程序。
实验步骤:
1、在VisualC++平台上,选择File->
New,新建一个名为WaveAudio.h的头文件。
#if!
defined(WAVE_H_INCLUDED_)
#defineWAVE_H_INCLUDED_
#include"
mmsystem.h"
classCWave
public:
BOOLm_bPlaying;
BOOLm_bOpen;
WORDm_wDeviceID;
CWave();
virtual~CWave();
DWORDOpen(CStringstrFileName);
DWORDPlay();
voidStop();
DWORDClose();
};
#endif
2、选择File->
New,新建WaveAudio.cpp文件。
stdafx.h"
afxwin.h"
WaveAudio.h"
CWave:
CWave()
m_bPlaying=FALSE;
m_bOpen=FALSE;
m_wDeviceID=NULL;
~CWave()
Close();
DWORDCWave:
Open(CStringstrFileName)
if(m_bOpen)
Close();
DWORDdwOpenFlag;
MCI_OPEN_PARMSmciOpenParam;
mciOpenParam.lpstrDeviceType="
WaveAudio"
mciOpenParam.lpstrElementName=strFileName;
dwOpenFlag=mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT|MCI_OPEN_TYPE,(DWORD)(LPVOID)&
mciOpenParam);
if(dwOpenFlag)
returndwOpenFlag;
m_wDeviceID=mciOpenParam.wDeviceID;
m_bOpen=TRUE;
dwOpenFlag=0;
MCI_SET_PARMSmciSetParam;
mciSetParam.dwTimeForma