编写一个c++图形界面编程的程序:其中包含一个按钮,当鼠标移到按钮上时,隐

无声的从容 字数 147

通过测试发现有鈈同具体表现在程序运行时间上有不同,但不知道什么原因导致的哪位大侠能够指点一二?

win的进程没有父子关系

: 通过测试发现有不哃,具体表现在程序运行时间上有不同但不知道什么原因导致的,哪位大侠能够指点一二

是不是叫shell更准确一些?或者仅仅是看作父子關系

是不是双击运行相当于在cmd里运行后面带了一些默认的参数?

: 通过测试发现有不同具体表现在程序运行时间上有不同,但不知道什麼原因导致的哪位大侠能够指点一二?

可以用process explorer查看进程的环境变量和命令行参数是否一致

: 通过测试发现有不同具体表现在程序运行时間上有不同,但不知道什么原因导致的哪位大侠能够指点一二?

摘要:本文为熟悉 eMbedded Visual C++ 编程环境及创建应用程序并将其下载到 Windows CE 4.1 仿真程序提供了逐步说明本文共分为五个部分,每一部分都包含读者可以完成的许多练习完成所有这些步骤夶约需要 60 分钟。

在本文的该部分中将使用 Microsoft 基础类 (MFC) 应用程序向导创建一个应用程序,您可以将该应用程序下载到 Microsoft Windows CE .1 版仿真程序并在其上运行

在本文中,您可以点击大多数缩略图查看大图像

在该部分的练习中,您将执行以下步骤:

在平台管理器中配置设置

生成和部署第一个汸真程序应用程序

eMbedded Visual C++ 的基本用户界面如下图所示必要时,先花几分钟时间浏览一下这些工具再进入下一个步骤。

对于 Windows CE您不会像在 Intel x86 处理器中那样受到限制。注意该对话框右下角的处理器列表默认情况下,所有的可用处理器都被选中由于现在的目标只是仿真程序,因此除 Win32 (WCE emulator) 之外清除所有的复选框,如下图所示

单击 OK 启动向导。

选择 Document/View Architecture support? 复选框将使该向导为应用程序的主代码创建两个类Document 类旨在保存和保持状態(数据),而 View 类提供数据的图形化表示形式这是一种“一对多”关系,其中 Document 类可能具有多种相关视图每个视图提供数据的一个不同嘚图形因素。该体系结构以数据为中心因此,更改通知很简单并且通过文档集中进行数据访问和存储。

在该向导的下一页中保留所囿的默认选项,然后单击 Next如下图所示。

在该向导的下一页中单击 Next,如下图所示

在该向导的下一页中,单击 Finish如下图所示。

出现摘要時单击 OK 完成该向导,如下图所示

既然已经完成该向导,您就有了一个可以部署到仿真程序并在其之上运行的应用程序尽管它还不会莋任何特别有趣的事情。

使用 Windows CE 的部分好处在于从许多设备中进行选择甚至生成自定义设备及其相关 SDK 的灵活性在使用 eMbedded Visual C++ 开发应用程序时,您必须配置平台管理器以表明您希望将图像下载到何种平台和设备在部署项目之前,请检查平台管理器的设置

在对话框中,选择 STANDARDSDK_410然后單击 OK,如下图所示

您也可以从 WCE 配置工具栏中选择活动平台。

在这种情况下您只能使用单个的平台。如果您已经安装更多的 SDK此处的列表将会增加。

您也可以从 WCE 配置工具栏中选择活动配置

对于在初始向导页中选定的每种处理器类型,都会有两种相关的项目配置:调试和發布每种配置都包含诸如编译、链接以及调试设置等信息。您可以通过 Build | Configurations 菜单创建其他配置或删除现有配置由于只选定了仿真程序处理器,因此您只有两种配置。

迄今为止您已经设置了相关的信息,用于为目标设备环境生成正确的二进制图像最后,您需要选择在何處(是物理连接的设备还是仿真程序)放置输出图像在本文中,您只有一个可用目标这就是仿真程序。但是对于其他 CPU 类型则有多个選择。

现在您就可以生成并部署第一个仿真程序应用程序。在此步骤中该仿真程序将在桌面计算机上启动。启动过程可能需要一点时間

要生成和部署第一个仿真程序应用程序。

仿真程序应当启动然后,程序应自动地下载到仿真程序中重新编译和下载的键盘快速方式为 F7。

仿真程序屏幕应当如下图所示

现在,您需要启动应用程序

应用程序启动,如下图所示

此时,您拥有一个完整工作的应用程序 ─ 尽管它不能做太多工作!

单击 File | Exit 退出该应用程序如下图所示。

让仿真程序继续运行并切换到 eMbedded Visual C++准备下一个练习。

第二部分:向应用程序Φ添加鼠标捕获和手写输入绘图

现在您需要向应用程序中添加一些实际的功能在该部分的练习中,您将添加来自手写笔或鼠标的数据的捕获并将其绘制为屏幕上的手写输入您需要探测手写笔何时接触屏幕、何时移动以及何时离开屏幕。您将逐步生成这种功能这样就可鉯熟悉如何使用 MFC 向导来加快编写 Windows CE 代码的速度,并充分利用开发人员可用的 MFC 体系结构

在该部分的练习中,您将执行以下步骤:

该列表包含 5 個类它们形成标准 MFC Doc / View 应用程序的模板。

Doc / View 应用程序的设计将应用程序分成 Document 类(保存数据)和 View 类(向用户呈现数据)如先前的练习所述。其怹三个类 ─ App 类、MainFrame 类以及 AboutDlg 类 ─ 分别提供对应用程序、应用程序顶层窗口以及 About 对话框的支持

一种很好的习惯是,通过使用 Protected 选项限制访问来隐藏数据成员然后,类成员函数可以读取和更新类的状态但是外部函数和对象则不能。

m_CurrentPoint 变量保存最后一个绘图点但是您还需要一个其怹变量,来表明您是否处于绘图状态

类向导将对 CScribbleView 的定义进行编辑,向该类中添加变量您将使用该变量来表明何时需要捕获鼠标输入。

茬使用类之前对其状态进行初始化始终是一种很好的习惯因为有关构造的成员数据中保存的值并不存在自动保证。进行该初始化的最佳位置是类的构造函数而对于内部数据类型,使用类初始化列表则是一种较好的习惯

您需要查找类构造函数并对其进行修改以清除您的狀态。

在显示项目的类视图的左侧窗格中单击 CScribbleView 旁边的加号 (+) 展开该类中方法和数据的列表。

双击带有签名 CScribbleView() 的类的默认构造函数如下图所礻。

在大括号 ({) 之前添加以下代码行。

该类向导将 WM_LBUTTONDOWN 函数原型添加到应用程序中并打开该新函数的编辑器。

前面的代码设置类状态表示囸在绘图并存储手写输入的起始点。

类向导将 WM_LBUTTONUP 函数原型添加到应用程序中并打开该新函数编辑器。

前面的代码设置类状态表示绘图已經停止,然后将当前点设置为 0,0该设置是表示不存在上一点的一个特殊位置。

类向导将 WM_MOUSEMOVE 函数原型添加到应用程序中并打开该新函数编辑器。

在该代码中有意没有对 else 语句进行定义,因为向导生成的代码形成 else 语句

前面的代码检查您处于捕获模式(已经调用 WM_LBUTTONDOWN),并检查手写筆已经从之前的位置移动然后,它生成一个两点数组 ─ 最近捕获的点和最新捕获的点 ─ 并使用当前窗口的设备上下文在它们之间绘制一條直线

如果您不是处于绘图模式,则将通过调用 else 语句中的生成代码产生默认的操作如下所示。

现在您可以再次测试应用程序以确保所囿功能都正确无误

如果下载到仿真程序失败,进行检查以确保您现在没有运行早期版本的 Scribble.exe

如果应用程序仍然在运行,单击 File | Exit 退出

在新蝂本运行后,您应当只能通过在仿真程序上使用鼠标在应用程序中绘制直线注意您有一些不执行任何操作的菜单命令,如果您在运行 Scribble.exe 之湔加载了另外的应用程序并引起它重绘则会丢失所有的直线信息。

记住在完成测试后退出应用程序

第三部分:修改应用程序以存储和偅绘手写输入

现在,在重绘屏幕时直线数据丢失。您需要在 CScribbleDoc 类中添加存储变量以存储捕获的数据并向 View 类中添加更多代码以在适当的时刻调用这些方法。

在本部分的练习中您将执行以下步骤:

向其他头文件中添加引用

要向 CScribbleDoc 类中添加手写输入的类型定义

您可以使用前面的萣义把手写输入行作为点的集合,并引用手写输入行的集合

CArrayCList 类需要默认情况下没有包括在内的其他头文件。为了能够在整个项目中使鼡这些类您需要在 stdafx.h 头文件中添加对该头文件的引用。

要添加对其他头文件的引用

单击 Header Files 行旁边的加号 (+) 展开应用程序中使用的头文件列表

該列表将包含七个文件,它们形成标准 MFC Doc / View 应用程序的模板

stdafx.h 文件用于生成预编译头,该预编译头将包括在项目中所有已编译的文件中它提供一种编译项目中只使用一次的通用声明和类型的方法,以加快生成过程速度

只需在其下面添加该行:

如您所见,View 类负责捕获来自用户嘚信息并将其显示在屏幕上。但是Document 类负责存储和访问 View 类显示的数据。此时还没有存储或保存数据。在以下的步骤中您将添加为该點数据提供存储的成员变量。

要向 CScribbleDoc 类中添加手写输入数据的存储

类向导对 CScribbleDoc 类的类定义进行编辑将变量添加到该类中。由于该变量是一个保护变量您需要添加访问方法来设置和检索该集合中的数据。

类向导在头文件中添加公共成员函数声明并在源文件中添加一个空的实現。然后保留 ScribbleDoc.cpp 文件打开,现在就可以键入该方法的实现

既然您拥有文档中管理的数据,则需要修改现有的视图方法从而在文档中更噺和存储数据。您需要在视图中使用新的类变量来标识正在绘制的直线

在显示为 View 类定义的当前成员列表的左侧窗格中,双击 OnLButtonDown 方法如下圖所示。

该步骤检索与视图相关的当前文档并调用早先定义的 StartNewLine 方法。

在显示为 CScribbleView 类定义的当前成员列表的左侧窗格中双击 OnMouseMove 方法转到其实現。

对该实现进行修改紧接 ReleaseDC(pDC) 之后添加以下代码。

现在您拥有存储在文档中的点数据该数据在捕获输入时会正确地从 View 类中进行更新。要莋的下一个步骤是使该数据被擦除时可以在屏幕上重绘要重绘该数据,您需要修改 OnDraw 方法使客户区为空白以及执行其他操作您将从文档Φ记取每条直线,而且对于每条直线要在直线上的各点之间绘制。

在显示为 CScribbleView 类定义的当前成员列表的左侧窗格中双击 OnDraw 方法以转到其实現。

现在您就可以再次测试应用程序以确保所有功能正确无误

如果下载到仿真程序失败,检查以确保您现在没有运行早期版本的 Scribble.exe

如果應用程序仍然在运行,单击 File | Exit 退出

在运行新版本后,您应当只能在仿真程序上使用鼠标在应用程序中绘制直线对于该新版本,您可以启動其他应用程序然后退出查看 Scribble.exe 重绘其手写输入。

记住在完成测试之后退出应用程序

既然应用程序可以进行一些操作,而不仅仅是运行姠导生成的代码您就可以开始考虑 eMbedded Visual C++ 为设备和嵌入式解决方案的实际应用程序开发人员提供的一些主要优点。其中这些类型的解决方案明顯不同于桌面计算机开发的一个主要方面就是提供了调试和诊断工具。桌面环境受益于大量将其本质目标定位于相同硬件、使用相同操莋系统功能的开发人员因此,在过去的几年中已经创建了大量的工具以帮助进行应用程序开发。对于设备开发人员该领域的工具则昰凤毛麟角。在本文的该部分中您将使用 eMbedded

迄今为止,您已经使用 eMbedded Visual C++ 编译应用程序并将其下载到仿真程序中然后直接在仿真程序中运行该應用程序。在本部分的练习中您将执行以下步骤:

使用内置调试器运行应用程序

要使用内置调试器运行应用程序

您也可以按下 F5 执行该命囹。

调试器连接到仿真程序检查文件版本以及在仿真程序上启动应用程序。eMbedded Visual C++ 环境切换到调试模式并查找如下图所示的内容。

在该模式Φ您可以从主应用程序标题栏查看当前正在运行的应用程序。当前的自动变量位于窗口的左下侧部分(在前面的图形中没有变量因为應用程序正在运行)。当前的监视变量位于窗口的右下侧部分(在前面的图形中没有变量因为没有选定任何变量)。

为了使用不同的选項您需要在某个位置停止调试器。要停止调试器您可以使用 Build | Break 命令(如果没有系统代码正在运行),或者您可以设置断点并等待中断事件发生

从菜单栏中,单击 Edit | Breakpoints 加载断点窗口如下图所示。

您也可以按下 ALT+F9 执行该命令

Breakpoints 对话框中,您可以从三种主要的表达式类别进行中斷:从位置中断(Location 选项卡);当数据表达式评估为真时中断(Data 选项卡);或者窗口过程检索某个 Windows 消息时中断(Message 选项卡)这是前两种类别嘚组合。在应当发生中断时可能会使用该对话框来设置复杂条件。但是注意使用数据表达式可能会严重地影响目标环境的性能,因为茬每个指令后必须对该数据进行评估

在该过程中,您将根据位置来设置断点

现在,您拥有一个断点设置在从窗口释放鼠标左按钮时,将会出现该断点设置在运行应用程序之前,在编辑器中将不会图形化显示有关一个方法的断点因为在该断点之前调试器无法解释函數名。但是您可以设置有关特定行的断点,该特定行将导致在编辑过程中显示一个图形化提示F9 键是设置和清除基于位置的断点的键盘赽捷方式

现在您可以使用该应用程序并查看断点的工作。

使用鼠标在仿真程序中绘制一条直线然后释放鼠标按钮。

您将看到下图所示的玳码

在前面的图示中,红圈表示断点黄色的箭头显示执行的下一条语句。

在开发环境的左下侧窗格中现在您可以看到 AutoLocals 以及 this 选项卡嘚相关数据。要添加监视项您只需将它们从左下侧窗格拖放到右下侧窗格,或者也可以直接添加下图显示 Auto 选项卡。

Auto 选项卡中查找 m_InDraw,然后将其拖放到监视窗格

要查看监视项如何工作,您可以单步执行

您也可以按下 F10 执行该命令。

m_InDraw 的值变为 0 并出现红色表示它在最后嘚操作中发生了变化。

还有其他几个有用的应用程序调试窗口

查看调用堆栈、内存、寄存器以及反汇编。注意仿真程序、寄存器和反汇編均为 x86 特性对于其他处理器类型,您可以查看与目标 CPU 相关的寄存器以及显示目标 CPU 指令集的反汇编

现在您可以尝试一些高级功能。

要在運行时修改变量的值

您也可以按下 ALT+F9 执行该命令

单击 Debug | Go 继续运行应用程序,如下图所示

您也可以按下 F5 执行该命令。

下一个步骤您将设置囿关 OnMouseMove 方法的第一行的断点。

将插入符号放置到第一行 ─ if (m_InDraw) ─ 然后按下 F9 启用断点

切换回仿真程序,并将鼠标移动到 Scribble 窗口上(无需按下鼠标左鍵)

如下图所示,调试器应当在 OnMouseMove 方法设置断点的第一行处中断黄色箭头显示当前行。

您也可以按下 SHIFT+F9 执行该命令

您也可以按下 F10 执行该命令。

由于已经动态地更改了变量的值因此您已经更改了行为,这样现在调用绘图代码而不是将其忽略。

您也可以按下 ALT+F9 执行该命令

現在,在您返回到仿真程序屏幕时移动鼠标将导致绘制手写输入,就像按下鼠标按钮一样

单击 File | Exit 退出应用程序并终止调试。

该操作完成苐四部分和本文的主要活动如果还有时间,可以转到第五部分

第五部分:添加代码保存和打开手写输入文档

应用程序中仍然有未使用嘚菜单命令。在本部分中您将完成应用程序,从而使它支持 File | Save AsFile | NewFile | Open 命令

在本部分的练习中,您将执行以下步骤:

修改保存和打开的文件類型

首先您需要修改保存和打开模板,以识别与 scribble 数据相关的文件扩展名

要修改保存和打开的文件类型

该列表包含当前项目中的七种类別的资源。

单击 String Table 旁边的加号 (+)展开项目中的字符串表列表,如下图所示

按下 ENTER 关闭对话框。

MFC 提供了一种可靠的结构体系来简化应用程序编寫在编写保存和打开例程时可以查看该好处的详细示例。在此情况下您只需修改文档类的一个方法(Serialize 方法)。大多数 MFC 基元都支持 Serialize 并使該任务更简单

在文档中向下滚动定位到 Serialize 方法。

现在您就可以再次测试应用程序以确保所有功能正确无误。

如果下载到仿真程序失败進行检查以确保您现在没有运行早期版本的 Scribble.exe。

如果应用程序仍然在运行单击 File | Exit 退出。

运行新版本之后您应当能够在屏幕上绘制手写输入,然后单击 File | Save As 打开显示保存选项的对话框保存文件后,您可以单击 File | New 清除内容然后单击 File | Open 打开以前保存的绘图。

记住完成测试后退出应用程序

以下是本文所提供练习的小结:

向应用程序中添加了鼠标捕获和手写输入绘图

修改了应用程序以存储和重绘手写输入

添加了保存和打開手写输入文档的代码

我要回帖

更多关于 c++图形界面编程 的文章

 

随机推荐