文档库

最新最全的文档下载
当前位置:文档库 > 面向对象实验指导(学生用书)

面向对象实验指导(学生用书)

实验一windows编程基础

实验目的:

了解windows编程的概念和基础,会使用VC6.0编写windows程序,了解VC6.0编译环境下的类视图及其与文件列表之间的关系。

预备知识:

1.操作系统能够感知输入设备的变化(事件),并且能够知道具体的事件情况,但操作系统并不决定对这一事件如何作出反应,而是将这一事件转交给应用程序,由应用程序决定如何对这一事件作出反应。对事件作出反应的过程就是。

2.操作系统是怎样将感知到的事件传递给应用程序的呢?这是通过来实现的。操作系统将每个事件都包装成一个称为来传递给应用程序。

实验内容

1.建立一个空的win32应用程序工程,设计一个最简单的窗口;

#include

#include

#include

LRESULT CALLBACK WinFuProc(

HWND hwnd, // handle to window

UINT uMsg, // message identifier

WPARAM wParam, // first message parameter

LPARAM lParam // second message parameter

);

int WINAPI WinMain(

HINSTANCE hInstance, // handle to current instance

HINSTANCE hPrevInstance, // handle to previous instance

LPSTR lpCmdLine, // command line

int nCmdShow // show state

)

{

///////////////////////////////////////////////

//创建窗口第1步创建窗口类

///////////////////////////////////////////////

WNDCLASS wndcls;

wndcls.cbClsExtra=0;

wndcls.cbWndExtra=0;

wndcls.hbrBackground=(HBRUSH)GetStockObject(WHITE_PEN);

wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);

wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);

wndcls.hInstance=hInstance;

wndcls.lpfnWndProc=WinFuProc;

wndcls.lpszClassName="MyWindow";

wndcls.lpszMenuName=NULL;

wndcls.style=CS_HREDRAW | CS_VREDRAW;

///////////////////////////////////////////////

//创建窗口第2步注册窗口

///////////////////////////////////////////////

RegisterClass(&wndcls);

///////////////////////////////////////////////

//创建窗口第3步创建窗口

///////////////////////////////////////////////

HWND hwnd;

hwnd=CreateWindow("MyWindow","CreatWindow",WS_OVERLAPPEDWINDOW, 0,0,600,400,NULL,NULL,hInstance,NULL);

///////////////////////////////////////////////

//创建窗口第4步显示窗口

///////////////////////////////////////////////

ShowWindow(hwnd,SW_SHOWNORMAL);

///////////////////////////////////////////////

//创建窗口第5步更新窗口

///////////////////////////////////////////////

UpdateWindow(hwnd);

/**/MSG msg;

while(GetMessage(&msg,NULL,0,0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return msg.wParam;

}

LRESULT CALLBACK WinFuProc(

HWND hwnd, // handle to window

UINT uMsg, // message identifier

WPARAM wParam, // first message parameter

LPARAM lParam // second message parameter

)

{

return DefWindowProc(hwnd,uMsg,wParam,lParam);

}

2.了解VC6.0编译环境下的类视图及其与文件列表之间的关系

实验结果

截图

实验二利用Windows API绘制窗口

实验目的:

进一步了解windows编程的概念和基础

了解windows窗口运行机制

预备知识:

是Windows系统的一个内部数据结构的实例,由一个“窗口句柄”标识,Windows 系统创建它并给它分配系统资源。

创建一个完整的窗口需要经过下面四个操作步骤:

实验内容

编写一个基于消息响应的windows窗口程序

#include

#include

#include

//int x = 0;

//int y = 0;

LRESULT CALLBACK WinFuProc(

HWND hwnd, // handle to window

UINT uMsg, // message identifier

WPARAM wParam, // first message parameter

LPARAM lParam // second message parameter

);

int WINAPI WinMain(

HINSTANCE hInstance, // handle to current instance

HINSTANCE hPrevInstance, // handle to previous instance

LPSTR lpCmdLine, // command line

int nCmdShow // show state

)

{

///////////////////////////////////////////////

//创建窗口第1步

///////////////////////////////////////////////

WNDCLASS wndcls;

wndcls.cbClsExtra=0;

wndcls.cbWndExtra=0;

wndcls.hbrBackground=(HBRUSH)GetStockObject(WHITE_PEN);

wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);

wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);

wndcls.hInstance=hInstance;

wndcls.lpfnWndProc= ;

wndcls.lpszClassName="MyWindow";

wndcls.lpszMenuName=NULL;

wndcls.style=CS_HREDRAW | CS_VREDRAW;

///////////////////////////////////////////////

//创建窗口第2步

///////////////////////////////////////////////

RegisterClass(&wndcls);

///////////////////////////////////////////////

//创建窗口第3步

///////////////////////////////////////////////

HWND hwnd;

hwnd=CreateWindow("MyWindow","CreatWindow",WS_OVERLAPPEDWINDOW, 0,0,600,400,NULL,NULL,hInstance,NULL);

///////////////////////////////////////////////

//创建窗口第4步

///////////////////////////////////////////////

ShowWindow (hwnd,SW_SHOWNORMAL);

///////////////////////////////////////////////

//更新窗口

///////////////////////////////////////////////

UpdateWindow (hwnd);

MSG msg;

while(GetMessage(&msg,NULL,0,0))

{

TranslateMessage (&msg);

DispatchMessage(&msg);

}

return msg.wParam;

}

LRESULT CALLBACK WinFuProc(

HWND hwnd, // handle to window

UINT uMsg, // message identifier

WPARAM wParam, // first message parameter

LPARAM lParam // second message parameter

)

{

switch(uMsg)

{

case WM_CHAR:

char szChar[20];

sprintf(szChar,"char code is %d",wParam);

// sprintf(szChar,"char code is %c",wParam);

MessageBox(hwnd,szChar,"char",0);

HDC hdC;

hdC=GetDC(hwnd);

TextOut(hdC,0,100,szChar,strlen(szChar));

break;

case WM_LBUTTONDOWN:

//编写程序实现对鼠标左键点击消息响应,每点击一下鼠标,对点击次数计数并在

//窗口上显示

char s2[20];

HDC hDC1;

//PAINTSTRUCT ps;

hDC=GetDC(hwnd);

TextOut(hDC1,0,20,s2,strlen(s2));

break;

case WM_PAINT:

// char s2[20];

HDC hDC;

PAINTSTRUCT ps;

hDC=BeginPaint(hwnd,&ps);

// sprintf(s2,"屏幕重绘次数: %d",y);

TextOut(hDC,0,0,"屏幕重绘",strlen("屏幕重绘"));

// TextOut(hDC,0,0,s2,strlen(s2));

// y++;

EndPaint(hwnd,&ps);

break;

case WM_CLOSE:

if(IDYES==MessageBox(hwnd,"是否真的结束?","message",MB_YESNO))

{

DestroyWindow(hwnd);

}

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

default:

return DefWindowProc(hwnd,uMsg,wParam,lParam);

}

return 0;

}

实验结果

截图

实验三类和对象

实验目的:

了解类和对象的概念和基础,掌握类的派生和继承、类的多态性,掌握虚函数的使用。预备知识:

1什么是类和对象

2继承和派生是什么?有哪些类型?多重派生有什么隐患,如何解决?

3什么是多态性?有哪几种多态?

4什么是函数的重载?

5什么是虚函数?它和函数重载的异同是什么?

实验内容

1.编写一个程序,实现类的派生、多态性

#include

class A

{

public:

virtual void f(){cout << "A::f" << endl;};

};

class B:public A

{

public:

virtual void f(){cout << "B::f" << endl;};

};

class C:public A

{

public:

virtual void f(){cout << "C::f" << endl;};

};

void test(A *a)

{

a->f();

};

int main(int argc, char* argv[])

{

B *b=new B;

C *c=new C;

char choice;

do

{

cout<<"type B for class B,C for class C:"<

cin>>choice;

if(choice=='b')

test(b);

else if(choice=='c')

test(c);

}

while(1);

cout<

return 0;

}

2.用重载来实现上述功能。

实验结果

截图

面向对象实验指导(学生用书)

实验四MFC编程基础

实验目的:

了解MFC编程的方法,会使用MFC编写简单的程序。

实验内容

创建对话框

首先打开安装好的Microsoft Visual C++,点击“File->New..”.菜单:弹出“New”对话

框,选择标签下的“MFC AppWizard”:在右边的Project name下和Location下

面向对象实验指导(学生用书)

分别填入工程名和工程保存路径:点击,进入MFC建立向导(MFC AppWizard),在这里有三种模式,分别是Single document(单文档),Multiple documents(多文档),Dialog(对话框),我们会在后面的章节分别介绍。在本节我们选择“Dialog based”基于对话框的模式。单击,弹出我们所建立的工程的信息:

点击完成工程的建立,进入如下编辑界面

面向对象实验指导(学生用书)

编译运行后就会有这样一个基本的对话框:

现在单击按钮不会有任何事件发生,而我们希望单击按钮后会弹出一个对话框显示“Hello MFC”,下面介绍具体该如何实现这一功能。

在左边的“工作空间”选择“资源”窗口标签:

面向对象实验指导(学生用书)

将Dialog左边+号点开,双击“IDD_HELLOMFC_DIALOG”:

面向对象实验指导(学生用书)

在右边的编辑窗口就会出现一个基本的对话框

面向对象实验指导(学生用书)

我们要把中间那部分文字去掉,单击这段文字,点击键盘上的“Delete”件就可以了

面向对象实验指导(学生用书)

此时双击按钮,会弹出一个“Add Member Function”(添加成员函数)对话框

面向对象实验指导(学生用书)

系统会自动生成一个名为“OnOk”的成员函数,该名字读者可以根据需要修改,单击

面向对象实验指导(学生用书)

我们就会进入到函数体中:

面向对象实验指导(学生用书)

在这里添加相应的代码。在程序运行时点击键,程序就会执行我们这里所添加

的代码。我们希望在这里能够弹出一个对话框,显示“Hello MFC”。

这想工作其实非常简单,MFC为我们提供了许多方便易用的函数帮助我们完成相应的工作。在这里,我们要用到MessageBox()这个函数,就能够实现这一功能,我们在刚才生的OnOk函数中添加如下代码:

/*****************************************************************************/ void CHelloMFCDlg::OnOK()

{

// TODO: Add extra validation here

MessageBox("Hello MFC");

CDialog::OnOK();

}

/*****************************************************************************/ 编译运行后,单击按钮,就会弹出对话框,显示“Hello MFC”。

实验结果

截图

面向对象实验指导(学生用书)

实验五单文档编程

实验目的:

了解MFC编程的方法,会使用MFC编写简单的单文档程序。实验内容

下面我们来建立一个单文档程序,命名为Paint,

面向对象实验指导(学生用书)

面向对象实验指导(学生用书)

点击完成

面向对象实验指导(学生用书)

单击

编译运行结果如下所示:

面向对象实验指导(学生用书)

这是一个最简单的单文档界面,在我们加入代码前它不具备任何功能,下面我们通过添加代码实现在文档中的空白处画线段的功能。

在程序中画线段,可以通过鼠标在屏幕上点击两点,然后连接这两点实现。在这里,我们需要让电脑获取两个消息,一是鼠标左键按下这个消息以及鼠标左键松开这个消息,系统对这两个消息作出相应的相应,分别记录下鼠标左键按下和松开时的坐标,然后将其连接。

在类视图中点开CPaintView类,在CPaintView上单击鼠标右键,选择“添加windows 消息句柄”,如下图所示:

面向对象实验指导(学生用书)

弹出如下对话框:

面向对象实验指导(学生用书)

在对话框左边的窗口当中,有很多windows’能够响应的消息,其中WM_LBUTTONDOW和WM_LBUTTONUP分别是鼠标左键按下和鼠标左键松开这个两个消息,下面要做的事情就是对这两个消息作出适当的响应。

首相选择左边的WM_LBUTTONDOW消息,然后点击按钮,这样就

为CPaintView类添加了一个OnLButtonDown成员函数

面向对象实验指导(学生用书)

代码如下:

/*********************************************************************/

void CPaintView::OnLButtonDown(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

CView::OnLButtonDown(nFlags, point);

}

/*********************************************************************/

事实上,在windows对WM_LBUTTONDOW消息作出响应时,就已经获取了该点坐标,我们只需在函数体中将该坐标保存即可,我们给CPaintView类添加一个成员变量来保存该点坐标:

面向对象实验指导(学生用书)

点击添加成员变量,弹出添加成员变量对话框

面向对象实验指导(学生用书)

我们添加一个CPoint类型的变量m_ptX1并设为私有,点击,并在构造函数中将其初始化为0:

/***************************************************************************/ CPaintView::CPaintView()

{

// TODO: add construction code here

m_ptX1 = 0;

}

/***************************************************************************/ 然后在OnLButtonDown函数中将该点保存,代码如下:

/*********************************************************************/

void CPaintView::OnLButtonDown(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

m_ptX1 = point;

CView::OnLButtonDown(nFlags, point);

}

/*********************************************************************/

用同样的方法,对WM_LBUTTONUP消息进行响应:

面向对象实验指导(学生用书)

生成消息响应函数OnLButtonUp,并添加如下代码:

/*****************************************************************************/ void CPaintView::OnLButtonUp(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

HDC hdc;

hdc = ::GetDC(m_hWnd);

MoveToEx(hdc,m_ptX1.x,m_ptX1.y,NULL);

LineTo(hdc,point.x,point.y);

::ReleaseDC(m_hWnd,hdc);

CView::OnLButtonUp(nFlags, point);

}

/*****************************************************************************/ MoveToEx函数实现先将点移动到指定的位置,然后通过LineTo函数画线到指定的点,具体的函数说明可参看MSDN。

思考题:

描述函数MoveToEx和LineTo的功能。

实验结果:

截图

面向对象实验指导(学生用书)

实验六多文档编程

实验目的:

了解MFC编程的方法,会使用MFC编写简单的多文档程序。

实验内容

Step 1:使用VC 6.0新建一个Project,命名为:MIS。除选择多文档属性外,一切使用“默认”方式。于是你可以获得六个类:CMainFrame,CChildFrame,CMISApp,CMISDoc,CMISView,和CAboutDlg;