MFC编程实例1
- 格式:ppt
- 大小:8.22 MB
- 文档页数:43
mfc 简单例程摘要:1.MFC 简单例程概述2.MFC 简单例程的实现步骤3.MFC 简单例程的应用示例正文:一、MFC 简单例程概述MFC(Microsoft Foundation Class)是微软提供的一个用于开发Windows 应用程序的类库。
它包含了大量预定义的类和函数,可以帮助开发者快速、简便地创建Windows 应用程序。
MFC 简单例程是指使用MFC 类库创建的一个简单的程序实例,通常用于演示MFC 的基本功能和操作方法。
二、MFC 简单例程的实现步骤1.打开Visual Studio,创建一个新的MFC 应用程序项目。
2.在Visual Studio 中,选择“File”>“New”>“MFC AppWizard”,然后点击“Next”。
3.在“AppWizard”对话框中,选择“A simple MFC application”,然后点击“Next”。
4.输入项目名称、选择项目位置,然后点击“Finish”。
5.在“Solution Explorer”窗口中,双击“MainFrame.cpp”文件,打开代码编辑器。
6.在代码编辑器中,可以编写MFC 简单例程的代码。
例如,可以创建一个窗口,添加按钮和文本框等控件,以及实现按钮点击事件的处理函数等。
三、MFC 简单例程的应用示例以下是一个MFC 简单例程的应用示例,它实现了一个简单的计算器功能:1.创建一个MFC 应用程序项目,并添加一个名为“Calculator”的窗口。
2.在“Calculator”窗口中,添加两个文本框(Text1 和Text2),用于输入两个数字;添加一个按钮(Button1),用于执行计算操作。
3.为“Button1”按钮添加一个点击事件处理函数(ON_BN_CLICKED)。
在函数中,编写计算两个文本框中数字之和的代码,并将结果显示在文本框(Text1)中。
4.编译并运行程序,可以看到一个简单的计算器界面。
MFC入门--对话框实例(注意:例子程序使用Vc6.0开发实验时请用VS2010实现)实例1目的:设计一个基于对话框的程序,界面上有一个“延迟6秒”的按钮,点击后,程序主窗口在6秒内无法拖动。
关键点:MFC程序入门、线程与进程、消息机制操作过程:1-新建项目,选择MFC AppWizard (exe),命名项目为“SingleThread”。
如图:(注:关于各项目类型的说明,请参见文件“VC功能简介.ppt”的第8页)2-选择“Dialog based”,点击Finish,仔细观察项目信息。
3-在资源视图内对主对话框添加静态文本:“我的第一个MFC程序”和“演示耗时的单线程”,继而添加一个按钮,按钮现实文字“延迟6秒”,如图:4-在资源视图内,双击“延时6秒”按钮,为其添加BN_CLICKED消息(按下按钮时发出的消息)的响应函数OnButton1()。
在其中添加代码:Sleep(6000);请根据老师对程序的讲解,思考如下问题:1.类的继承:三个的类(CAboutDlg、CSingleThreadApp、CStringThreadDlg)的继承轨迹是怎样的?2.程序的入口在哪里?有没有类似Win32 Application中对于WM_CREATE的处理?3.三个类的对象的关系。
4.消息如何映射?实例2设计一个基于对话框的程序,开始运行后,每两秒弹出一个消息框。
关键点:MFC程序入门;定时器的建立、使用与删除;消息映射操作过程:1-新建项目,选择MFC AppWizard (exe),命名项目为“Test”。
2-选择“Dialog based”。
3-在BOOL CTestDlg::OnInitDialog()函数中添加SetTimer(1,2000,NULL); // 启动定时器4-通过ClassWizard给对话框添加WM_DESTROY的响应函数。
如图:在其中添加代码:KillTimer(1);5-通过ClassWizard给对话框添加WM_TIMER的响应函数。
MFC实例教程何礼富(安徽理工大学)实例1 最简单的对话框程序实例2 鼠标测试程序实例3 点鼠标游戏实例4 为程序添加图标1.新建一个MFC AppWizard(exe)工程,工程名为IconTest2.在MFC AppWizard的Step 1步骤,选择“Dialog based”,其余的步骤全部选择默认。
3.切换到ResourceView视图,右键点击Icon,选择“import”,导入三个图标(.ico)文件,如下图:4.找到CIconTestDlg类的构造函数,找到下面的语句:m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);将其修改为:m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);5.运行程序,可以看到程序的图标已被修改成我们自己定义的图标。
6.继续回到Resource View视图,打开IDD_ICONTEST_DIALOG的设计界面,删除之前生成的文字框和按钮,重新添加一个文字框和一个按钮,如下图:7.将按钮控件的Style中的Icon选项选中8.找到CIconTestDlg类的OnInitDialog()函数,在其中添加下图中的语句:9.执行程序,图标就被显示在界面上了。
实例5 三国游戏之选择武将1.建立一个基于MFC对话框的项目“ComposedDialog”。
2.切换到Resource View视图,在左边的资源树上点右键,选择“insert”,弹出“Insert Resource”对话框,选择“Bitmap”,点“import”,导入事先准备好的位图文件。
3.设计界面:4.右键点性别组合框,选择“property”,添加以下数据:5.打开Class Wizard,添加以下变量:。
mfc单文档例子以下是一个简单的MFC单文档(SDI)应用程序的示例:1. 首先,创建一个新的MFC应用程序项目。
在Visual Studio中,选择“文件”菜单,然后选择“新建”->“项目”。
在“新建项目”对话框中,选择“MFC应用程序”,然后输入项目名称和位置,并单击“确定”。
2. 在“MFC应用程序向导”中,选择“单文档”作为应用程序类型,并单击“完成”按钮。
3. 在生成的代码中,找到`CMainFrame`类。
这是应用程序的主窗口类。
4. 在`CMainFrame`类的`OnCreateClient`函数中,添加以下代码:```cppvoid CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext pContext){// 创建视图窗口m_(_T("My View"), WS_CHILD WS_VISIBLE WS_BORDERWS_HSCROLL WS_VSCROLL, CRect(0, 0, 800, 600), this,ID_VIEW_WIN);}```5. 在`CMainFrame`类的`OnCreate`函数中,添加以下代码:```cppBOOL CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {if (CFrameWnd::OnCreate(lpCreateStruct) == -1)return -1;// 创建工具栏和状态栏CToolBarCtrl tb;CRect rect(0, 0, 800, 24);(WS_CHILD WS_VISIBLE CBRS_TOP CBRS_GRIPPERCBRS_TOOLTIPS CBRS_FLYBY, rect, this, ID_VIEW_TB);m_(WS_CHILD WS_VISIBLE CBRS_TOP CBRS_GRIPPER CBRS_TOOLTIPS CBRS_FLYBY, rect, this, ID_VIEW_TB);m_(this);m_(0, ID_VIEW_STATUSBAR, SBPS_STRETCH, 0);m_(1, ID_VIEW_STATUSBAR2, SBPS_STRETCH, 0);m_(2, ID_VIEW_STATUSBAR3, SBPS_STRETCH, 0);m_(0, SBPS_NORMAL);m_(1, SBPS_NORMAL);m_(2, SBPS_NORMAL);m_(0, _T("Ready"));m_(1, _T("Ready"));m_(2, _T("Ready"));return TRUE;}```6. 编译并运行应用程序。
例程1. MFChello步骤1.选择新建-项目,打开后出现如果1所示对话框。
选择VC++中的智能设备,在右边选择MFC 智能设备应用程序。
在下方的名称中输入MFChello,点击确定。
步骤2.步骤3.步骤4.步骤5.步骤6在BOOL CMFChelloApp::InitInstance()添加如下代码AfxEnableControlContainer(); //调用此函数的目的是为了使程序支持包含OLE控件MessageBox(NULL,_T("一个简单的MFC程序"),_T("你好"),MB_OK); //谈出对话框例程2.鼠标测试程序同例程1一样,建立一个基于对话框的MouseTest程序。
在右边的对话框编辑器中选择Static Text,添加到对话框中一个静态文本,然后更改右下角的静态文本的属性,Caption改为提示:点一下鼠标右键或左键,ID改为IDC_STATIC点击对话框,在右下角点击消息按钮,出现下图。
找到WM_LBUTTONDOWN消息,添加OnLButtonDown函数。
在函数中添加代码如下MessageBox(NULL,_T("你点的是左键"),_T("The first Dialog"),MB_OK);同样操作在WM_RBUTTONDOWN消息,添加OnRButtonDown函数。
在函数中添加代码如下MessageBox(NULL,_T("你点的是右键"),_T("The first Dialog"),MB_OK);进行仿真即可。
例程3.添加图标创建一个基于对话框的IconTest程序。
切换到资源视图。
右键点击Icon,选择添加资源,弹出下图。
选择导入,导入一个图标文件(.ico)文件,如下图。
点击CIconTestDlg类,找到CIconTestDlg函数。
实例一:最简单的对话框程序Step1:新建MFC应用程序首先打开Visual Studio2008,选择MFC应用程序,设定好路径和工程名(这里我设置工程名为为“Calculator”)。
这里要注意的是在创建向导步骤1的时候,我们选择“基本对话框”,其他选项默认即可。
点击“完成”后界面如图所示。
Step2:添加代码在文件“MFChello.cpp”中,添加如下代码:MessageBox(NULL,"一个简单的MFC程序应用","实例一",MB_OK);出现的问题:MessageBox(NULL,"一个简单的MFC程序应用","实例一",MB_OK);error C2664: “MessageBoxW”: 不能将参数2 从“const char [22]”转换为“LPCWSTR”解决方法:1.“项目”——>“MFChello属性”“配置属性”——〉“常规”——〉“字符集”,选择“使用多字节字符集”。
2.将代码改为:MessageBox(NULL,L"一个简单的MFC程序应用",L"实例一",MB_OK);实例二:鼠标点击测试程序Step1:新建一个MFC应用程序同上,不再赘述。
Step2:修改界面选择图中Edit Cntrol 控件,点击右键,选择“属性”,右侧显示属性对话框。
修改Caption为“提示:点击鼠标左键或者右键试试”Step3:添加鼠标响应消息左侧“类视图”,选择类“CHelloworldDlg”,点击“”,添加“消息”。
选择“WM_LBOTTUNDOWN”,点击下拉箭头,添加“OnLButtonDown”同样添加消息“OnRButtonDown”。
Step4:添加代码出现的问题:Caption显示乱码解决方法:1.“项目”——>“MFChello属性”2. “配置属性”——〉“常规”——〉“字符集”,选择“使用多字节字符集”。
mfc项目开发实例85个全文共四篇示例,供读者参考第一篇示例:MFC(Microsoft Foundation Classes)是一种面向Windows操作系统开发的图形用户界面应用程序框架,它是微软公司推出的一种软件开发工具,为开发人员提供了一系列类和函数,用于快速、简便地创建Windows应用程序。
在本文中,我们将介绍一些MFC项目开发的实例,希望对MFC开发者有所启发和帮助。
一、MFC项目开发实例之文件操作1. 创建一个MFC项目,实现文件的读取和写入功能。
可以通过CFile类来实现文件的打开、读取、写入和关闭操作。
2. 创建一个MFC项目,实现文件夹的遍历和文件的拷贝功能。
可以使用CFileFind类来查找文件和文件夹,使用CopyFile函数来实现文件的拷贝。
6. 创建一个MFC项目,实现数据库连接和查询功能。
可以使用CDatabase类和CRecordset类来连接数据库和执行SQL查询。
11. 创建一个MFC项目,实现多文档视图窗口的创建和切换功能。
可以通过CMDIChildWnd类和CDocument类来创建多文档视图窗口。
12. 创建一个MFC项目,实现对话框的创建和控件的添加功能。
可以通过CDialog类和CWnd类来创建对话框,使用CButton类、CEdit类和CListCtrl类等控件来添加在对话框中。
13. 创建一个MFC项目,实现菜单和工具栏的添加和事件处理功能。
可以通过CMenu类和CToolBar类来添加菜单和工具栏,使用消息映射来处理菜单和工具栏事件。
14. 创建一个MFC项目,实现状态栏和进度条的显示和更新功能。
可以通过CStatusBar类和CProgressCtrl类来创建状态栏和进度条,使用SetPaneText和SetPos函数来更新状态栏和进度条。
15. 创建一个MFC项目,实现动画和图像显示功能。
可以使用CImageList类和CAnimateCtrl类来实现动画和图像的显示。
VCMFC编程实例1本文由sdhexu贡献pdf文档可能在WAP端浏览体验不佳。
建议您优先选择TXT,或下载源文件到本机查看。
下载第一部分基础知识用 V i s u a l C++ 和 M F C 创建的应用程序大多会自动生成窗口 , 并且可以处理消息 , 进行绘图. M i c r o s o f t 在这方面做了大量的工作 , 隐藏了内部工作 , 使我们能够更轻松地创建一个一般的应用程序.然而,当用户不能实现他们想要实现的功能时,适当地了解内部工作机制,对于消除编程上的困惑会有好处.更重要的是,知道怎样执行任务(诸如把窗口放置到什么地方,从什么地方获得一个消息和在任意地方绘图) ,有助于分清用户的应用程序和由Visual C++ 和 M F C 自动提供的限于窗口 , 消息和绘图的应用程序. Visual C++ 应用程序有四项主要基本知识:创建一个窗口,了解其他的M F C类,把消息发送到一个窗口和在一个窗口内绘图.当然还有其他一些基本知识,我们也将在涉及时适当地进行讨论.不过本部分将讨论以下四项基本知识.窗口在第1章中,我们首先讨论在使用和不使用MFC的情况下创建一个窗口,以便清楚地了解 M F C是如何工作的. M F C窗口既可以由属于 M F C的C + +类创建,也可以由一个早于并存在于 M F C之外的非C + +窗口类创建.我们将进一步观看窗口类并讨论那些由 Wi n d o w s操作系统提供的窗口类.最后,再看看 MFC应用程序中都有什么.类在第2章中,我们将全面地讨论M F C提供的强大的功能.大多数M F C类是从三个 M F C基类( C O b j e c t,C W n d和C C m d Ta rg e t )派生来的.并讨论构成一个应用程序的 M F C类,支持窗口界面的M F C 类,用来绘图的类,访问文件的类,维护数据和数据库的类和访问因特网 (Internet)的MFC类.消息处理在第3章中, 我们将讨论一个MFC应用程序是怎样通过消息与外界及应用程序进行通信的. 还将讨论四种消息类型,并跟踪一个消息通过接收消息的类.最后将探讨该路径上的重定向消息.绘图在第4章中,我们将讨论在窗口中绘图的方法,包括绘图工具,绘图用的颜色,在屏幕或打印机上绘图,绘制位图和图标,绘制矩形和圆,绘制动画.下载第1章窗口在本章中,我们将讨论M F C用户界面的基本要素:窗口.在此基础上比较 A P I 窗口和 M F C窗口的异同,描述如何创建一个窗口,销毁一个窗口和控制 Wi n d o w s操作系统与窗口的通信问题.1.1 窗口和API环境窗口是屏幕上的一个矩形区域,应用程序在该区域中显示数据并等待鼠标点击. Wi n d o w s应用系统的用户界面可以包含许多窗口,每个窗口都有不同的特点,但都是互相联系的,如图 1-1所示.窗口应用程序的主窗口窗口窗口窗口图1-1 Windows应用程序用户界面包括的窗口1.1.1 三种类型窗口在这么多窗口中,基本类型只有三种:重叠(Overlapped)窗口,弹出 (Popup)窗口和子窗口 ( C h i l d ).在它们之间并没有太多内在的差异,但是使用不同的窗口风格,它们的外观是不同的(见图1-2). 重叠窗口窗口. 弹出窗口通常以对话框和消息框的形式与用户对话. 子窗口通常用在视图(View)中,如在文本编辑器中的文本显示,也用在控件中,如在对话框中的OK按钮.而对那些看起来像按钮或控件的子窗口,也称为"控件"窗口. 重叠窗口和弹出窗口的主要区别是弹出窗口出现时可以没有标题 (也称为标题栏 ).子窗口与重叠窗口或弹出窗口的主要区别是子窗口只能出现在另一个窗口中,并且子窗口的任何多余部分都被该窗口移去或剪切掉.另外,子窗口是唯一不能有菜单条的窗口. 参见图1-3中的Windows 应用程序,其中包括重叠窗口,弹出窗口和子窗口. 通常用于建立应用程序主窗口.事实上,有时也叫做"主"窗口或者"框架"下载重叠窗口最基本的窗体第1章窗口3弹出窗口注意:在它的最基本的窗体中,系统不进行任何绘制. 窗口都是客户区子窗口注意:在它的最基本的窗体中,系统不进行任何绘制. 窗口都是客户区典型的外观注意:这都是客户区.子窗口通常自己进行绘制共同的设置注意:子窗口不能有子菜单图1-2 窗口风格可以用来区分三种不同类型的窗口不是一个窗口—显示在子窗口中, 并由子窗口绘制属于桌面的重叠窗口,也称为主窗口属于主窗口的弹出窗口属于主窗口的子窗口属于弹出窗口的子窗口,它位于弹出窗口之中图1-3 由重叠窗口,弹出窗口和子窗口组成的窗口应用程序1.1.2 客户区和非客户区每个窗口都有由系统绘制的"非客户区"和由应用程序绘制的"客户区" .系统可以绘制图1-4显示的其中一个或者全部特征,当然也可以把所有的特征留给你去绘制.任务栏应用程序图标最小化按钮最大化按钮菜单条关闭按钮垂直滚动条水平滚动条系统菜单(单击应用程序图标时,显示虚线框)客户区图1-4 窗口的非客户区可以由系统选择绘制每个窗口代表内存中的一个窗口对象,并由该窗口对象告诉 Wi n d o w s操作系统将窗口绘制在何处,以及在对鼠标单击,键盘按下(假设该窗口拥有输入焦点 )和时钟终止等事件作出响4图1-5).第一部分基础知识下载应时应调用什么应用程序.窗口对象自身是窗口类的一个实例,它不是Visual C++的类,而是存在于Visual C++之外,并早于Visual C++的Microsoft Windows所属的类.然而,就像C++的类一样,窗口类为每个基于它创建的窗口定义了若干特征,如背景色和往何处发送消息等(见窗口对象窗口类窗口①使用RegisterClass( ) 函数创建窗口类②窗口对象由CreateWindow( ) ③窗口管理器保持一个窗口对函数创建,作为它的变量传象列表,并告诉每个对象在输窗口类屏幕上绘制自己图1-5 Microsoft Windows所属的窗口类创建的窗口对象Wi n d o w s操作系统提供了一个扩展的应用程序接口 ( A P I ),可以用来创建和维护这些窗口对象.调用 C r e a t e Window( )函数可以创建一个窗口对象;调用 S e t WindowLong( )函数可以改变由窗口类定义的特征;调用MoveWindow( )函数可以移动窗口;调用DestroyWindow( )可以退出窗口.如此说来, MFC又能做些什么呢?1.2 窗口和MFC环境M F C窗口是 C + +和Windows API 调用的综合.事实上, M F C 窗口提供了许多 (但不是全部) Windows API的C + +封装,从而减轻了编写 Wi n d o w s应用程序时一些乏味的工作,并提供了一些新的服务. M F C窗口不对窗口对象进行直接控制,而在 A P I环境中却是可以的.如果不能在 A P I环境中实现某项功能,那么肯定也不能在 M F C环境中实现.举例来说, M F C库的C W n d可以创建一个窗口,但它只是过去在API环境中使用的API调用的封装. 微软已经把在 M F C库中创建和维护一个窗口的逻辑作为真正的 C + +封装和控制.然而, 这种方法虽使得MFC库万能,但却是不方便的,并导致了严重的冗余和更多的错误. 创建M F C窗口是复杂的,首先,创建类 C W n d的一个实例,然后调用类 C W n d的一个成员函数,该成员函数调用API中的CreatWindow( )函数.返回的窗口句柄 (这只是指向窗口对象的非直接指针 )保存在类CWnd的成员变量 m_hWnd中. 注意因为窗口在内存中创建,而内存经常发生变化,窗口地址可能是经常变化的.因此,窗口句柄并非直接指向窗口对象,而是指向跟踪窗口对象地址的另一个指针. 销毁窗口同样也是复杂的,必须确保销毁了该窗口对象,以及封装该窗口对象的 CWnd实例.虽然CWnd对象知道窗口对象,但是窗口对象并不知道 CWnd对象(见图1-6).下载窗口对象窗口类 CWnd类对象第1章窗口5窗口①首先,用 AfxRegister Class( ) 函数创建一个窗口类②然后,在堆栈上或堆中创建一个 CWnd类对象③调用 CWnd的成员函数 Create(),该函数自身调用图 1 - 4中看到的 ::Create Window()函数④ ::Create Window ⑤窗口管理器告知再次创建窗口; 每个窗口对象在窗口句柄保存到屏幕上绘制自己 CWnd中图1-6 应用两个对象创建MFC窗口尽管窗口应用程序的用户界面可以由几十个,甚至几百个窗口构成,但是大多数窗口还是由不到十个的窗口类创建的.即使在应用程序中有一千个窗口,每个窗口也只能是三种基本类型之一:重叠窗口,弹出窗口或子窗口.1.3 怎样应用MFC创建一个窗口可以用MFC的CWnd类创建一个窗口:CWnd wnd; BOOL b=wnd.CreateEx (ExStyle, ClassName, WindowName, Style, x, y, Width, Height, Parent, Menu, Param);第一行代码创建了一个CWnd类的对象,第二行通过调用Windows API函数CreateWindowEx( ) 创建了真正的窗口.HWND hwnd=::CreateWindowEx (ExStyle, ClassName, WindowName, Style, x, y, Width, Height, Parent, Menu, Instance, Param);因为C W n d类只是封装了用于创建窗口的 Windows API函数( C r e a t e WindowEx( )),因此, 从本质上讲,创建窗口所必须的参数在API环境和MFC环境中是相同的:■ ■ ■ ■ ■ ■参数Style和ExStyle决定窗口的"外观"和类型 (重叠,弹出,子窗口 ). 参数ClassName决定在创建窗口时使用的窗口类. 参数WindowName决定窗口标题内容(如果窗口标题有内容). 参数x, y, Width和Height决定窗口的位置和大小. 参数Parent指向拥有该窗口的窗口指针 (如果有这样的窗口 ). 参数M e n u指向内存中的一个对象,作为它的菜单使用—除非创建一个子窗口,如果是这样的话,那么该参数是帮助父窗口识别子窗口的IDnumber. 参数Instance识别该窗口属于哪个应用程序,以便发送到该窗口的消息能被发送到正确的应用程序的消息队列中. CWnd类填入Instance参数. 参数Param是在创建窗口时由窗口类使用的指针,该指针是指向附加信息的非强制性结构的指针.■■返回的hwnd参数是指向创建的窗口对象的指针,但在未创建任何窗口时,该参数返回值为NULL.窗口句柄自动地保存在CWnd类的m_hWnd成员变量中,这在前面的图 1-6中可以看到.6规则. 规则第一部分基础知识下载现在既然已了解了有关创建窗口的基本知识,那么让我们进一步来看看填写这些参数的1. 窗口名称参数该参数是一个零结尾的文本串,用该串指明在窗口标题栏中显示的内容.如果窗口没有标题栏,该参数可以为零(0). 然而,某些通用控件也使用该参数.例如,按钮控件把该参数的内容放在按钮的表面. 在创建窗口标题栏后,可以用类CWnd的成员函数SetWindowText()来改变窗口标题栏的名称.2. 风格和扩展风格参数这两个是3 2位的参数,用来指定创建什么类型的窗口.可以选择多种类型,如下面的例子所示:,WS_CHILD|WS_VISIBLE,窗口风格参数的作用包括:■用于创建三种基本窗口类型的风格,用 W M _ C H I L D创建一个子窗口;用 W M _ P O P U P 创建一个弹出窗口. W M _ O V E R L A P P E D创建一个重叠窗口.如果不为窗口指定任何一种风格,那么窗口风格默认为WM_OVERLAPPED. 用以增添窗口的非客户区特色的风格.例如,可以用 W S _ V S C R O L L为窗口添加一个垂直滚动条,如图 1-7所示其他非客户区窗口风格.■■若在CreateWindow( ) 中定义了菜单条,则菜单条出现, 它不是一个子窗口 (使窗口可视) (禁止窗口输入)如果选取了最小化或最大化按钮则关闭按钮出现图1-7 非客户窗口风格用来增添窗口的特色■由每个通用控件定义的风格.例如, B S _ F L AT按钮风格告诉按钮控件绘制一个二维按钮. 用来使窗口可视,可操作和 /或初始最大化的风格. 用来标识控件组起始控件的风格,或者当用户敲击 Tab键控制焦点在窗口中变化时,用来指示哪个控件有资格获得输入焦点的风格. 想了解更多的有关窗口风格的例子,请参阅附录 A.■ ■■在创建窗口以后,可以用C W n d的成员函数ModifyStyle( )和ModifyStyleEx( )改变窗口风格.某些风格可能要求重画窗口,这时,可以给 ModifyStyle( )函数添加第三个参数,自动激发类CWnd的成员函数SetWindowPos( )做重画窗口工作.下载CWnd wnd; wnd.ModifyStyle (0,WS_BORDER,SWP_NOZORDER);第1章窗口7事实上,给 M o d i f y S t y l e ( )或M o d i f y S t y l e E x ( )添加任何第三个参数,都需要添加下面的 S e t WindowPos( ) 选项: S W P _ N O Z O R D E R,S W P _ N O M O V E ,S W P _ N O A C T I VAT E和 SWP_SHOW. 注意有时候,甚至一个重画的窗口可能与新风格不相容,尤其对通用控件窗口来说更是这样.因为单个窗口决定重画窗口时使用什么风格.在这种情况下,唯一的办法是: 在事先存储已有窗口的风格和其他参数后,销毁和重建该窗口. 3. X 和Y位置参数这是两个 3 2位的参数,用于以像素为单位指定窗口的位置.创建重叠窗口和弹出窗口时,X和Y是相对于桌面窗口左上角的位置.而创建子窗口时, X和Y是相对于父窗口客户区的左上角位置.如果把 X和Y参数都设置为 C W _ U S E D E FA U LT,那么系统将自动为窗口选定一个位置.系统层叠排列这些新窗口 (见图1-8).第一窗口下一个窗口第三个窗口图1-8 CW_USEDEFAULT允许系统自动设定窗口位置然而,如果 X和Y参数都设置为 C W _ U S E D E FA U LT,那么子窗口在创建的时候,总被创建在(0, 0)的位置. 创建窗口以后,可以用类CWnd的成员函数MoveWindow( )移动窗口. 4. 宽度和高度参数这是两个 3 2位的参数,用于以像素为单位指定窗口的大小.如果将参数 Wi d t h和H e i g h t都设置为CW_USEDEFAULT,则系统将根据桌面窗口的大小,自动选定窗口的大小.然而,对于一个子窗口来说,系统将创建一个长和宽均为 0的窗口.如果窗口的风格是 W S _ M I N I M I Z E 或WS_MAXIMIZE,那么系统将忽视用户为 Width和Height设置的任何值. 创建窗口以后,可以用类CWnd的成员函数MoveWindow( )重新设置窗口的大小. 5. Z-Order 当几个窗口占据屏幕上同一区域时, Z - O r d e r决定哪个窗口显示在哪个窗口之上. Z O r d e r ( Z顺序)中的Z来源于坐标X-Y-Z轴的Z轴,其中Z轴垂直屏幕,并由屏幕指向外面.当窗口最初被创建或选中时,则窗口将出现在 Z - O r d e r的顶层.然而,该窗口永远不可能出现在一个最顶层窗口的上面,除非该窗口也是最顶层的窗口. "最顶层"窗口用 W S _ E X _ TO P M O S T 窗口风格创建,并显示在所有非最顶层窗口的上面,而与该窗口是不是当前选中的窗口无关. 创建窗口后,可以用 CWnd的成员函数 SetWindowPos()改变窗口的Z顺序. 6. 父窗口或物主窗口参数该参数是指向类 CW n d对象的指针,根据创建的窗口类型标识是父窗口还是物主窗口8■第一部分基础知识下载(Owner): 如果创建的是一个子窗口,那么用该参数来标识它的父窗口 (该子窗口所放置的并为之所截断的窗口 ).该值不能为 N U L L.子窗口只能出现在它的父窗口里面,当父窗口被销毁时它们也被销毁,并且当父窗口被隐藏或最小化时它们也被隐藏.■如果创建的是重叠窗口或弹出窗口,用该参数来标识物主窗口.如果该值为N U L L,则桌面窗口成为物主窗口.从属窗口总是显示在它们的主窗口上面,并且随着物主窗口的销毁而被销毁;物主窗口最小化时,则从属窗口被隐藏;但当物主窗口被隐藏时, 从属窗口并不被隐藏. 一个子窗口可能是另一个子窗口的父窗口,但绝不可能是一个物主窗口.如果试图使一个子窗口成为一个物主窗口,那么系统只能使那个子窗口的最顶层窗口作为物主窗口.图 1 - 9 是这些关系的概述.②子窗口对象被创建, 并显示在父窗口中①重叠或弹出窗口对象被创建,并显示在屏幕上③ 弹出或重叠窗口对象被创建,并显示在父窗口中图1-9 物主,父,子窗口的层次关系可以用 C W n d的成员函数 SetOwner( ) 改变已有窗口的物主窗口,用 C W n d的成员函数 SetParent( )改变父窗口. 7. 菜单或控件 ID 参数该参数用来标识菜单 ( M e n u )句柄或控件 (Control )ID,这要依赖于创建的窗口是子窗口, 重叠窗口,还是弹出窗口.■如果创建的是一个子窗口,用该参数标识控件 I D,控件I D通常用来帮助父窗口识别子窗口.因为该参数寻求一个 H M E N U变量,因此,需要用 H M E N U类型重载变量定义控件ID.例如,如果子窗口的控件 ID 是102,应该用如下方法定义它:…, (HMENU) 102,… ■如果创建的是一个重叠窗口或弹出窗口,用该参数定义窗口的菜单.若该值为 N U L L, 则菜单默认为在该窗口的窗口类中定义的任何菜单;如果窗口类也没有指定的菜单, 则该窗口在创建时没有菜单.可以用下面的方法为该参数加载一个菜单:HMENU hMenu=::LoadMenu (AfxGetInstanceHandle( ), MAKEINTRESOURCE (xx));下载这里的xx是应用程序资源里面的菜单 ID(Menu ID).第1章窗口9可以用CWnd的SetDlgCtrlID( )改变已有子窗口的 ID.用类CWnd 的成员函数 SetMenu( )改变一个重叠窗口或弹出窗口的菜单. 8. 实例前面已提到,CWnd类将填入该参数. CWnd通过调用AfxGetInstanceHandle( )获得该实例 (Instance).一个应用程序的实例从本质上标识了哪个程序在内存里. AfxGetInstanceHandle( ) 是由MFC库提供的静态函数. 9. 参数该3 2位参数 ( P a r a m e t e r )是可选的.它通常是指向一个结构或者类对象的指针,而该结构或者类对象是创建某种类型的窗口时需要提供的.例如,当用MDICLIENT窗口类创建窗口时, 需要该参数提供一个CLIENTCREATESTRUCT结构的指针.10. 类名参数类名(Class Name)参数是一个零结尾字符串,当创建一个窗口时,用来标识使用那个窗口类.关于窗口类和窗口处理,将在本章后面的内容中详细讨论.该参数不能为NULL,在创建一个非常一般的MFC窗口时,使用AfxRegisterWndClass (0)填入该参数.1.4 怎样使用MFC销毁一个窗口如前面所提到的一样,删除一个 M F C窗口可能有些烦琐,必须按下面的顺序删除两个对象:pWnd->DestroyWindow( ); //destroys Window Object delete pWnd; //destroys Cwnd Object也可以只删除 C W n d对象,因为 D e s t r o y Window( )是从CW n d的析构函数中调用的,但不提倡使用这种方法.销毁一个窗口而不先调用DestroyWindow( )函数,将使某些析构消息不能被任何从CWnd派生的类处理.你几乎不需自己销毁一个窗口,用户或系统通常会做这项工作. 如果需要在销毁窗口的同时销毁 C W n d对象,则应该在C W n d的派生类中添加下面的重载函数:CYourWnd::PostNcDestroy( ) { delete this; }PostNcDestroy( )是销毁窗口前调用的最后一个成员函数.但是,几乎不需对该函数进行重载,因为CWnd和派生类一般是嵌在另一个类中或建立在堆栈中的. 1.4.1 捆绑到一个已有的窗口如果一个窗口是用Windows API在应用程序建立之前或外面创建的,并且需要把它封装到CWnd类中,可以用下面的语句实现:CWnd wnd; wnd.Attach (hwnd);这里的hwnd是已有窗口的句柄. Attach( )只是把CWnd的成员变量 m_hWnd赋给hwnd. 也可以使用CWnd::FromHandle (hwnd),它查看是否有 C W n d对象已经封装了该窗口句柄并返回该 C W n d 对象的指针.如果不存在这样的 C W n d对象,将创建一个临时对象.如果是临10第一部分基础知识下载时对象,则不要使用该指针,因为在应用程序空闲的时候,该指针指向的对象将被删除. 1.4.2 窗口类前面已提及,一个窗口类不是一个 C + +类,而是早于并存在于 C + +之外的窗口专有的类. 窗口类的作用就像一个模板,可以由此创建其他窗口,并可共享某些特征,包括下面所示的特征: 类风格包括能给予窗口的一些微小的特征. 类图标类菜单如果窗口有图标,用它来指定在窗口的左上角处所画的图标. 如果窗口有菜单,用它来指定窗口中显示的菜单.类光标当光标通过窗口的客户区时,用它来指定显示哪种鼠标形状. 背景色定义用什么颜色来擦除窗口的背景色.窗口的客户区将显示该颜色. 窗口进程定义处理任何发送到该窗口的消息时应该调用的函数.定义窗口进程可能是窗口类唯一最重要的前提. 1.4.3 窗口进程窗口与环境的交互是通过发送和接收消息来实现的.如果系统要求窗口自己进行绘制, 系统给它发送一个 W M _ PA I N T 消息; 如果系统要求窗口销毁自己 , 则发送一个 W M _ D E S T R O Y消息.这些消息都由窗口的窗口进程处理,该窗口进程的地址在窗口类中定义.对于发送到由相同的窗口类创建的窗口的消息,系统采用完全相同的窗口进程进行处理. 相同的窗口进程是怎样跟踪所有的窗口的呢?它是怎么知道窗口A 画在( 1 0 , 3 4 ),而窗口 B画在 (56,21)呢?所有这些工作的完成只需使用窗口的窗口对象. 例如,所有用按钮窗口类创建的窗口,都使用相同的按钮窗口进程.如果一个WM_PAINT消息发送到其中任何一个窗口,则按钮窗口进程根据每个窗口的窗口对象指定的大小,位置和风格画出确切的按钮 (见图1-10).窗口对象③" BUTTON"的窗口进程搜索窗口对象,以查明绘制什么类型的按钮,如果风格是 "Check Box" ,则绘制一个复选框父窗口①用"BUTTON"窗口类创建的窗口②通过发送一个WM_PAINT 消息到窗口进程,窗口管理器告诉每个窗口绘制自己④如果风格是" Push Button",则窗口进程绘制一个按钮⑤ 窗口进程也搜索窗口对象以查明在哪里绘制这些控件窗口图1-10 按钮窗口进程使用窗口对象指定对哪个窗口进行操纵下载1.5 怎样使用MFC创建一个窗口类第1章窗口11当用户创建一个窗口类时,实际上只是在三个操作系统列表之一中注册一个 W N D C L A S S 结构.系统为每个窗口类类型维护一个列表: 系统全局类(System Global Class) 有效. 应用程序全局类(Application Global Class) 的线程有效. 应用程序局部类(Application Local Class) 由应用程序注册,并只对注册它们的应用程序或DLL有效. 当系统搜索一个窗口类时,从应用程序局部类开始,然后搜索应用程序全局类,最后搜索系统全局类. 要创建一个窗口类,可以先创建WNDCLASS结构的实例,然后用 MFC类库的AfxRegister Class( ) 注册它.也可以用 M F C类库的AfxRegisterWndClass( ) 来创建一个基于调用参数的WNDCLASS对象. 1.5.1 使用AfxRegisterWndClass( )函数注册一个窗口类 AfxRegisterWndClass( )函数在使用上是非常自动化的,一些通常需要你提供的参数都能自己填入,甚至连新的窗口类的名字也能自动产生.LPCTSTR lpszClassName=AfxRegisterWndClass(UINT nClassStyle, HCURSOR hCursor=0,HBRUSH hbrBackground=0, HICON hIcon=0);在系统启动时注册,且必须注册,对所有应用程序都由应用程序注册,只对应用程序及应用程序这些参数的使用规则如下: 1. 类名根据传给该函数的参数,为新的窗口类产生名字.如果传输的参数完全相同,那么创建的窗口类也将完全相同.如果需要创建新的窗口类,可以用 AfxRegisterClass( ). 2. 风格窗口类风格由下面选项列表中一系列标记的或 (OR)运算提供: 类风格CS_OWNDC CS_PARENTDC CS_CLASSDC CS_SAVEBITS CS_BYTEALIGNCLIENT CS_BYTEALIGNWINDOW CS_GLOBALCLASS CS_VREDRAW CS_HREDRAW CS_NOCLOSE CS_DBLCLKS 描述为为该窗口类创建的每个窗口分配唯一的设备环境.有关设备环境的更详尽资料见第4章为从系统高速缓存中检索设备环境,然后设置该设备环境的剪裁区,以组合到父窗口中,以便子窗口能画在父窗口上为分配一个设备环境给所有由该窗口类创建的窗口使用为由该类创建的任何窗口的视频存储区将被保存,以便窗口移动或关闭时,不需要重画基础窗口—这对快速机器来说作用不大为当计算机的显示卡和 C P U速度较慢时,这两种风格有用.添加这些风格后,当窗口在字节边缘时,显示卡更容易移动窗口为如果设置该风格,则该类是应用程序的全局类,否则它是一个应用程序局部类为如果设置了垂直风格,并且窗口的垂直大小发生了变化,则整个窗口被重画. 水平风格也这样为禁用系统菜单中的关闭命令为如果未设置该参数,并且双击由该窗口类创建的窗口,则传送给应用程序的将不是双击事件,而是两个相继完成的单击事件12第一部分基础知识下载3. 图标(Icon) 该参数是显示在窗口左上角的图标的句柄,但只适用于使用 W S _ S Y S M E N U的窗口风格. 应用程序主窗口的图标也显示在任务栏上.如果将该参数设置为理过,用CWnd的SetIcon()可改变已有的图标.4. 光标(Cursor) 该参数是鼠标移经应用程序窗口的客户区时,将要显示的鼠标光标句柄.如果将该参数设置为NULL,则显示的是箭头光标.可以用下面的语句装载一个光标:HICON hIcon=AfxGetApp( )->LoadCursor (xx);N U L L ,并且设置了W S _ S Y S M E N U风格,则系统将提供一个默认的图标.在 M F C环境中,绝大部分图标已被处这里的xx是应用程序资源中光标的名字或ID. 这里指定的光标意味着是该窗口的默认光标.如果想动态地改变光标形状,则应该处理该窗口的WM_SETCURSOR消息,并用 SetCursor( )来改变光标形状 (见第8章例33). 5. 背景色当系统创建窗口时,先在显示窗口的地方画一个矩形区域,以擦除该区域的背景色.该参数指定填充该矩形域时所用画刷的句柄 (参见第 4章有关画刷的详细内容 ).为窗口类创建的画刷对象在该类退出注册时被自动释放. 在指定背景色时,也可以不创建画刷对象,而指定下面所列系统颜色之一:COLOR_ACTIVEBORDER COLOR_ACTIVECAPTION COLOR_APPWORKSPACE COLOR_BACKGROUND COLOR_BTNFACE COLOR_BTNSHADOW COLOR_BTNTEXT COLOR_CAPTIONTEXT COLOR_GRAYTEXT COLOR_HIGHLIGHT。
mfc 简单例程下面是一个简单的MFC应用程序的例子。
这个例子会创建一个基本的窗口,并在其中显示一个按钮。
'''cpp#include <afxwin.h>class CMyApp : public CWinApp{public:virtual BOOL InitInstance(){CWinApp::InitInstance();// 创建一个主窗口CMainWnd* pWnd = new CMainWnd();m_pMainWnd = pWnd;pWnd->Create(NULL, _T("MFC App"));pWnd->ShowWindow(m_nCmdShow);pWnd->UpdateWindow();return TRUE;}};class CMainWnd : public CFrameWnd{public:virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam){if (LOWORD(wParam) == ID_BUTTON) {MessageBox(_T("Hello, MFC!"));return TRUE;}return FALSE;}};CMyApp theApp;'''这个程序创建了一个主窗口,并显示一个标题为"MFC App"的窗口。
然后,当用户点击窗口中的一个按钮(按钮的ID是ID_BUTTON)时,程序会弹出一个消息框,显示"Hello, MFC!"。
注意,这只是一个非常基础的例子,实际的MFC应用程序可能会更复杂,包括更多的窗口、控件和事件处理。
面向对象程序设计与mfc编程案例教程面向对象程序设计与MFC编程是软件开发中常用的两种技术,通过这两种技术可以更好地进行软件的设计和开发。
下面是一些以面向对象程序设计与MFC编程为题的案例教程,帮助读者更好地理解和应用这两种技术。
1. 图书管理系统案例:通过面向对象程序设计的思想,设计一个图书管理系统。
系统包括图书的增删改查功能,读者的借阅还书功能,管理员的权限管理功能等。
通过MFC编程实现系统的界面和交互。
2. 酒店管理系统案例:利用面向对象程序设计的思想,设计一个酒店管理系统。
系统包括客房的预订、入住、退房功能,员工的工资管理、排班管理功能等。
通过MFC编程实现系统的界面和交互。
3. 学生成绩管理系统案例:采用面向对象程序设计的思想,设计一个学生的成绩管理系统。
系统包括学生信息的录入、成绩的录入和查询功能,以及成绩统计和分析功能。
通过MFC编程实现系统的界面和交互。
4. 邮件客户端案例:利用面向对象程序设计的思想,设计一个简单的邮件客户端。
系统包括收发邮件的功能,邮件的查看和回复功能,以及邮件的分类和搜索功能。
通过MFC编程实现系统的界面和交互。
5. 聊天室案例:采用面向对象程序设计的思想,设计一个简单的聊天室。
系统包括用户的注册和登录功能,用户之间的消息发送和接收功能,以及实时在线用户列表等功能。
通过MFC编程实现系统的界面和交互。
6. 计算器案例:以面向对象程序设计的思想,设计一个简单的计算器。
系统包括基本的加减乘除功能,以及括号和优先级运算的支持。
通过MFC编程实现系统的界面和交互。
7. 文件管理器案例:采用面向对象程序设计的思想,设计一个简单的文件管理器。
系统包括文件的浏览和搜索功能,文件的复制和移动功能,以及文件的重命名和删除功能。
通过MFC编程实现系统的界面和交互。
8. 游戏开发案例:以面向对象程序设计的思想,设计一个简单的游戏。
系统包括游戏角色的移动和攻击功能,游戏关卡的切换和胜利条件的判断功能,以及计分和排行榜功能。
mfc项目开发实例85个标题:MFC项目开发实例85个引言概述:MFC(Microsoft Foundation Classes)是微软公司开发的一套用于Windows操作系统的C++类库,用于快速开发Windows应用程序。
本文将介绍85个MFC项目开发实例,涵盖了各种常见的应用场景和功能需求。
正文内容:一、图形界面开发1.1 绘制基本图形- 绘制直线- 绘制矩形- 绘制椭圆- 绘制多边形1.2 图像处理- 图像的加载与显示- 图像的缩放与旋转- 图像的滤波处理- 图像的边缘检测1.3 用户交互界面- 按钮控件的使用- 文本框控件的使用- 列表框控件的使用- 树形控件的使用二、文件操作2.1 文件的读取与写入- 文本文件的读取与写入- 二进制文件的读取与写入- CSV文件的读取与写入- XML文件的读取与写入2.2 文件的拷贝与移动- 文件的复制与粘贴- 文件的剪切与粘贴- 文件的重命名- 文件的删除与恢复2.3 文件的压缩与解压- ZIP文件的压缩与解压- RAR文件的压缩与解压- GZIP文件的压缩与解压- 7z文件的压缩与解压三、数据库操作3.1 数据库连接与断开- SQL Server数据库的连接与断开- MySQL数据库的连接与断开- Oracle数据库的连接与断开- SQLite数据库的连接与断开3.2 数据库查询与更新- 数据库表的创建与删除- 数据库表的查询与筛选- 数据库表的插入与更新- 数据库表的删除与修改3.3 数据库事务处理- 数据库事务的开启与提交- 数据库事务的回滚与撤销- 数据库事务的锁定与解锁- 数据库事务的并发控制四、网络通信4.1 TCP/IP通信- TCP客户端的创建与连接- TCP服务器的创建与监听- TCP数据的发送与接收- TCP连接的关闭与断开4.2 UDP通信- UDP客户端的创建与连接- UDP服务器的创建与监听- UDP数据的发送与接收- UDP连接的关闭与断开4.3 HTTP通信- HTTP请求的发送与接收- HTTP响应的处理与解析- HTTP连接的保持与断开- HTTP代理的设置与使用五、多线程编程5.1 线程的创建与销毁- 线程的创建与启动- 线程的暂停与恢复- 线程的结束与销毁- 线程的优先级设置与调整5.2 线程同步与互斥- 互斥锁的使用- 信号量的使用- 事件的使用- 临界区的使用5.3 线程通信与消息传递- 线程间的数据传递- 线程间的消息传递- 线程间的事件通知- 线程间的同步与异步处理总结:综上所述,本文介绍了85个MFC项目开发实例,涵盖了图形界面开发、文件操作、数据库操作、网络通信和多线程编程等多个方面。
MFC编程例题(VS2008)
编写一个可以对用户输入的两个数值进行加、减、乘、除运算的简单计算器。
图5.1 创建一个名为calculator的MFC应用程序
图5.2 选择“基于对话框”,并一路点击“下一步”一直到完成,或者在此点击完成
图5.3 图5.2完成后,出现一个对话框。
点击右边的工具箱,出现对话框编辑器
图5.4 删除原对话框中的静态文本控件,并选择工具箱中的控件到对话框中
图5.5 选择控件,右边出现该控件的属性。
根据图5.6中的表格,修改控件ID ,Caption 等
图5.6 对话框中控件的修改,添加变量和添加事件处理程序
图5.7 右键选择编辑框控件,点击“添加变量”
图5.8 为控件添加变量
图5.9 为Button控件添加事件处理程序
图5.10 选择合适的消息类型,并添加编辑
图5.11 图5.10完成后,所生成的消息处理函数
图5.12 在消息处理函数中,添加合适的代码,调试运行
图5.13 基于对话框的MFC应用程序:简单的计算器
图5.14 根据用户输入的值和选择,点击按钮(=),显示计算结果。
MFC应⽤程序编写实例—完整版(原创)前段时间,将近花了⼀周⾄两周上班和上班后的闲余时间,做了⼀个⽤于调试和测试⼯作项⽬的应⽤软件,下⾯将实现软件的重要步骤及主要功能讲解⼀遍,⽅便⽇后查阅。
程序开始后,提⽰登录框,输⼊⽤户名,密码后,登录进去主窗体,效果图如下:下⾯将主要实现的功能函数要点进⾏描述,具体实现如下:⼀、设置主窗体⼤⼩1、进⼊⼯程窗体初始化函数,OnInitDialog()中,在CDialog::OnInitDialog() 下⾯添加函数语句如下:SetWindowPos(NULL,0,0,600,400,SWP_NOMOVE); ////设置主窗体⼤⼩,长为600,⾼为400⼆、为主窗体添加背景图⽚:1、⾸先,在⼯程头⽂件中,声明画刷变量如:CBrush m_brBk;2、在⼯程OnInitDialog()中,添加如下代码:CBitmap bmp1;bmp1.LoadBitmap(IDB_BITMAP1);m_brBk.CreatePatternBrush(&bmp1);3、添加消息函数OnCtlColor,代码如下所⽰:HBRUSH CDebugDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);// if (pWnd == this)//// {//// return m_brBk;//// }return(HBRUSH) m_brBk;}三、调⽤模态对话框和⾮模态对话框(以菜单⼊⼝为例)如菜单所属的主窗体类名为CDebugDlg,调⽤对话框的类名为CPing实现调⽤⾮模态对话框⽅法:选择调⽤菜单⼊⼝后,点击添加消息处理函数,在函数体内添中如下代码:CPing *dlg = new CPing();dlg->Create(IDD_DIALOG_PING); //创建⼀个⾮模态对话框dlg->ShowWindow(SW_SHOW); //显⽰⾮模态对话框 实现调⽤模态对话框⽅法:Cping dlg;dlg.DoModal();四、调⽤外部应⽤程序⽅法:1、调⽤外部应⽤程序可采⽤WinExec函数例如,调⽤⼀个Tcpview.exe外部程序,可在消息处理函数中添加如下代码:WinExec(".\\dll\\TCPview\\Tcpview.exe",SW_SHOW); // 其中.代表当前路径,此时需要⽤到\\来区分路径。
只运行一个实例的方法在VC++ 中编程中,只运行一个实例的方法主要有两类:1遍历当前的所有窗口,查找相同的实例。
为了便于查找,一般要事先设一个查找标志。
2利用系统提供的互斥对象或信标,直接让系统抑制重复的实例。
在发现重复运行时,一般还有一个任务,就是激活已经存在的窗口。
一、第一类方法的实现下面是一个具体的例子,下图是示例代码运行的情况。
部分关键代码1、在App的InitInstance()中枚举所有窗口,查找本程序实例HWND oldHWnd = NULL;EnumWindows(EnumWndProc,(LPARAM)&oldHWnd); //枚举所有运行的窗口if(oldHWnd != NULL){AfxMessageBox("本程序已经在运行了");::ShowWindow(oldHWnd,SW_SHOWNORMAL); //激活找到的前一个程序::SetForegroundWindow(oldHWnd); //把它设为前景窗口return false; //退出本次运行}2、添加EnumWndProc窗口过程函数://通过自定义的属性名查找同类实例窗口CString g_szPropName = "Your Prop Name"; //自己定义一个属性名HANDLE g_hValue = (HANDLE)1; //自己定义一个属性值BOOL CALLBACK EnumWndProc(HWND hwnd,LPARAM lParam){HANDLE h = GetProp(hwnd,g_szPropName);if( h == g_hValue){*(HWND*)lParam = hwnd;return false;}return true;}3、在主窗口的OnInitDialog()中添加属性//设置窗口属性SetProp(m_hWnd,g_szPropName,g_hV alue);二、第二类方法利用互斥对象的例子//首先在InitInstance() 函数中创建一个同步对象//如果GetLastError() 返回ERROR_ALREADY_EXISTS就表明存在一个应用实例了//返回false取消// 创建同步对象hMutexOneInstantance=CreateMutex(NULL,TRUE,_T("PreventSecondInstance"));if(GetLastError()==ERROR_ALREADY_EXISTS) bFound=TRUE;if(hMutexOneInstantance) ReleaseMutex(hMutexOneInstantance);if (bFound==TRUE){ ::AfxMessageBox("You have Run one");return false;}这里没有进行激活已有实例的操作。