2012级中国石油大学VC++实验报告

更新时间:2023-09-08 19:25:02 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Visual C++

Visual C++面向对象与可视化程序设计实验报告

面向对象与可视化程序设计

实验报告

姓名:郑长明 班级:电气10-2 学号:10053228

1

Visual C++面向对象与可视化程序设计实验报告

目录

实验一Visual C++程序调试实验.............................................................................3 实验二C++类基本语法实验.....................................................................................6 实验三 Windows 图形绘制编程实验.......................................................................8实验四 鼠标和键盘编程实验...................................................................................13实验五 定时器编程实验...........................................................................................18实验六 MFC 消息映射编程实验...............................................................................21实验七 MFC 控件编程实验.......................................................................................25实验八 MFC 鼠标做图编程实验.........................................................................................33

2

Visual C++面向对象与可视化程序设计实验报告

实验一 Visual C++程序调试实验

一、实验目的

(1) 熟悉 Visual C++ 6.0 开发环境;

(2) 掌握在 Visual C++ 6.0 开发环境调试程序的方法。

二、实验报告

(1) 观察三种项目类型对应的程序特点,做出简要说明; Win32 Application

就是普通的常见的窗口应用程序,当然有的界面做得比较个性化,比如圆形的、不规则形状的。他们都是所谓的GUI(Graphics User Interface图形用户接口),我们可以通过鼠标点击来完成控制。

Win32 Console Application(win32控制台应用程序)

往往是像MS-DOS窗口(XP中叫命令提示符)的样子出现,我们得用键盘输入各种命令来使用它; 或者叫CUI(Character User Interface字符用户接口)。 MFC APPWIZARD:

MFC程序向导,微软为了减轻开发人员的工作负担,推出了MFC,MFC其实是一个框架,里面包含了200多个类,MFC比较复杂,MFC框架把基本的功能都实现了,你只是需要把你特殊的功能加到MFC里面, 比如你想建一个windows窗口,MFC APPWIZARD下,MFC中自包含了CWnd串口类,但是win32 application,就是要你自己写一个窗口类,才能用。

(2) 列出C++程序清单,以及程序的运行结果; #include \#include \void narcissus(); void main() {narcissus();} void narcissus() { int x1; int x20; int x2; int x3; int count=0; for (int x=100;x<1000;x++) { x1=x/100; x20=x0; x2=x20/10; x3=x20; if(x1*x1*x1+x2*x2*x2+x3*x3*x3==x)

3

Visual C++面向对象与可视化程序设计实验报告

}

{ count++; cout<<\ } }

cout<<\

(3) 记录调试过程中变量值的变化情况;

4

Visual C++面向对象与可视化程序设计实验报告

(4) 在Visual C++ 6.0 中如何进行程序的跟踪调试;

输完程序后先设置断点,再点F5 GO全速运行,再点 F11step into进入函数体,最后点F10单步执行即可。

(5) 总结实验的心得体会,实验中遇到的困难以及解决的方法等。 首先是建工程的问题,以前总是使用C++source file,现在换别的工程不会建立了; 其次是刚开始不知道怎么调试,不会但不执行和进出主函数操作。后来进行简单学习知道了使用一些快捷键快速调试。 通过本次实验我了解了C++ 3种Win32 Console Application、Win32 Application和 MFC AppWizard(exe)工程的建立。主要学会了如何进行程序调试和观察变量值的变化。

5

Visual C++面向对象与可视化程序设计实验报告

实验二 C++类基本语法实验

一、实验目的

(1) 熟悉 Visual C++ 6.0 开发环境; (2) 熟悉 C++类设计的基本方法;

(3) 掌握 C++类的几个重要成员函数的定义和使用方法; 二、实验内容

创建一个 Employee 类,该类中有字符数组,表示姓名、街道地址、市、省和 邮政编码。其功能有修改姓名、显示数据信息。要求其功能函数的原型放在类定义 中,构造函数初始化每个成员,显示信息函数要求把对象中的完整信息打印出来。 其中数据成员为保护的,函数为公有的。 (1) 列出C++程序清单,以及程序的运行结果

程序如下:

#include #include class Employee { protected: char name[200];//这个是姓名数组 char address[200];//这个是存放地址的 char shi[200]; //这个是存放市的 char sheng[200]; //这个是存放省的 char youbian[200];//这个是存放邮编的 public:

Employee(char *p,char *q,char *m,char *n,char *r) {

strcpy(name,p); strcpy(address,q); strcpy(shi,m); strcpy(sheng,n); strcpy(youbian,r); }

void changename(Employee a)//这是改变名字的 {

char name1[200]; cout<

cout<<\请输入新名字:\ cin>>name1; cout<

cout<<\正在修改,请等待...修改完成!\ strcpy(name,name1); }

6

Visual C++面向对象与可视化程序设计实验报告

void display()//这是显示输出的 {

cout<<\姓名:\

cout<<\街道地址:\ cout<<\市:\ cout<<\省:\ cout<<\邮编:\ } };

void main() {

Employee aa(\小明\公安小区1号\徐州\江苏\ aa.display();

aa.changename(aa); aa.display(); }

(2) 总结实验的心得体会,实验中遇到的困难以及解决的方法等

刚开始编写的程序比较复杂,错误很多,不是少个分号就是多个大括号。

其次程序比较不美观,感觉界面很陈旧,所以后来对输出界面做了比较人性化的美化工作。 实验中的一些错误的改正:

(1)在类内不允许对所定义的数据成员进行初始化。

(2 )类中的数据成员的类型可以是任意的,包括整型、浮点型、字符型、数 组、指针和引用等。也可以是对象,即另一个类的对象,可以作为该类的成员,但 自身类的对象是不可以的。

(3 )一般地,在类内先说明公有成员,它们是用户关心的,后面说明私有成员。

(4 )一般将类定义的说明部分或者整个定义部分(包含实现部分)放在一个 头文件中。 (5 )在类的说明部分之后必须加分号“;” 。 本次实现我深刻的学习了C++的基本语法规范,学习了关于类的声明与定义,学会了使用strcmp函数,深刻的理解了C++中类的封装的优越性。

7

Visual C++面向对象与可视化程序设计实验报告

实验三 Windows 图形绘制编程实验

一、实验目的

(1) 熟悉 Visual C++ 6.0 开发环境; (2) 掌握 Windows 图形输出的方法;

(3) 理解设备环境、画笔、画刷的概念,掌握常用的绘图函数。 二、实验内容

请编写程序,要求如下:

(1) 定义一支红色画笔,绘制一个正方形;

(2) 用不同颜色的线条连接互不相邻的两个顶点;

(3) 用不同颜色的画刷填充用上述方法所形成的图形中的每一个区域。 三、实验报告

(1) 列出图形绘制程序代码清单;

#include//包含应用程序中所需的数据类型和数据结构的定义 #include

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); //窗口函数说明 //--------------- 以下初始化窗口类 ---------------------- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow) { HWND hwnd ; MSG Msg ; WNDCLASS wndclass ; // LPCWSTR lpszClassName =_T(\窗口\//窗口类名 // LPCWSTR lpszTitle=L\//窗口标题名 char lpszClassName[] = \窗口\//窗口类名 char lpszTitle[]= \基本绘图练习\窗口标题名 //窗口类的定义 wndclass.style=0; //窗口类型为缺省类型

wndclass.lpfnWndProc=WndProc; //定义窗口处理函数 wndclass.cbClsExtra=0; //窗口类无扩展 wndclass.cbWndExtra=0; //窗口实例无扩展 wndclass.hInstance=hInstance; //当前实例句柄 wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION); //窗口的最小化图标为缺省图标

wndclass.hCursor=LoadCursor(NULL,IDC_ARROW) ; //窗口采用箭头光标

wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); //窗口背景为白色

wndclass.lpszMenuName=NULL; //窗口中无菜单 wndclass.lpszClassName= lpszClassName ; //窗口类名为\窗口\

//--------------- 以下进行窗口类的注册 -------

if(!RegisterClass( &wndclass))//如果注册失败则发出警告

8

Visual C++面向对象与可视化程序设计实验报告

{ MessageBeep(0) ; return FALSE ; } //---------------- 创建窗口 ------------------- hwnd=CreateWindow ( // _T(\ lpszClassName, //窗口类名 lpszTitle, //窗口实例的标题名

WS_OVERLAPPEDWINDOW, //窗口的风格

CW_USEDEFAULT,

CW_USEDEFAULT, //窗口左上角坐标为缺省值 CW_USEDEFAULT, CW_USEDEFAULT, //窗口的高和宽为缺省值 NULL, //此窗口无父窗口 NULL, //此窗口无主菜单 hInstance, //创建此窗口的应用程序的当前句柄 NULL //不使用该值 ); //--------------- 显示窗口 ---------------------- ShowWindow( hwnd, nCmdShow) ; //-------------- 绘制用户区 --------------------- UpdateWindow(hwnd); //--------------- 消息循环 ---------------------- while( GetMessage(&Msg, NULL, 0, 0)) { TranslateMessage( &Msg) ; DispatchMessage( &Msg) ; } return Msg.wParam; //消息循环结束即程序终止时将信息返回系统 }

//窗口函数

LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { HDC hDC; //定义指向设备的句柄 HBRUSH hBrush; //定义指向画刷的句柄 HPEN hPen; //定义指向画笔的句柄 PAINTSTRUCT PtStr; //定义指向包含绘图信息的结构变量 POINT points1[3],points2[3],points3[3],points4[3];

9

Visual C++面向对象与可视化程序设计实验报告

points1[0].x=10; points1[0].y=10; points1[1].x=100; points1[1].y=10; points1[2].x=55; points1[2].y=55; points2[0].x=55; points2[0].y=55; points2[1].x=100; points2[1].y=10; points2[2].x=100; points2[2].y=100; points3[0].x=100; points3[0].y=100; points3[1].x=55; points3[1].y=55; points3[2].x=10; points3[2].y=100; points4[0].x=10; points4[0].y=100; points4[1].x=55; points4[1].y=55; points4[2].x=10; points4[2].y=10;

switch(message) { case WM_PAINT: //处理绘图消息 hDC=BeginPaint(hwnd,&PtStr); SetMapMode(hDC,MM_ISOTROPIC); //设置映像模式 SetWindowExtEx(hDC,50,50,NULL); SetViewportExtEx(hDC,100,500,NULL); hBrush=(HBRUSH)CreateSolidBrush(RGB(0,100,100)); SelectObject(hDC,hBrush); Polygon(hDC,points1,3); hBrush=(HBRUSH)CreateSolidBrush(RGB(100,0,100)); SelectObject(hDC,hBrush); Polygon(hDC,points2,3); hBrush=(HBRUSH)CreateSolidBrush(RGB(100,100,100)); SelectObject(hDC,hBrush); Polygon(hDC,points3,3); hBrush=(HBRUSH)CreateSolidBrush(RGB(100,100,0)); SelectObject(hDC,hBrush); Polygon(hDC,points4,3);

10

Visual C++面向对象与可视化程序设计实验报告

void CWork8View::OnUpdateOperEllipse(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->SetCheck(m_down1); }

void CWork8View::OnUpdateOperLine(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->SetCheck(m_down0); }

void CWork8View::OnUpdateOperRectangle(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->SetCheck(m_down2); }

void CWork8View::OnOperShow() { // TODO: Add your command handler code here m_show=!m_show;

m_down0=FALSE; m_down1=FALSE; m_down2=FALSE; Invalidate(); }

四、运行结果

36

Visual C++面向对象与可视化程序设计实验报告

五、实验总结

本次实验要求熟练掌握MFC菜单资源的使用以及鼠标绘图的方法的知识。首先由于五例题,我先按照课本第十章的例子逐步的尝试,在这个过程里我逐渐掌握了菜单资源的使用方法。结合以前的MFC绘图程序,添加了鼠标单击与鼠标移动的响应函数实现绘图功能,通过对按钮的COMMAND消息响应控制绘图类型,完成之后自己又添加了按钮对UPDATE_COMMAND_UI消息的响应。最后又添加了清除按钮。这次实验的要求很高,结合了之前的全部MFC实验内容,提高了理论与实验之间的联系,让我的综合能力得到了很大的提高

37

Visual C++面向对象与可视化程序设计实验报告

实验六 MFC 消息映射编程实验

一、实验目的

(1) 熟悉Visual C++ 6.0 开发环境;

(2) 掌握消息映射机制的基本原理和手工添加消息映射的方法; (3) 熟练掌握在Visual C++ 6.0 开发环境调试程序的方法。

二、实验内容

设计 MFC 应用程序,手工添加消息映射,实现下面的功能: (1)按下CTRL 键,拖动鼠标绘制矩形; (2)按下SHIFT 键,拖动鼠标绘制椭圆。

三、程序代码

#include #define MAX_BUBBLE 250

class CDemoApp: public CWinApp {

public: BOOL InitInstance(); };

CDemoApp ThisApp; // 全局应用程序对象 class CDemoWnd: public CFrameWnd {

private: CRect m_rectBubble[MAX_BUBBLE]; CRect m_rectBubble1[MAX_BUBBLE]; int m_nBubbleCount; int m_nBubbleCount1;

public: CDemoWnd(){ m_nBubbleCount = 0;m_nBubbleCount1 = 0;} int m_X0; int m_Y0; int m_X1; int m_Y1;

protected: LRESULT OnPaint(WPARAM wParam, LPARAM lParam); LRESULT OnLButtonDown(WPARAM wParam, LPARAM lParam); LRESULT OnMouseMove(WPARAM wParam, LPARAM lParam); LRESULT OnLButtonUp(WPARAM wParam, LPARAM lParam); DECLARE_MESSAGE_MAP();

21

Visual C++面向对象与可视化程序设计实验报告

};

BEGIN_MESSAGE_MAP(CDemoWnd, CFrameWnd) ON_MESSAGE(WM_PAINT,OnPaint) ON_MESSAGE(WM_LBUTTONDOWN,OnLButtonDown) ON_MESSAGE(WM_MOUSEMOVE,OnMouseMove) ON_MESSAGE(WM_LBUTTONUP,OnLButtonUp) END_MESSAGE_MAP()

LRESULT CDemoWnd::OnPaint(WPARAM wParam, LPARAM lParam) { CPaintDC dc(this); dc.SelectStockObject(LTGRAY_BRUSH); for(int i=0; i

LRESULT CDemoWnd::OnLButtonDown(WPARAM wParam, LPARAM lParam) { m_X0 = m_X1 = LOWORD(lParam); m_Y0 = m_Y1 = HIWORD(lParam); return 0; }

LRESULT CDemoWnd::OnMouseMove(WPARAM wParam, LPARAM lParam) { CClientDC dc(this); dc.SelectStockObject(WHITE_PEN); dc.SelectStockObject(WHITE_BRUSH); if((wParam & MK_LBUTTON) && (wParam & MK_CONTROL)) { dc.Ellipse(m_X0,m_Y0,m_X1,m_Y1); } if((wParam & MK_LBUTTON) && (wParam & MK_SHIFT)) { dc.Rectangle(m_X0,m_Y0,m_X1,m_Y1); } m_X1 = LOWORD(lParam); m_Y1 = HIWORD(lParam); dc.SelectStockObject(BLACK_PEN); dc.SelectStockObject(GRAY_BRUSH); if((wParam & MK_LBUTTON) && (wParam & MK_SHIFT))

22

Visual C++面向对象与可视化程序设计实验报告

{ dc.Ellipse(m_X0,m_Y0,m_X1,m_Y1); } if((wParam & MK_LBUTTON) && (wParam & MK_CONTROL)) { dc.Rectangle(m_X0,m_Y0,m_X1,m_Y1); } return 0; }

LRESULT CDemoWnd::OnLButtonUp(WPARAM wParam, LPARAM lParam) { CClientDC dc(this); CRect rect(m_X0,m_Y0,m_X1,m_Y1); if(wParam & MK_SHIFT) { m_rectBubble[m_nBubbleCount] = rect; m_nBubbleCount++; } if(wParam & MK_CONTROL) { m_rectBubble1[m_nBubbleCount1] = rect; m_nBubbleCount1++; } m_X1 = LOWORD(lParam); m_Y1 = HIWORD(lParam); dc.SelectStockObject(BLACK_PEN); dc.SelectStockObject(GRAY_BRUSH); if(wParam & MK_CONTROL) { m_rectBubble[m_nBubbleCount] = rect; m_nBubbleCount++; } if(wParam & MK_CONTROL) { m_rectBubble1[m_nBubbleCount1] = rect; m_nBubbleCount1++; } InvalidateRect(0, 1); return 0; }

BOOL CDemoApp::InitInstance()

23

Visual C++面向对象与可视化程序设计实验报告

{ }

CDemoWnd *pFrame = new CDemoWnd(); pFrame->Create(0,_T(\

pFrame->ShowWindow(m_nCmdShow); this->m_pMainWnd = pFrame; return TRUE;

四、运行结果

五、实验总结

本次实验学习了手工添加消息映射的方法,对消息映射有了更深入地认

识,同时也学会了两种用鼠标绘图的方法。其中,出现了反向移动鼠标后,之前画的图形会留下一片空白,我采用了画泡泡的方法,设定一个数组来记录每次的图形,这样就可以很好的保护好之前画的图形了。第一次把按键弄反了,后来交换一下变量名就可以了。同时这次实验使我了解了用MFC绘图与用API绘图的不同之处。

24

Visual C++面向对象与可视化程序设计实验报告

实验七 MFC 控件编程实验

一、实验目的

(1) 熟悉Visual C++ 6.0 开发环境;

(2) 掌握MFC 环境下标准控件的使用方法;

(3) 熟练掌握在Visual C++ 6.0 开发环境调试程序的方法。

二、实验内容

创建如图所示的应用程序,在“形状”列表框中选择要绘制的图形,在“笔颜 色”下拉列表框中选择画笔的颜色,在“刷子颜色”下拉列表框中选择画刷的颜色,

在“线型”组框中选择画笔的线型,在“填充类型”中选择画刷填充类型,单击“绘图”按钮

在“绘图设置”编辑框中显示选择的绘图设置选项,单击“退出”按钮退 出程序。

三、程序代码

// testDlg.cpp : implementation file #include \#include \#include \

#ifdef _DEBUG

#define new DEBUG_NEW #undef THIS_FILE

static char THIS_FILE[] = __FILE__; #endif

// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog {

25

Visual C++面向对象与可视化程序设计实验报告

public: CAboutDlg();

// Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL

// Implementation protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() };

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT }

void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP }

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP()

///////////////////////////////////////////////////////////////////////////// // CTestDlg dialog

CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)

26

Visual C++面向对象与可视化程序设计实验报告

: CDialog(CTestDlg::IDD, pParent)

{ //{{AFX_DATA_INIT(CTestDlg) m_pen = -1; m_brush = -1; m_Output = _T(\ //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); }

void CTestDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CTestDlg) DDX_Control(pDX, IDC_LIST1, m_list); DDX_Control(pDX, IDC_COMBO2, m_cb2); DDX_Control(pDX, IDC_COMBO1, m_cb1); DDX_Radio(pDX, IDC_RADIO1, m_pen); DDX_Radio(pDX, IDC_RADIO5, m_brush); DDX_Text(pDX, IDC_OUTPUT, m_Output); //}}AFX_DATA_MAP }

BEGIN_MESSAGE_MAP(CTestDlg, CDialog) //{{AFX_MSG_MAP(CTestDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_EN_CHANGE(IDC_OUTPUT, OnChangeOutput) ON_BN_CLICKED(IDC_BUTTON1, OnButton1) ON_LBN_SELCHANGE(IDC_LIST1, OnSelchangeList1) ON_CBN_SELCHANGE(IDC_COMBO1, OnSelchangeCombo1) ON_CBN_SELCHANGE(IDC_COMBO2, OnSelchangeCombo2) ON_CBN_EDITCHANGE(IDC_COMBO2, OnSelchangeCombo2) //}}AFX_MSG_MAP END_MESSAGE_MAP()

///////////////////////////////////////////////////////////////////////////// // CTestDlg message handlers

BOOL CTestDlg::OnInitDialog() { CDialog::OnInitDialog();

27

Visual C++面向对象与可视化程序设计实验报告

// Add \ // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here m_list.AddString(\

m_list.AddString(\ m_list.AddString(\ m_list.AddString(\ m_cb1.AddString(\ m_cb1.AddString(\ m_cb1.AddString(\ return TRUE; // return TRUE unless you set the focus to a control }

void CTestDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else

28

Visual C++面向对象与可视化程序设计实验报告

{ CDialog::OnSysCommand(nID, lParam); } }

// If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework.

void CTestDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } }

// The system calls this to obtain the cursor to display while the user drags // the minimized window.

HCURSOR CTestDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; }

void CTestDlg::OnChangeOutput() { // TODO: If this is a RICHEDIT control, the control will not

29

Visual C++面向对象与可视化程序设计实验报告

// send this notification unless you override the CDialog::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask.

// TODO: Add your control notification handler code here

}

CString msg1; CString msg2; CString msg3;

void CTestDlg::OnSelchangeList1() { // TODO: Add your control notification handler code here m_list.GetText(m_list.GetCurSel(),msg1); }

void CTestDlg::OnSelchangeCombo1() { // TODO: Add your control notification handler code here m_cb1.GetLBText(m_cb1.GetCurSel(),msg2); }

void CTestDlg::OnSelchangeCombo2() { // TODO: Add your control notification handler code here m_cb2.GetLBText(m_cb2.GetCurSel(),msg3); }

void CTestDlg::OnButton1() { // TODO: Add your control notification handler code here UpdateData(TRUE); // DDX:界面控件的值传给内部变量 m_Output=\形状:\m_Output+=msg1;

m_Output+=\ 笔颜色:\m_Output+=msg2;

m_Output+=\ 刷子颜色:\m_Output+=msg3;

m_Output += \ 线型:\

switch(m_pen) { case 0:

30

Visual C++面向对象与可视化程序设计实验报告

m_Output += \ break;

case 1: m_Output += \ break;

case 2: m_Output += \ break;

case 3: m_Output += \ break;

}

m_Output += \ 填充类型:\switch(m_brush) {

case 0: m_Output += \break; case 1:

m_Output += \break; case 2: m_Output += \ break; case 3: m_Output += \ break; }

UpdateData(FALSE); // DDX:内部变量的值传给界面控件 }

各个控件的属性设置:

控件 ID 类向导: 类向导:Member Type 形状/列表框 IDC_LIST1 CListBox m_list CString msg1 笔颜色/组合框 IDC_COMBO1 CComboBox m_cb1 CString msg2 刷子颜色/组合IDC_COMBO2 CCmoboBox m_cb2 框 CString m_msg2 线型/组框 IDC_RADIO1 int m_pen

31

Visual C++面向对象与可视化程序设计实验报告 IDC_RADIO5 Int m_brush 填充类型/组框 绘图设置/编辑框 绘图/按钮 IDC_OUTPUT IDOK CString m_Output ON_IDOK:BN_CLICKED

四、运行结果

五、实验总结

本次实验中用到了列表框、组合框、组框、编辑框、按钮等控件,实验要求对这些控件进行组合使用。通过这次实验使我对MFC控件的工作机制有了更深的认识,以及建立类向导有了进一步的掌握。实验过程中在显示列表框和组合框的内容时,我选择给列表框、组合框定义了一个Cstring类型的值,输出时将这个值赋值给编辑框的值实现了成员的输出,通过这个解决问题的过程,我对控件的工作机制有了更深的认识。

32

Visual C++面向对象与可视化程序设计实验报告

实验八 MFC 鼠标做图编程实验

一、实验目的

(1) 熟悉Visual C++ 6.0 开发环境;

(2) 掌握应用MFC 类库编写鼠标绘图程序的方法; (3) 掌握MFC 环境中绘图函数的使用方法。

二、实验内容

创建一个单文档应用程序,实现鼠标的绘图功能。要求: (1) 创建一个工具栏,有线段、矩形、椭圆三个按钮;

(2) 绘图前,选择工具栏上的按钮,确定图形的形状。按下鼠标左键,开始绘 图,结合鼠标的光标坐标值,来确定图形的形状和大小,并随着鼠标的移动在屏幕 上实时绘制图形,放开鼠标左键,确定最后的图形,绘制在屏幕上。 三、程序代码

在work8View.h中声明:

class CWork8View : public CView {protected: CWork8View();

DECLARE_DYNCREATE(CWork8View) // Attributes public: CWork8Doc* GetDocument(); DWORD m_i; int m_X0; int m_X1; int m_Y0; int m_Y1; bool m_down0; bool m_down1; bool m_down2; bool m_show; // Operations

在work8View.h中的相关代码: CWork8View::CWork8View()

{// TODO: add construction code here m_down0=FALSE; m_down1=FALSE; m_down2=FALSE; m_show=TRUE; }

CWork8View::~CWork8View() {}

BOOL CWork8View::PreCreateWindow(CREATESTRUCT& cs)

33

Visual C++面向对象与可视化程序设计实验报告

{ // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs

return CView::PreCreateWindow(cs); }

///////////////////////////////////////////////////////////////////////////// // CWork8View drawing

void CWork8View::OnDraw(CDC* pDC) { CWork8Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here pDC->SetTextColor(RGB(0,0,255));

pDC->TextOut(10,10,\点击相应按钮画对应的图形,点击“清除”清空窗口\}

void CWork8View::OnOperEllipse() //

{ // TODO: Add your command handler code here m_i=1; m_down1=TRUE; m_down0=FALSE; m_down2=FALSE; m_show=TRUE; Invalidate(); }

void CWork8View::OnOperLine() { // TODO: Add your command handler code here m_i=0; m_down0=TRUE; m_down1=FALSE; m_down2=FALSE; m_show=TRUE; Invalidate(); }

void CWork8View::OnOperRectangle() { // TODO: Add your command handler code here m_i=2; m_down2=TRUE; m_down0=FALSE; m_down1=FALSE;

34

Visual C++面向对象与可视化程序设计实验报告

m_show=TRUE; Invalidate(); }

void CWork8View::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default m_X0=m_X1=point.x; m_Y0=m_Y1=point.y; CView::OnLButtonDown(nFlags, point); }

void CWork8View::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CView::OnMouseMove(nFlags, point); CClientDC dc(this);

dc.SelectStockObject(WHITE_PEN); dc.SelectStockObject(WHITE_BRUSH); if((nFlags & MK_LBUTTON)&&m_show) { if(m_i==1) dc.Ellipse(m_X0,m_Y0,m_X1,m_Y1); else if(m_i==0) {dc.MoveTo(m_X0,m_Y0); dc.LineTo(m_X1,m_Y1);} else if(m_i==2) dc.Rectangle(m_X0,m_Y0,m_X1,m_Y1);} m_X1 = point.x; m_Y1 = point.y; dc.SelectStockObject(BLACK_PEN); dc.SelectStockObject(GRAY_BRUSH); if((nFlags & MK_LBUTTON )&&m_show) { if(m_i==1) dc.Ellipse(m_X0,m_Y0,m_X1,m_Y1); else if(m_i==0) {dc.MoveTo(m_X0,m_Y0); dc.LineTo(m_X1,m_Y1);} else if(m_i==2) dc.Rectangle(m_X0,m_Y0,m_X1,m_Y1); } }

35

本文来源:https://www.bwwdw.com/article/1ash.html

Top