全面解析MFC应用程序框架

全面解析MFC应用程序框架
全面解析MFC应用程序框架

全面解析MFC应用程序框架

对于程序员来说,如果要提高编程效率,一个好用的,功能强大的并且可以得心应手使用的编

程工具往往会给我们程序员带来莫大的方便。其实对于现在的编程工具来说,使用哪一种工具

都不是问题的关键,重要的是你能够使用到什么程度,毕竟现在的工具都是非常的强大,对于

一般的编程任务来说还没有不能够胜任的工具,否则的话恐怕他就不可能在这个世界上存在哪

怕是只有一个月的生命。但是根据个人所好以及周围的人的影响,我们都会去使用某一种或

者几种工具。比较Visual Basic 、C++ Builder和Delphi等编程工具,用VC++编写Windows

应用程序可以说是最富于挑战性和艰巨性。在本文中我无意去比较各种工具的好坏,仅就我自

己学习Visual C++的MFC的体会和心得拿出来与大家一起分享和交流,也希望可以结识更多

的志同道合的朋友。

就我个人的偏见,学习VC++就应该要学习他的类库MFC(Microsoft Foundation Classes)。也许有的人一听说MFC就有点望而生畏,这是可以理解的,毕竟Microsoft虽然给了我们一

个强大而且非常复杂的类库,但是没有给我们带来学习他的好的方便之处。回想自己学习

MFC时的无助和迷茫,以及所走过的弯路,现在想起来还心有余悸,虽然我现在也还是处于

非常初级的初级入门阶段,但是还是很乐意把自己的心得和体会拿出来一起与大家分享。也希

望得到大家的指点。

一、SDK应用程序结构

我学习MFC之路可是从windows编程开始的(可能这一开始就是弯路了)。首先也请大

家跟着我一起看一个SDK应用程序结构的Windows应用程序。当然也是经典的“Hello world!”了,编写的过程就不必罗嗦了,下面给出他的主要源代码(我使用向导生成的,但是为了阅读

的方便经过了一点点的编辑):

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)

{

// TODO: Place code here.

MSG msg;

………………………………

MyRegisterClass(hInstance);

if (!InitInstance (hInstance, nCmdShow))

{

return FALSE;

}

// Main message loop:

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

{

if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}

return msg.wParam;

}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)

{

……………………

return TRUE;

}

//窗口函数WndProc(),回调函数

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {

int wmId, wmEvent;

……………………

switch (message)

{

case WM_COMMAND:

………………

break;

case WM_PAINT:

hdc = BeginPaint(hWnd, &ps);

// TODO: Add any drawing code here...

RECT rt;

GetClientRect(hWnd, &rt);

DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);

EndPaint(hWnd, &ps);

break;

case WM_DESTROY:

……

default:

return DefWindowProc(hWnd, message, wParam, lParam);

}

return 0;

}

SDK之"Hello World"源程序

首先让我们看一下这个程序的结构,WinMain()是函数的入口点,该函数的主要任务是完

成一些初始化的工作和维护了一个消息循环。他们的工作流程如下:入口(WinMain())---à MyRegisterClass()---->InitInstance ()-àwhile消息循环。函数由入口开始执行,之后调用MyRegisterClass()注册窗口类,之后InitInstance ()生成并显示窗口,这样之后,就完成了一

个窗口的初始化工作了(当然,在 MyRegisterClass(),InitInstance ()中都需要调用相应的

API函数来具体的实现,不过我这里重点分析的是他的结构,所以不考虑他的具体实现细节),然后就是维护消息循环,至此,这个程序的基本结构就差不多建立了。以后程序的运作就靠个消息循环来推动了。

现在,再让我们看看那个消息循环的结构,在例子程序中,我们是要程序在窗口中输出一句"Hello World"。在主程序中我们似乎已经把应用程序的框架全部分析的滴水不漏了,但是没

有看到要求程序输出"Hello World" 呀?这就是Windows消息的作用了,我们当然还记得刚刚

我们说过主程序还维持了一个消息循环,不错,就是在这个循环里面大有文章。Window应用

程序的特点就是消息驱动,当系统或者用户要求应用程序完成某一个任务的时候,所依靠的就是消息,系统会把用户的要求或者系统的要求放到一个消息结构中,然后发送给应用程序,再去处理。我们现在来看看应用程序是怎么来完成我们的任务的。在应用程序初始化完成之后,调用了一个显示窗口的API函数,所以系统知道了程序要显示窗口了,此时(注意,这里就是产生消息的时机),此时就会在消息队列中产生一个WM_PAINT消息,这样,应用程序的消息循环就可以捕捉到这个消息并且将它发送给窗口函数(注意,这个函数是由系统调用的),然后窗口函数就处理这个消息,我们就是在他处理这个消息的时候让他完成我们的任务的。从这个过程中我们可以看到,如果我们要与程序交互的话,需要做得仅仅就是选择适当的时机让系统产生消息了。现在,我们终于可以完全明白SDK的程序的运作过程了。

一个SDK的应用程序的框架就这样被建立了,下面我们再来看看如何建立一个MFC的

应用程序的框架,以及这两者之间的对应关系。

二、 MFC应用程序结构

在前面我分析了一个经典的SDK应用程序的结构,现在可是要进入主题“MFC应用程序

结构”了。MFC应用程序有好多种,为了能够更清楚地与前面的文章形成对比,我们在这里看

一个SDI的应用程序,当然例子还是经典的“Hello World”了。在使用向导生成应用程序后,会发现有好几个文件,首先我们不管有哪些文件,按照程序执行得主线抽取主要的源程序分析一下再说(因为MFC生成的应用程序不是很方便阅读,所以在这里我将他们重新编辑了)。

// App global initializations (rare)

if (pApp != NULL && !pApp->InitApplication())

goto InitFailure;

// Perform specific initializations

if (!pThread->InitInstance())

{

if (pThread->m_pMainWnd != NULL)

{

TRACE0("Warning: Destroying non-NULL m_pMainWnd\n");

pThread->m_pMainWnd->DestroyWindow();

}

nReturnCode = pThread->ExitInstance();

goto InitFailure;

}

nReturnCode = pThread->Run();

InitFailure:

……………………

AfxWinTerm();

return nReturnCode;

}

BOOL CWinApp::InitApplication()

{

if (CDocManager::pStaticDocManager != NULL)

{

if (m_pDocManager == NULL)

m_pDocManager = CDocManager::pStaticDocManager;

CDocManager::pStaticDocManager = NULL;

}

if (m_pDocManager != NULL)

m_pDocManager->AddDocTemplate(NULL);

else

CDocManager::bStaticInit = FALSE;

return TRUE;

}

BOOL CHelloWorldApp::InitInstance()

{

AfxEnableControlContainer();

………………………………

// Change the registry key under which our settings are stored.

// TODO: You should modify this string to be something appropriate

// such as the name of your company or organization.

SetRegistryKey(_T("Local AppWizard-Generated Applications"));

LoadStdProfileSettings(); // Load standard INI file options (including MRU)

// Register the application's document templates. Document templates

// serve as the connection between documents, frame windows and views.

CSingleDocTemplate* pDocTemplate;

pDocTemplate = new CSingleDocTemplate(

IDR_MAINFRAME,

RUNTIME_CLASS(CHelloWorldDoc),

RUNTIME_CLASS(CMainFrame), // main SDI frame window

RUNTIME_CLASS(CHelloWorldView));

AddDocTemplate(pDocTemplate);

// Parse command line for standard shell commands, DDE, file open

CCommandLineInfo cmdInfo;

ParseCommandLine(cmdInfo);

// Dispatch commands specified on the command line

if (!ProcessShellCommand(cmdInfo))

return FALSE;

// The one and only window has been initialized, so show and update it.

m_pMainWnd->ShowWindow(SW_SHOW);

m_pMainWnd->UpdateWindow();

return TRUE;

}

BOOL CWinApp::InitInstance()

{

return TRUE;

}

MFC应用程序之“Hello World”

咋一眼看上去,好像这个程序无从下手分析,甚至连程序的入口点都找不到。其实,上面的程序还是经过整理后才有如此模样。好了,一样的来看看这个程序是怎么运行的吧(要注意的事上面的程序来自于不同的文件,这里排版在一起只是为了更清楚地表示程序的结构,至于MFC的文件组织我会在下面一个话题中具体的分析,这里可以暂时不考虑)。

首先,在程序的开始处,首先定义了一个全局变量theApp,我们现在只需要知道他代表了整个程序的存在,然后程序开始介入入口点。有没有搞错,入口点在哪里?不及,其实int

AFXAPI AfxWinMain()就是这个程序的入口点,奇怪吧!不过没有关系,就好像我们第一

次看到C语言中的main()函数一样,只要了解就可以了。在AfxWinMain()中分别调用了一

些类的成员函数,仿照前面的分析方法,也可以画出一个程序执行路径图。入口点----〉AfxGetThread()------〉AfxGetApp()-------àAfxWinInit()-------àpApp->InitApplication()-----

àpThread->InitInstance()------àpThread->Run()。可以看到,程序一样有一个执行的线索可循,但是,相对于SDK来说,如今已经面目全非了,过去的那种清晰的程序结构在这些程序中也

有吗?答案是肯定的,只不过他们的具体实现在MFC中都进行了包装而已,那么,还是来看

看这个应用程序是如何启动并且运行的吧。

程序由AfxWinMain()开始运行后,首先调用了AfxGetApp()来获取应用程序的对象指针pApp,然后通过这个指针调用有关的成员函数来完成初始化和启动工作,最后就调用了Run()函数,在这里,Run()函数就是代表了SDK中的消息循环。

事情的发展在预料中进行着,但是似乎还遗漏了一点什么似的?不错,在上面我们的确是还有一样工作没有完成,这就是我们需要的”Hello World”好像还没有输出来!这不是我的疏忽,而是故意的安排,因为MFC中采用了一种全新(当然是相对于SDK来说的了)的消息处理

机制,至少在表面上来说是这样的。然而,在这里我不打算一下子就把问题解决掉,毕竟这有点复杂,等我们明白了MFC的文件之间的关系后我会在回答这个问题。

我没有想到这篇文章会这么长,刚刚开始的时候我以为我可以一下子就把这个问题说清楚地,但是事实上我写作的思路也像我分析程序时一样,竟然是一个漫长的过程!所以我也有必要提醒一下自己以及读这篇文章的朋友,应该休息一下了。我现在都开始庆幸我把这个问题分成好几个小问题来解决了,我会在接下来的话题中继续讨论的事MFC程序所生成的文件以及

它们之间的调用关系。

三、MFC程序结构剖析

在前面我分别给出了SDK和MFC应用程序的框架,并且稍微理了一下它们之间的对应

关系。但是对于MFC程序来说,要想真正搞懂它的框架的话,还是不够的。现在我要做的事

就是继续去分析一下上面的MFC程序,期望能够如我的标题所言,明明白白的看透MFC的

应用程序框架。

首先就是看一下应用向导生成的MFC应用程序都有哪些主要的文件,包含哪些类以及相

关类的对应功能和他们之间的关系(再次说明,因为我在这里关心的是程序的框架结构,所以对于一些与话题关系不很大的东西我将会略去不提)。

在上面的SDI应用程序中,向导为我们生成了4个主要的类,这些类都是MFC类的派生类,分别包含在对应的头文件以及实现文件中。

1、框架窗口类及其相关的文件

框架窗口类对应应用程序的主窗口,明白这一点后就可以建立一个对这个类的感性认识了,

他的定义是在头文件MainFrm.h中,而实现则是在MainFrm.cpp文件中。所有与框架窗口向光的功能都是在这里定义和实现的。

2、文档类及其相关的文件

文档类在应用程序中没有直观的对应关系,但是,我们应该知道的一点就是MFC的框架的一个特点就是文档/视图结构。这里可以抽象一点地来理解,比如说我们在Word中打开了一个文件,其实,这个文件就是文档,而我们看到的只不过是这个文件一个视图,所以说文档提供了应用程序显示的支持,但是我们真正看到的应用程序显示的则是一个视图,文档类的定义是在“Hello WorldDoc.h”中,而他的实现则是在“Hello WorldDoc.cpp”文件中。

3、视图类及其相关的文件

视图类是用来显示文档对象的内容的,我们在Word程序中所看到的界面就是一个视图,我们要修改,画图首先操作的对象就是视图,所以,视图类就如他的名称所指出的那样,提供了从用户角度看到的东西。视图类的定义在“Hello WorldView.h”中,实现是在文件“Hello WorldView.h”中。

4、应用程序类及其相关的文件

MFC应用程序的初始化,启动运行和结束都是由应用程序对象完成的。他对应的文件是”Hello World.cpp”和”Hello World.h”。

在大致的了解了应用程序对象的作用之后,现在我们来看看它们之间的关系(如下图所示)。

从上面的图中可以大致的看出MFC应用程序对象之间的关系了。应用程序一开始(此处的内容可以参考上一篇)生成应用程序对象,然后,在InitInstance中创建中将会创建文档模板对

象(通过CdocManager管理),这样一来,应用程序就可以通过建立的模板对象来管理文档、视图、和框架窗口。

至此,我的这篇文章终于可以暂时告一段落了,在文中我主要分析的是应用程序的框架,

所以忽略了很多的实现细节。其实,学习MFC是一个非常漫长的路,处在不同的阶段都会产

生不同的看法和认识,相信随着学习的深入,每一个人都会有自己的理解。但是在这里我给出

的自己的经验就是:在学习MFC的时候,一定要在宏观上对他的应用程序框架有个感性的认识!因为这样之后,我们就会在学习的时候有个明显的方向,知道自己学习的是什么东西。我

在一开始的时候,就没有认识到这一点,所以往往在学习过程中,往往会不知道下一步应该做

什么,也不明白自己看的东西是做什么用的。

mfc绘图程序上机步骤

首先生成MFC程序空框架 空框架中的每个类的职责是什么要自己理解清楚 第一次课: 1.定义自己的数据类CLine直线类,用于绘图 点击菜单:插入—类 选择Generic class,输入类名,每个类都是分成两个文件.h 中只有类体,包含类的数据成员定义和成员函数声明,.cpp中就是成员函数的类体外实现 classCLine { int x1,y1,x2,y2; public: CLine(int a=0,int b=0,int c=0,int d=0); virtual ~CLine(); int Getx1(); int Gety1(); int Getx2(); int Gety2(); void SetPoint1(intx,int y);很多函数是在后面使用中发现问题逐渐添加的 void SetPoint2(intx,int y); }; 2.自定义的类要作为数据成员出现在Doc类中 classCSmallCADDoc : public CDocument { protected: // create from serialization only CSmallCADDoc(); DECLARE_DYNCREATE(CSmallCADDoc) // Attributes public: CLine line1; //数据成员应该是私有,但是由于文档类与视图类交换频繁,为了访问方便,直接定义成公有了。你也可以定义成私有,再定义一个Get函数间接访问,取他的值3.注意:添加了这个数据成员后,需要增加几个#include “Line.h”语句 添加的原则是,每个cpp文件都单独编译,哪里用到新的类,相应的cpp前就要增加#include “。。。”语句 此处是在CSmallCADDoc类中添加了一个CLine line1;类对象,在SmallCADDoc.h文件中。所以,凡是包含了#include “SmallCADDoc.h”的地方都要在前面添加#include “Line.h” 语句。共3处:app doc view 这3个类的cpp文件前 4.注意:初始化 CLine line1; //数据成员是文档类的,它不像dos下程序,明确能看到定义,调用构造

mfc简单绘图程序

M F C 简 单 的 绘 图 程 序 ——王帅

目录 摘要 (2) 关键字 (2) 1 引言 (2) 设计目的 ............................................................................................................ 错误!未定义书签。 2 功能说明 (2) 2.1菜单栏....................................................................................................... 错误!未定义书签。 2.1.1图形 (3) 2.1.2画笔 (4) 2.1.3画硬币 (4) 2.2工具栏 (5) 2.3状态栏 (5) 3 功能的实现 (5) 3.1 视图设计 (5) 3.2 编辑资源 (6) 3.3 编程思路及各个函数的实现 (7) (1)思路 (7) (2)代码的实现 (7)

1.为基本形状创建一个基类 (8) 2.基本形状类的创建 (8) 2.1矩形类的创建及定义 (8) 2.2圆形类的创建及定义 (10) 2.3正五边形类的创建及定义 (11) 2.4正三角形类的创建及定义 (14) 2.5椭圆类的创建及定义 (16) 2.6正四边形类的创建及的定义 (17) 2.7正六边形类的创建及定义 (18) 2.8直线类的创建及定义 (19) 3.各基本形状类在CMyDraw2_0类中的调用和绘图的实现 (20) 3.1矩形类的调用与与绘图的实现 (20) 3.2圆形类的调用 (24) 3.3正三角形类的调用 (25) 3.4基本类型调用的剩余代码 (26) 4.画笔的使用、颜色及大小的调整 (29) 5.画硬币 (35) 6.工具栏中的自定义控件 (38) 7.状态栏中的显示 (39) 4程序功能的测试 (41) 5最后总结 (42)

简单的绘图程序实验报告

面向对象程序设计实训(基于MFC程序设计) 题目: 简单的绘图程序 院系专业: 姓名: 学号: 同组其他学生(学号):

简单绘图程序说明 1、功能分析 目前这个软件的主要功能有如下: 1、画直线:通过OnLine()函数实现。 2、画矩形:通过OnRectangle()函数实现。 3、画圆角矩形:通过OnRoundrect()函数实现。 4、画椭圆:通过OnEllipse()函数实现。 5、铅笔工具:可以画任意线条。通过直接在OnMouseMove(UINT nFlags, CPoint point)函数里面添加代码实现。 6、右键弹出菜单:可以在客户中点击鼠标右键,快速选择常用菜单。通过 OnContextMenu函数实现。 7、状态栏显示鼠标移动的坐标:在程序的右下角显示,通过调用setWidnowText 和GetParent()实现。 8、画图颜色选择:可以画任何颜色的线条,通过OnColor()函数实现。 9、线条类型及线宽的设置:可以将画出的线条设置成实线、虚线、点线、点划 线,双点划线,还可以设置线条的粗细,,通过实例这一功能立刻显示所选择线条的粗细及线型。通过新建CLineSettingDlg类,其中OnSelchangeLineStyle()函数实现线型的改变,OnChangeEditLineWidth()函数实现线宽的改变。再在CDrawView类中调用OnLineSetting()函数实现画笔的对话框, CLineSettingDlg类中的OnPaint()函数是实现示例功能的。 10、窗口的重绘时不擦除原来的内容:新建CShape类用来保存线条的颜色,线 宽,填充色等属性,在窗口大小发生变化时有OnDraw(CDC* pDC)函数进行重绘工作,重绘中调用了各个绘图函数的Draw(CDC *pDC)函数。 11、所绘图形的保存于读取,通过Serialize(CArchive &ar)函数进行序列化操作, 将所绘图形的信息通过文件的形式保存起来。

C++实验报告(MFC简单画图程序)

VC++程序设计实验报告 一、实验目的 掌握MFC编程 二、实验内容 用MFC向导创建单文档应用程序,一个简单的画图程序。 ?使用C++语言实现 ?使用VC++6.0集成开发环境开发 ?使用MFC应用程序开发框架 三、实验步骤 ?基本功能描述 1. 打开exe文件,在绘图下拉菜单中可分别设置绘制的图形形状,如直线、 曲线、矩形及椭圆,线宽选项,有1-6可供选择,线型选项有实线、虚线、点线和点段线供设置,还可以设置线色以及填充色,通过弹出的颜色对话框选择需要的颜色,如果不选择线宽、线色以及填充色,则按默认的画笔,画刷来绘制选择的图形。 2. 选择好图形后,通过鼠标可以绘制出相应的直线,矩形或椭圆,鼠标的按下确定图形的起点,鼠标的拖动则确定了图形的终点,即通过鼠标的拖动来决 定图形的大小,当鼠标弹起,此图形则绘制完毕。 ?设计思路 1. 对需要用到的变量进行初始化。 2. 选择相应的图形之后就响应相应的消息处理函数,给shape赋对应的值。选择不同的线宽,线色与填充色,即可改变画笔或画刷的属性。 3. 鼠标的按下响应函数OnLButtonDown(),捕捉鼠标当前位置得到起点的坐标,鼠标的拖动响函数OnMouseMove()改变终点的坐标,鼠标的弹起响应OnLButtonUp(),确定终点坐标,刷新,得到绘制图形。 4. 选择图形或其它属性,可进行下一次绘制。 ?软件设计 A 设计步骤 1.创建单文档 创建一个MFC AppWizard[exe]工程,命名为“Draw”,如图1所示,并创建单文档,如图2所示。创建成功后,系统自动生成相应的类,如图3所示。

图1 创建工程 图2 创建单文档

MFC经典绘图方法总结

MFC经典绘图方法总结 Windows 绘图的实质就是利用windows提供的图形设备接口GDI(Graphics Device Interface)将图形会制在显示器上。 为了支持GDI绘图,MFC提供了两种重要的类: 设备上下文DC(Device Context)类,用于设置绘图属性和绘制图形; 绘图对象类,封装了各种GDI绘图对象,包括画笔、刷子、字体、位图、调色板和区域。 CDC类介绍: 在MFC中,CDC是设备上下文类的基类,派生类包括:CClientDC, CPaintDC, CWindowDC, CMetaFileDC类 CClientDC 客户区设备上下文,绘制客户区时 CPaintDC 一般发生在窗口需要重绘时 CWindwDC 可以绘制整个窗口,通常在窗口WM_NCPAINT消息的响应函数CWnd::OnNCPaint()中使用 CMetaFileDC 专门用于图元文件的绘制,图元文件记录一组GDI命令,重建图形输出。 CDC包含m_hDC和m_hAttribDC二个设备上下文。CDC指导所有对m_hDC的输出GDI调用(SetTextColor)以及对m_hAttribDC的大部分属性GDI调用(GetTextColor)。 CDC对象的重要函数如下: 1、为指定设备创建上下文virtual BOOL CreateDC(...) 比如创建一个为屏幕的设备上下文 CDC dc; dc.CreateDC("DISPLAY", NULL, NULL,NULL); 2、创建内存设备上下文,与指定设备上下文兼容virtual BOOL CreateCompatibleDC( CDC * pDC) 3、删除CDC对象对应的Windows设备上下文, 通常不调用该函数而是使用析构程序virtual BOOL DeleteDC(); 4、将HDC句柄转化为设备上下文的句柄: CDC *pDC=CDC::FromHandle( hDC ) 5、选择GDI对象入选到设备上下文中,一共有五种形式: CPen * SelectObject( CPen * pPen) ; CBrush * SelectObject( CBrush * pBrush) ; virtual CFont * SelectObject( CFont * pFont) ; CBitmap * SelectObject( CBitmap * pBitmap) ; int SelectObject( CRgn * pRgn) ;

mfc简单绘图程序报告

简单绘图程序 1 需求说明 1.1 问题描述 设计一个简单的绘图应用程序,可以绘制图形或自由绘制线段,可以更改颜色、画笔粗细、保存文件。 1.2功能说明 1.图形绘制功能:直线、椭圆、矩形。 在菜单栏中选择需要的图形(也可以通过工具栏中选择)用鼠标便能在视图中绘出相应的图形。 2.可以绘制自由线段 3.对图形的操作:能通过菜单栏弹出对话框选择线宽、自定义颜色,也可以擦除绘制的线段。 4.可以保存绘图文件,保存后打开可以继续绘制。 2.1.3 数据说明 在程序运行以后,当用户单击某个菜单项时,应该把用户的选择保存起来,以便随后的绘图操作使用。在CDzyView类中添加一个私有变量xz;用来保存用户的选择(直线、矩形、椭圆、自由绘图)在绘制时都可有两点来确定其图形。当鼠标左击时得到一个点,当鼠标停止移动时得到另外一个点。为视图类CDzyView分别捕获鼠标左键按下和弹起这两个消息。当鼠标左键按下时,需要将鼠标当前按下点保存至sx、sy,在鼠标移动停止后,将当前坐标保存至ex,ey.

其他主要数据说明: int fd 判断是否为自由绘图模式int w 线宽 int R RGB中的R int G RGB中的G int B RGB中的B CGraph类中 int m_nType:保存后重绘时用户的选择int qdx; 重绘起点x int qdy; 重绘起点y int zdx; 重绘终点x int zdy; 重绘终点y CLine类中 int cx; 重绘线宽 int sx; 重绘起点x int sy; 重绘起点y int zx; 重绘终点x int zy; 重绘终点y int w; 重绘线宽 自定义颜色对话框关联变量: IDC_EDIT_RED int m_Red IDC_EDIT_GREEN int m_Green IDC_EDIT_BLUE int m_Blue IDC_SCROLL_RED CScrollBar m_Sred IDC_SLIDER_GREEN CSliderCtrl m_Sgreen IDC_SPIN_BLUE CSpinButtonCtrl m_Sblue 2 分析、设计与实现 2.1 主要功能设计与实现

MFC程序结构分析

MFC程序结构分析2008-11-08 16:39 分类:VC\MFC 字号:大中小 1 Windows程序工作原理 WINDOWS 程序设计是一种完全不同于传统的DOS 方式的程序设计方法,它是一种事件驱动方式的程序设计模式。在程序提供给用户的界面中有许多可操作的可视对象。用户从所有可能的操作中任意选择,被选择的操作会产生某些特定的事件,这些事件发生后的结果是向程序中的某些对象发出消息,然后这些对象调用相应的消息处理函数来完成特定的操作。WINDOWS 应用程序最大的特点就是程序没有固定的流程,而只是针对某个事件的处理有特定的子流程,WINDOWS 应用程序就是由许多这样的子流程构成的。 从上面的讨论中可以看出,WINDOWS 应用程序在本质上是面向对象的。程序提供给用户界面的可视对象在程序的内部一般也是一个对象,用户对可视对象的操作通过事件驱动模式触发相应对象的可用方法。程序的运行过程就是用户的外部操作不断产生事件,这些事件又被相应的对象处理的过程。下面是WINDOWS 程序工作原理的示意图。 2 建立应用程序 在介绍AppWizard 的时候,我们已经建立了一个名字为TEST 的工程,事实上这个框

架程序已经可以编译运行了。在BUILD 菜单中选择REBUILD ALL 菜单项,系统开始编译由 APPWIZARD 自动生成的程序框架中所有文件中的源代码,并且链接生成可执行的应用程 序。在BUILD 菜单中选择EXECUTE 菜单项,应用程序就开始开始运行了,虽然我们没有编 写一行代码,但是可以看出由系统自动生成的应用程序的界面已经有了一个标准WINDOWS 应用程序所需的几个组成部分,我们要做的事情是往这个应用程序添加必要的代码以完成 我们所需要的功能。 接下来将要对WINDOWS 自动生成的这个应用程序框架作详细的介绍,让你对MFC 方式的 WINDOWS 应用程序的工作原理有全面的认识,只有这样你才会知道应该如何往程序框架当 中添加需要的代码。 3 程序结构剖析 为了让您对MFC 方式的程序的框架有一个总体的认识,这里设计了一个表示程序中的 主要类之间的关系的图表:

MFC实现简单画图形程序(学习相关)

《MFC编程及应用》课程设计报告题目:简单画图形程序 学号:姓名: 指导老师: 时间: 评语:

程序设计步骤: 一、建立基于对话框的应用程序框架; 二、CMy0910200155Dlg类中关键新增变量的作用: CPtrArray pta; //用于保存已绘图形的相关信息。 CMemoryNode *pmN; //指向CMemoryNode类的指针,程序运行过 程中动态保存对象信息。 CMemoryNode *pmn; //指向CMemoryNode类的指针,从文件中读 取信息时动态创建类的对象。 COLORREF m_CurrentBrushColor; //用于存放当前画刷的颜色。 COLORREF m_CurrentPenColor; //用于存放当前画笔的颜色。 int num; //用于存放从"Index.txt"文件中读取的数字。 int flag=0; //用于标识:当为1时,表示按下了”画图”按钮;当为2时, 表示按下了”撤消”按钮;当为3时,表示按下了”加载历史” 按钮,则从文件中读取信息。 int mark; //用于标识:当为0时,表示刚画过矩形;当为1时,表示 刚画过圆角矩形;当为2时,表示刚画过椭圆。 int index; //用于存放pta数组的容量。 int flag1=0; //用于标识,和flag搭配,用来处理多种情况下的窗口重绘 问题。 int ButtonState=0; //用于标识,是类CShow和类CMy0910200155Dlg 的一个接口,通过其值在1和0之间转换,来处理弹出式对 话框的初次绘制和移动时的重绘问题。

c面向对象程序设计MFC简单计算器实验报告

计算机与信息工程学院 《程序设计基础》课程设计报告 题目名称:60.编写一个能实现简单功能的计算器学生姓名:刘沛东 学生学号:2011508154 专业班级:电子信息工程(1)班 指导教师:高攀

1 课程设计的题目 编写一个能实现简单功能的计算器 2 题目要求 1. 有一个计算器图形。 2. 能实现加、减、乘、除及乘方的运算。 3. 当输入题目时,屏幕上要在指定位置上显示出相应的题目内容,且相应的数字键要改变颜色 例如:输入数字1 时,在计算器图形上的1键变为红色。 4. 屏幕、图形颜色、形状自定 3 总体设计 3.1 总体框架 图1 系统框架

3.2 系统功能说明 在VC++6.0中绘制计算器界面,各控件的设置 对0~9控件设定相应的ID和其他属性: 图2 “1”控件设置 对“+、-、*、\”控件设定相应的ID和其他属性: 图2 “+”控件设置 对其它控件设定相应的ID和其他属性: 图3 其它控件设置

主要使用到Layout菜单中的Align功能对各个按钮进行对其,使界面更加整洁。拖出的控件有上面的一个Edit控件用于显示数字,Button控件用于处理鼠标的消息。 4 程序详细设计 4.1系统主调模块 图5 程序流程图

4.2各模块详细设计 4.2.1 建立的变量,控件的命名,对应的消息处理函数对应表 double poz; //保存小数点的位置,初始化为1,表示poz-1个小数点。 double m_Dis; //Edit控件上需要显示的数字 BOOL point_flag; //小数点表示位,判定是否是小数,是小数为1,不是小数为0。 double numfirst; //保存计算过程中的前一个数字, double numsecond;//保存计算过程中的第二个数字 char op;//记录当前的计算符号,可以为’+’,’-’,’*’,’/’,’=’,’c’,’n’ 变量初始化: poz=1; m_Dis = 0.0; numfirst=0; numsecond=0; op=0;

MFC程序结构分析

主题: MFC深入浅出 1.MFC深入浅出 MFC概述 2. 3. 1.MFC是一个编程框架 2. 3.MFC (Microsoft Foundation Class Library) 中的各种类结 合起来构成了一个应用程序框架,它的目的就是让程序员在此基础 上来建立Windows下的应用程序,这是一种相对SDK来说更为简单 的方法。因为总体上,MFC框架定义了应用程序的轮廓,并提供了 用户接口的标准实现方法,程序员所要做的就是通过预定义的接口 把具体应用程序特有的东西填入这个轮廓。Microsoft Visual C++ 提供了相应的工具来完成这个工作:AppWizard可以用来生成初步 的框架文件(代码和资源等);资源编辑器用于帮助直观地设计用 户接口;ClassWizard用来协助添加代码到框架文件;最后,编译, 则通过类库实现了应用程序特定的逻辑。 4. 5. 6. 7. 1.封装 2. 3.构成MFC框架的是MFC类库。MFC类库是C++类库。这 些类或者封装了Win32应用程序编程接口,或者封装了应用 程序的概念,或者封装了OLE特性,或者封装了ODBC和DAO 数据访问的功能,等等,分述如下。 4. 5.(1)对Win32应用程序编程接口的封装 6. 7.用一个C++ Object来包装一个Windows Object。例 如:class CWnd是一个C++ window object,它把Windows window(HWND)和Windows window有关的API函数封装在C++ window object的成员函数内,后者的成员变量m_hWnd就 是前者的窗口句柄。 8. 9.(2)对应用程序概念的封装

简易画图板设计报告

设计报告:Graphic简易画 图板 -----韩伟谢程焜肖越周峰 电科二班

1设计目的 设计一个单文档类型的MFC AppWizard (exe)工程,工程取名为:Graphic。此程序将实现简单的绘图功能,包括点、直线、矩形、椭圆、扇形和连续线的绘制。并且能实现绘图的控制,包括线宽、线型和颜色的设置,图形的保存和打开以及笔刷的使用。 2 总体设计 设计图如图6

图6 3详细设计 首先,新建一个单文档类型的MFC AppWizard (exe)工程,工程取名为:Graphic。为此程序添加一个子菜单,菜单名称为“绘图”,并为其添加六个菜单项,分别用来控制不同图形的绘制。当用户选择其中的一个菜单项后,程序将按照当前的选择进行相应图形的绘制。添加的六个菜单项的ID及名称如表1所示。然后分别为这六个菜单项添加命令响应,本程序让视类(CGraphicView)对这些菜单命令进行响应,这六个响应函数的名称分别如表1所示。

在程序运行以后,当用户单击某个菜单项时,应该把用户的选择保存起来,以便随后的绘图操作使用。因此在CGraphicView类中添加一个私有变量m_nDrawType;用来保存用户的选择,该变量的定义如下所述: private: UINT m_nDrawType; 接着,在视类的构造函数中将此变量初始化为0,程序代码如下: CGraphicView::CGraphicView() { // TODO: add construction code here m_nDrawType=0; } 利用switch/case语句,来分别完成相应图形的绘制。当用户选择【绘图】菜单下的不同子菜单项时,将变量m_nDrawType设置为不同的值。程序代码如下:void CGraphicView::OnDot() { // TODO: Add your command handler code here m_nDrawType=1; } void CGraphicView::OnLine() { // TODO: Add your command handler code here m_nDrawType=2; } void CGraphicView::OnRectangle() { // TODO: Add your command handler code here m_nDrawType=3; } void CGraphicView::OnEllipse() { // TODO: Add your command handler code here m_nDrawType=4;

基于MFC的OpenGL绘图

基于MFC的OpenGL绘图 本文更新版本请点击 [置顶]《基于MFC的OpenGL编程》系列文章 一、简介 GDI是通过设备句柄(Device Context以下简称"DC")来绘图,而OpenGL则需要绘制环境(Rendering Context,以下简称"RC")。每一个GDI命令需要传给它一个DC,但与GDI不同,OpenGL使用当前绘制环境(RC)。一旦在一个线程中指定了一个当前RC,在此线程中其后所有的OpenGL命令都使用相同的当前RC。虽然在单一窗口中可以使用多个RC,但在单一线程中只有一个当前RC。下面我将首先产生一个OpenGL RC并使之成为当前RC,这将分为三个步骤:设置窗口像素格式;产生RC;设置为当前RC。 二、MFC中的OpenGL基本框架 1、首先创建工程 用AppWizard产生一个MFC EXE项目,其他默认即可。 2、将此工程所需的OpenGL文件和库加入到工程中 在工程菜单中,选择"Build"下的"Settings"项。单击"Link"标签,选择"General"目录,在Object/Library Modules的编辑框中输入"opengl32.lib glu32.lib glut.lib glaux.lib"(注意,输入双引号中的内容,各个库用空格分开;否则会出现链接错误),选择"OK"结束。然后打开文件"stdafx.h",加入下列头文件: #include #include 3、改写OnPreCreate函数并给视图类添加成员函数和成员变量

OpenGL需要窗口加上WS_CLIPCHILDREN(创建父窗口使用的Windows风格,用于重绘时裁剪子窗口所覆盖的区域)和WS_CLIPSIBLINGS(创建子窗口使用的Windows风格,用于重绘时剪裁其他子窗口所覆盖的区域)风格。把OnPreCreate改写成如下所示:BOOL COpenGLDemoView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs cs.style |= (WS_CLIPCHILDREN | WS_CLIPSIBLINGS); return CView::PreCreateWindow(cs); } 产生一个RC的第一步是定义窗口的像素格式。像素格式决定窗口着所显示的图形在内存中是如何表示的。由像素格式控制的参数包括:颜色深度、缓冲模式和所支持的绘画接口。在下面将有对这些参数的设置。我们先在COpenGLDemoView的类中添加一个保护型的成员函数BOOL SetWindowPixelFormat(HDC hDC)(用鼠标右键添加)和保护型的成员变量:int m_GLPixelIndex;并编辑其中的代码如下: BOOL COpenGLDemoView::SetWindowPixelFormat(HDC hDC) {//定义窗口的像素格式 PIXELFORMATDESCRIPTOR pixelDesc= { sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL| PFD_DOUBLEBUFFER|PFD_SUPPORT_GDI, PFD_TYPE_RGBA, 24, 0,0,0,0,0,0, 0, 0,

MFC原理结构说明

JEI
N.
MFC 原理結構說明
捷胤工業有限公司 總合研究所 (JISC)
CO .
LT D
捷胤工業有限公司 NEW JEIN Corp. Corp.

JEI
? 質流控制器(Mass?Flow?Controller)簡稱 MFC。簡 易的詮釋 MFC 是一種流量與控制閥組的精密組機 電組合,其測量方式與一般流量計最大的差別, 是在於它是利用熱感溫差 非接觸方式測量氣體 是在於它是利用熱感溫差、非接觸方式測量氣體 之質量流速。
N.
MFC 簡介
? MFC 應用於I C 工業、真空工業、食品工業、化 學工業以及醫療儀器等行業,需要求高精確度、 高穩定度及高品質等氣體流量控制,如:蝕刻、 物理 化學氣相沉積 高穩定度來達成 其應用 物理、化學氣相沉積、高穩定度來達成,其應用 之層面乃遍佈高科技產業。
CO .
LT D
捷胤工業有限公司 NEW JEIN Corp. Corp.

JEI
Intel
Connector
N.
MFC 主要結構
Mass flow sensor
CO .
Bypass
Zero switch
LT D
Control valve Outlet Block
PCB
捷胤工業有限公司 NEW JEIN Corp. Corp.

JEI
? 製程氣體中許多是有腐蝕性或容易液
化的氣體,其與氣體接觸的部份均是 化的氣體 其與氣體接觸的部份均是 以抗腐蝕性強的 SUS‐316L 做為材質, 整顆鑄造而成。
N.
MFC 本體 (Block)
CO .
LT D
捷胤工業有限公司 NEW JEIN Corp. Corp.

基于MFC的简单画图程序实验

简单画图程序 【实验目的】 本实验目的是通过构建基于MFC的windows画图程序,使学生: (1) 理解MFC应用程序的运行机制 (2) 掌握使用MFC构建Windows应用程序的基本结构及编程的基本方法 (3) 理解和掌握MFC应用程序消息处理机制及应用 (4) 掌握类向导(ClassWizard)的使用 【实验要求】 (1) 必须做好实验原理的预习。 (2) 需要对提供的程序代码进行分析,并明确实验时还应在何处添加哪些语句。 【实验环境】 Microsoft Windows XP Microsoft Visual C++ 6.0 1 基本功能描述 1) 在单文档菜单中,在菜单行中可插入一个菜单项,命名为绘图,在下拉菜单中可分别设置绘制的图形形状,如直线、矩形及椭圆,线宽选项,有1-5可供选择,还可以设置线色以及填充色,通过弹出的颜色对话框选择需要的颜色,如果不选择线宽、线色以及填充色,则按默认的画笔,画刷来绘制选择的图形。 2) 选择好图形后,通过鼠标可以绘制出相应的直线,矩形或椭圆,鼠标的按下确定图形的起点,鼠标的拖动则确定了图形的终点,即通过鼠标的拖动来决定图形的大小,当鼠标弹起,此图形则绘制完毕。 3) 增添工具栏,设置绘制的图形形状,线色以及填充色,可更方便地选择相应的功能。 2 设计思路 1) 对需要用到的变量进行初始化。 2) 选择相应的图形之后就响应相应的消息处理函数,给shape赋对应的值。选择不同

3) 鼠标的按下响应函数OnLButtonDown(),捕捉鼠标当前位置得到起点的坐标,鼠标的拖动响函数OnMouseMove()改变终点的坐标,鼠标的弹起响应OnLButtonUp(),确定终点坐标,刷新,得到绘制图形。 4) 选择图形或其它属性,可进行下一次绘制。

c++实验报告mfc简单画图程序).doc

V C++程序设计实验报告 一、实验目的 掌握MFC编程 二、实验内容 用MFC向导创建单文档应用程序,一个简单的画图程序。 ?使用C++语言实现 ?使用VC++6.0集成开发环境开发 ?使用MFC应用程序开发框架 三、实验步骤 ?基本功能描述 1. 打开exe文件,在绘图下拉菜单中可分别设置绘制的图形形状,如直线、曲线、矩形及椭圆,线宽选项,有1-6可供选择,线型选项有实线、虚线、点线和点段线供设置,还可以设置线色以及填充色,通过弹出的颜色对话框选择需要的颜色,如果不选择线宽、线色以及填充色,则按默认的画笔,画刷来绘制选择的图形。 2. 选择好图形后,通过鼠标可以绘制出相应的直线,矩形或椭圆,鼠标的按下确定图形的起点,鼠标的拖动则确定了图形的终点,即通过鼠标的拖动来决定图形的大小,当鼠标弹起,此图形 则绘制完毕。 ?设计思路 1. 对需要用到的变量进行初始化。 2. 选择相应的图形之后就响应相应的消息处理函数,给shape赋对应的值。选择不同的线宽,线色与填充色,即可改变画笔或画刷的属性。 3. 鼠标的按下响应函数OnLButtonDown(),捕捉鼠标当前位置得到起点的坐标,鼠标的拖动响函数OnMouseMove()改变终点的坐标,鼠标的弹起响应OnLButtonUp(),确定终点坐标,刷新,得到绘制图形。 4. 选择图形或其它属性,可进行下一次绘制。 ?软件设计 A 设计步骤 1.创建单文档 创建一个MFC AppWizard[exe]工程,命名为“Draw”,如图1所示,并创建单文档,如图2所示。创建成功后,系统自动生成相应的类,如图3所示。

图1 创建工程 图2 创建单文档

画图程序设计报告(MFC)

Windows程序设计课程设计报告 班级:计本08-1班 姓名:X X 学号:XXXXXXXXX 指导老师: 2010-11-29

目录 1 引言 (3) 1.1 课题背景 (3) 1.2 课程设计目的 (3) 2 功能说明 (3) 3 系统的实现 (4) 3.1 视图设计 (4) 3.2 编辑资源 (4) 3.3 编程思路及各个函数的实现 (5) 4程序功能的测试 (7) 4.1测试的研究与选择 (7) 4.2 测试环境 (7) 5.3 实例测试结果 (7) 5学习的总结 (9) 6参考文献 (10)

摘要:本课程设计实现的是画椭圆、矩形、直线和随手画功能等。这个画图小程序实现了简单的画图功能,具有简洁大方的图文外观。它的设计按软件工程的方法进行,系统具有良好的界面、必要的交互信息和简易的菜单进行操作。即时准确地获得需要的画图的工具,适合休闲娱乐和简单的画画,对人们的生活有一定的帮助。在课程设计中,系统开发平台为WindowsXP,程序设计设计语言采用Visual C++,在程序设计中,采用了结构化与面向对象两种解决问题的方法。 关键词:程序设计;画图;MFC;画图函数Ellipse()Restangle() 1 引言 1.1 课题背景 本课程设计主要在生活中的娱乐,可以在本程序上进行简单的绘图娱乐。 画图是日常生活中有效的工具,能实现简单的画图。本程序是在VC6.0中使用AppWizard创建基于对话框的应用程序。 1.2 课程设计目的 画图的实现,通过C++语句实现。在视图中实现画线功能,更好的了解MFC、C++等面向对象语言的设计和实现,运用自己所学的一些知识来实现其运用到现实的实践中,从而做到学而有用。 2 功能说明 本程序可以实现的功能如下: 1.运行程序后单击“编辑”菜单,选择“画矩形”后,用鼠标就可以在视图中画出一个矩形。 2.选择“画椭圆”,用鼠标就可以在视图中画出一个椭圆。 3.选择“画直线”,用鼠标就可以在视图中画出一条直线。 4.选择“随手画”,用鼠标就可以在试图中随手画画。 5.选择“TOP”就可以让画图窗口一直保持在其他窗口前面。 6.窗口右下角显示系统的当前时间。 7.将项目的默认图标换成自己设计的图标。

MFC视图结构框架分析

MFC文档视图结构框架分析 1:程序的“导火索”---theApp CmyApp theApp; 在声明对象的同时,调用其构造函数。按C++的语法,首先要调用其基类Cwinapp的构造函数. 这个文件主要用于应用程序的一些初始化操作。 class CWinApp : public CWinThread { DECLARE_DYNAMIC(CWinApp) public: // Constructor CWinApp(LPCTSTR lpszAppName = NULL); ………… } CWinApp::CWinApp(LPCTSTR lpszAppName) { if (lpszAppName != NULL) m_pszAppName = _tcsdup(lpszAppName); else m_pszAppName = NULL; // initialize CWinThread state AFX_MODULE_STATE* pModuleState = _AFX_CMDTARGET_GETSTATE(); AFX_MODULE_THREAD_STATE* pThreadState = pModuleState->m_thread; ASSERT(AfxGetThread() == NULL); pThreadState->m_pCurrentWinThread = this; ASSERT(AfxGetThread() == this); m_hThread = ::GetCurrentThread(); m_nThreadID = ::GetCurrentThreadId();

MFC画笔程序实验报告

功能说明 1、在画图之前,点菜单【画笔】,设置画笔之后才能绘图 图1、画笔设置 2、左侧工具条依次对应直线、自由画线、实体矩形、实体圆形、实体椭圆、选中区域、擦除功能 图2、图形绘制及编辑 3、选中区域后删除,点击菜单【编辑\删除选定区域】,即可完成删除功能 4、颜色设置,点击菜单【颜色】,弹出颜色对话框,选中颜色

图3、颜色设置 5、背景设置,点击菜单【背景设置】,弹出对话框,选择“是”加载默认位图 资源 图4、背景设置 6、点击保存按钮,生成图片保存到工程文件的文件夹中 问题分析 建立MFC单文档工程文件:Draw 一、画图程序支持画直线、自由连线(随鼠标移动连线)、实体圆形、实体矩形、实体椭圆。 在主窗口中添加工具条,工具条上有直线、自由连线、实体圆形、实体矩形、实体椭圆的的图标,命名为IDR_DRAWFRAME,在CmainFrame的OnCreat函数中将工具条加载上去,函数名为:LoadToolBar 二、支持区域选中(通过鼠标拖拽方框选中),并删除选中区域内所画的形状。 鼠标拖拽方框选中:可以设计绘制为背景为透明色的矩形 删除选中区域即将选中矩形上的图像去掉,变为系统白色区域,即:设计矩形填充为白色 三、支持各种笔形画图时的前景色和背景色

前景色:在菜单中添加颜色菜单,单击颜色菜单,弹出颜色选择框,选择颜色对画笔的颜色进行设置。 背景色:在菜单栏中添加背景设置按钮,选择背景设置,则默认设置图画位图背景为选定的文件 四、支持图擦功能,选中图擦时,随着图擦的移动,根据图擦的大小,将图擦经过的区域中的形状相关部分清除。 在工具条上添加擦出按钮,随着鼠标的移动,鼠标经过的区域图形消失,采用InvalidateRect函数、 五、支持打印、打印预览功能,并保持图片所见即所得。 在视图窗口绘制图形是在逻辑坐标系中展示的,而打印设备对应的是物理坐标系。为了实习所见即所得,需要继续逻辑坐标系到物理坐标系的转换。 六、支持将所画的内容保存为文件,格式为BMP格式。 在菜单【文件】中有“保存按钮”,点击此按钮,将所绘图形保存为.bmp文件。MFC没有提供文件的保存函数,需要自己设计算法,以完成.bmp文件的保存。首先当前显示的屏幕位图拷贝到BITMAP中,然后将BITMAP保存到内存中。 方案设计 一、画图程序支持画直线、自由连线(随鼠标移动连线)、实体圆形、实体矩形、实体椭圆。 实现步骤: (1)在主窗口中添加工具条,工具条上有直线、自由连线、实体圆形、实体矩形、实体椭圆的的图标,命名为IDR_DRAWFRAME,在CmainFrame 的OnCreat函数中将工具条加载上去,函数名为:LoadToolBar (2)直线图标ID号为:ID_SLINE;自由连线图标ID号为:ID_CLINE; 实体圆形ID号为:ID_ROUND 实体椭圆图标ID号为:ID_ELLIPSE 实体矩形ID号为:ID_RECTANGL (3)在CDrawView类中添加m_nDrawType变量控制画图类型,添加m-ptStart变量,保存鼠标起始点。为以上ID号添加COMMAND函数, 分别为:OnSline() 、OnCline() 、OnRound()、OnRectangle() 、OnEllipse()。 函数中控制m_nDrawType的值,以控制图形类型 (4)在CDrawView类中添加成员函数OnLButtonDown、OnLButtonUp和OnMouseMove,OnLButtonUp中完成直线、实体圆形、实体矩形、实 体椭圆的绘制;OnMouseMove中完成自由连线的绘制。 (5)为保证视图窗口刷新时,图形能够再现,添加类CGraph,此类中包含变量nFlags(控制OnMouseMove函数)、m_nDrawType(绘图类型)

MFC实验报告

实验报告 实验日期: 2013 年 05 月 18 日 一、实验目的 1、熟悉Visual C++的基本操作。 2、基本了解基于对话框的windows应用程序的编写过程。 3、对于Windows Socket编程建立初步概念。 二、实验要求 1、应用Visual C++中MFC CSocket类,实现网络数据传输。 2、仿照本实验步骤,制作实用的局域网一对一聊天程序。 三、实验原理

设置加入连接的数目,通过更改IP地址和端口号,成为不同的客户端,与服务器端连接,实现用户间的聊天功能。 1.程序整体框架:主程序监听一端口,等待客户接入;同时构造一个线程类,准备接管会话。当一个Socket会话产生后,将这个会话交给线程处理,然后主程序继续监听。 2.客户端(Client) 客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口,通常临时的、动态的分配一个端口。 3.服务器端(Server) 服务器端,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。 4.用户图形界面 用户图形界面方便程序与用户的交互,多个用户参加,完成会话功能,具体的设计要方便用户的使用,直观清晰,简洁明了,友好美观。 四、实验内容 一个最简单的点对点聊天程序 客户机/服务器模式是socket点对点网络程序典型的模式,以下这个实验就是实现一个简单的点对点通信的聊天程序。它用到的方法也是面向连接TCP连接的套接字MFC典型方式。其工作过程是:服务器首先启动,创建套接字后等待客户的连接;客户启动以后,创建套接字,然后和服务器建立连接;连接建立后,客户机和服务器可以通过建立的套接字连接进行信息通信。

MFC02_Visual Studio C++ MFC简单绘图程序

Visual studio C++ MFC 简单绘图程序-绘制国际象棋棋盘 功能:由Button将绘制的棋盘显示于Picture Control中 一、建立一个MFC功程序: 1.启动Visual Studio C++; 2.新建一个MFC对话框项目:New|Project|MFCAplication; https://www.360docs.net/doc/564241558.html,中输入mfc_pic,然后点|OK; 4.在Welcome to the MFC Application窗口:点next; 5.在Application Type窗口:点dialoge base;然后点Finish;出现如图所示的窗口; 6.删除窗口中的TODO…文本对象; 二、向窗口添加一个Picture Control和一个Button共二个对象: 1.修改Button的Caption属性为“绘制棋盘”,ID属性为IDC_BUTTON_DRAR; 2.修改Picture Control的ID属性为IDC_PIC,建立关联变量名为picD; 3.双击Button,添加如下代码: voidCmfcpicDlg::OnBnClickedButton1() { CRect r; intw,h,dxy,i,j; CWnd *pic = GetDlgItem(IDC_PIC); //取Picture的长宽信息 GetDlgItem(IDC_PIC)->GetWindowRect(&r); w=r.Width(); h=r.Height(); dxy=(wGetDC(); pdc->Rectangle(r); CBrushmyBrush; pdc->Rectangle(0,0,8*dxy,8*dxy); //绘制外框线 myBrush.CreateSolidBrush(RGB(0,0,0)); for(i=0;i<8;i++){ for(j=i%2;j<8;j+=2){ r.left=i*dxy; r.top=j*dxy; r.right=(i+1)*dxy; r.bottom=(j+1)*dxy;

相关文档
最新文档