VC应用程序范文(精选12篇)
VC应用程序 第1篇
本文不期望深入剖析Windows编程的详细内部机制,套用句老话:VC这个东西很深,由于作者VC编程年龄较轻,所以这不是作者现在的能力所能企及的。本文着重讨论如何使用纯代码编程构建程序框架。从而理解利用Wizard时,系统为我们创建的几个类之间的关系。另外,对于文档/视图架构给出纯代码上的实现从而推出其基本原理。由于重点在于架构设计,故不详细讨论程序中涉及到的函数的用法,要求读者有一定的VC编程经验。
1构成VC++应用程序框架的类及其作用
对于任何一个程序,都需要有一个main函数,这是程序执行的入口。对于VC而言,由于库的封装作用,除非刻意而为之,否则很难再见到这个main函数。对于早期的Windows编程,这个入口是一个名为WinMain的函数。相当于简单C中的main函数入口。我们不讨论VC中这个WinMain被藏到哪儿去了,我们只需要了解,需要有一个类包含这个函数。而这个类在VC中就被称为应用程序类。一般实现为CWinApp类的子类。无论是由Wizard产生的代码,还是本文所要讨论的纯代码实现方式,在相关CPP文件的开头,类似如下的语句是不可缺少的:
CMyApp myApp;
这儿CMyApp类是CWinApp的子类。也即被称为应用程序类的东西。这个语句的作用是在加载程序时,首先在内存中定义一个这个类的实例,所以这必须是个全局的变量。
对于用户界面编程,只有应用程序类远不能解决问题。我们需要有一个框架类。对JAVA比较熟的程序员,可以将这个框架类与JFrame类相对应。在VC中这个框架类实现为CWnd类的子类。在Wizard生成的代码结构中,我们会看到一个CFrameWnd类的子类,其名称中带有Frame字样,这就是由Wizard生成的主框架类。对于程序编写而言,我们一般将我们自定义的主框架类实现为CFrameWnd的子类。从Windows提供的类结构层次来看,CFrameWnd继承自CWnd类。实现为CFrameWnd类的子类,是由于CFrameWnd已经为我们实现了很多的功能。其中最重要且关键的一个地方,我们不需要明确的使用删除语句在程序结束中删除CFrameWnd子类的实例。这个实例从程序中看,是通过new操作符创建的。所以需要在程序结束时,应该使用delete语句明确删除该实例。CFrameWnd在响应WM_NCDESTROY消息时(这是程序结束时接收到最后一个消息),通过在PostNcDestroy函数中增加delete this语句实现这个删除目的。PostNcDestroy是一个虚函数,这个虚函数被WM_NCDESTROY消息的回调函数OnNcDestroy调用。
本文主框架窗口类即继承自CFrameWnd类,但对于本文实现的CChildView视图类则直接继承自CWnd类。这儿的CChildView类对应于Wizard生成的CChildView类。对于一个VC程序而言,如果需要对窗口客户区进行较为精细的控制比如画图,则必须要实现一个诸如CChildView的视图类。原因很简单,对于主框架类(即继承自CWnd类的子类,无论是直接还是间接),其工具条和状态栏均属于该框架的客户区,如此一来,每次画图时,因为画图原点被定义类客户区的左上角,而这个点现在却在工具条上。换句话说,要使图形显示在界面上真正的客户区上,需要在Y值上加上工具条的高度,另外如果有状态栏的话,还需要注意不要画到状态栏上,这需要在客户区Y值上减上一个状态栏的高度。对于程序而言,每次进行这样的加减,较为繁琐。故通过另外创建一个称为视图的界面区域来解决这个问题。视图类其实也是一个CWnd类的子类,或者我们称之为框架类,或根据其实现作用的标准称法:视图类。这个类所负责的区域是主框架类原客户区除去工具条和状态栏之后的区域,这个区域实现为完全的画图区域。而且这个视图类即将其原点设置为真正可用的“客户区(即主框架类除去工具条及状态栏的区域)“的左上角。也即视图类的原点Y值是真正客户区(主框架类之客户区)的原点向下移动一个工具条的高度距离。如图1示之间的关系。
了解了这一层关系,我们对于主框架类与视图类之间的关系应该有一点清楚了。从类的继承关系上来看,二者都直接或间接的继承自CWnd类。虽然被称为视图类,但并不是撇开框架类另搞一套类继承关系。虽然对于Wizard生成的代码中CChildView类是继承自CView类,不过从类之层次来看,CView类的直接父类是CWnd类。使用CView类这样一个中间类的作用是系统为我们完成了很多必要的辅助工作如内容大于界面显示视口时,自动增加滚动条以及响应滚动条的相关事件。虽然这种简化大多数时候可以减轻我们的工作。不过凡事都有例外,有时我们不可不直接控制滚动条或者响应滚动条事件以实现某些优化。
至此为此,我们讨论到了三个类:应用程序类,实现为CWinApp的子类;主框架类,实现为CWnd的子类;视图类,实现为CWnd类的子类。一个VC应用程序的架构需要这三个类来支撑,即如果使用纯代码实现方式,则我们需要相应的实现这三个类的定义。那么下面的问题是如何组织它们之间的联系?
联系如下:
(1)应用程序类的实例是全局的,该实例由系统维护。即定义一个应用程序类的全局变量。
(2)应用程序类维护一个对主框架类的实例变量。并在InitInstance虚函数中初始化这个变量。
注意应用程序类与主框架类之间的关系只是维护与被维护关系。应用程序类并不将主框架加入到其当中。即应用程序类表示的是该程序本身,它是程序运行时的入口。而主窗口则是主框架类负责。从这一点上来看,应用程序类一般只与主框架类有联系,跟其他类诸如视图类,文档类没有什么联系。而由于程序主窗口是主框架类的实例负责,故可以想见,其它的类一般都是加进这个主框架中,如主框架类与视图类的关系就是如此。
(3)主框架类中维护一个视图类的变量。但不同于应用程序类维护主框架类实例变量的行为。此处的维护更多的是一种内嵌,即视图嵌入主框架中。从上面给出图1中我们可以直观的看到这种“嵌入”关系。
2纯代码构建VC++程序框架示例
根据以上的思想,我们给出相关的代码实现。由于纯代码方式,我们只使用一个头文件和一个CPP文件。而不是对每个类都有一个头文件和一个CPP文件。
由于视图类在功能上就是一个完全可使用的客户区。故为实现这种关系,对于主框架类而言,必须重新实现OnSetFocus,OnCmdMsg函数。基本思想是:当主框架获得焦点时,其将焦点给予视图,这是OnSetFocus函数的实现目的;当接收到一个消息时,首先查看视图类中是否实现了相应消息的响应回调函数,如有,则该消息由视图类负责,否则消息才由主框架类本身负责,这是OnCmdMsg函数的实现目的。注意:由Wizard实现的代码自动完成了这个功能。
此头文件中,CMainWindow类中褐色部分消息回调函数的声明是为响应菜单消息的。还有在CChildView类和CMainWindow类都有一个OnLButtonDown回调函数,这个函数在鼠标左键按下时被回调。我们可以从下文程序运行效果上看到,如果CChildView类中定义了相关回调函数,则对应的CMainWindow类中回调函数则不会被使用。CMyApp类中只声明了一个InitInstance函数,我们将在该函数中创建主框架类,即程序的主窗口。不过这儿好象有一个问题,即CMyApp类中没有定义CMainWindow主框架类的实例变量。问题的解决在于父类CWinApp中已经定义了一个m_pMainWnd变量,对于子类CMyApp而言,直接初始化这个变量使其指向一个CMainWindow类的实例即可。如下为InitInstance函数的实现。
这个类的实现中大多数消息回调函数被置为空实现。这些函数如何相应取决于具体的程序。但程序结构组织上的代码都已完全实现,这包含创建CChildView类的实例并将其嵌入到主框架中。这在OnCreate函数中实现。注意将视图类嵌入到主框架类的方式。蓝色部分代码中this指针表示m_wndView对象的父对象,这是问题的关键。OnSetFocus,OnCmdMsg各自实现为需要完成的功能,这在上文中已有讨论。还剩下的两个主要函数实现即CreateMenu函数和本类的构造函数。CreateMenu函数创建程序的菜单,函数中的代码较为简单,不做论述,我们要知道菜单创建是完全可以使用纯代码实现的,不需要使用VC Studio提供的那些在界面上拖拖拉拉的东西。而构造函数则是完成框架的创建。在给出CChildView的PreCreateWindow代码后,我们可以看到对于框架类的创建都要调用一个AfxRegisterWndClass的函数,如果对于早期的Windows代码有接触的程序员,会了解到对于程序框架的创建使用一个WNDCLS类型的变量,我们初始化这个变量,然后调用RegisterClass将这个变量作为参数传入以注册该类。这儿所作的工作类似,即向系统注册本框架类。
这个类刻意的设计为较为简单,关键代码在PreCreateWindow函数中,同主框架类CMainWindow构造函数实现的功能一样,这个函数向系统注册一个视图类对象。
图2为程序运行时界面:
3纯代码实现需注意问题
这个界面说明了几个问题:
(1)“Hello,World!”字符串是在视图类OnPaint函数中画出的。相应语句如下:
CPaintDC dc(this);
dc.SetTextColor(RGB(0,0,255));
dc.TextOut(0,0,"Hello,World!");
注意:显示为蓝色,结果符合。TextOut函数指定的x,y坐标为0,0。这说明了视图类的原点为真正可用客户区的左上角,这与前文中一再说明的相符。虽然没有工具条在这儿证明,但本质一样。
(2)弹出窗口中的文本显示表明这是CChildView中相应回调函数的执行结果。这也与前文中说明的相符。这种效果的出现是CMainWindow类中OnCmdMsg函数的功劳。Wizard生成的代码已完成了这个工作,但对于自己编写代码,需要自己实现这个功能。
(3)菜单显示正常。即纯代码实现菜单也很简单,且完全在程序员控制之下。另外ID声明的添加是手工的,虽然费点事,但由此我们能更清楚其中的机理。另外还有相关的ON_COMMAND, ON_UPDATE_COMMAND_UI宏的添加也是手工的。
至此,整个程序的架构创建完成。然后即添加程序要实现的功能。这无非包含菜单项的增加,工具条,状态栏的添加,以及视图类中OnPaint函数的具体实现等。这与通过App Wizard生成框架代码后的工作相同。
4.深入讨论
文档类在Wizard中被用成与CView类(或子类)相互协同工作的一个类。该类一般保存程序数据。此处我们也可以定义一个文档类,专门保存程序的数据,然后在CChildView类中维护一个对这个类的实例变量。这样每次画图时,根据这个引用得到数据。这不就是所谓的文档/视图的基本含义吗?只不过Windows系统自带的库将这种交互或者说它们之间的关系定义的更为专业化一点而已,它专门使用CDocument类来定义文档。
了解了这一层,我们在编程中,也无须动不动就文档/视图组合。我们完全可以将程序数据放入CChildView类中,或者我们可以自定义一个类专门保存程序的数据。也就是说,拒绝使用CDocument文档类。对于老手来说,使用哪种方式都没有差别,对于新手来说,文档类反而使问题复杂化。因为这样一来,涉及到的类多了,直接的各种交互关系变得复杂,完全没有必要。就个人而言,对于程序的全局变量或者数据,我更喜欢自定义一个头文件专门声明这些变量和对数据部分的引用,这样如果想要使用相关参量,只要包含这个头文件即可。虽然不“专业”,但对于个人而言,更好控制和把握。这样对于自己的程序也比较有信心。
在CMainWindow类的OnCreate函数中对于m_wndView的初始化使用了如下语句:
if(!m_wndView.Create(NULL,NULL,AFX_WS_DEFAULT_VIEW,CRect(0,0,0,0),this,AFX_IDW_PANE_FIRST,NULL))
return -1;
由于m_wndView是CChildView的实例变量,而CChildView继承自CWnd。从Create函数的定义来看,我们可以改几个参数,使得m_wndView作为主框架中的一部分存在,而不是完全占据主框架的可用客户区。
Create函数的原始声明如下:
Create(LPCSTR lpszClassName, LPCSTR lpszWindowName, DWORD dwStyle, const Rect &rect, CWnd *pParentWnd, UINT nID, CCreateContext *pContext);
其中各个参数的含义从其名称即可得知。
对照这个声明,在看我们上面的实际参数,第一,二个参数初始化为NULL。
我们现在改变第三个样式参数:dwStyle,令其为WS_CHILD|WS_VISIBLE.
再改变第四个rect参数为CRect(0,0,100,200);
然后该匾第六个参数为ID_CHILD_VIEW;
即所有改变后m_wndView的初始化语句如下:
if(!m_wndView.Create(NULL,NULL, WS_CHILD|WS_VISIBLE,CRect(0,0,100,200),this,ID_CHILD_VIEW,NULL))
return -1;
为配合使用,需要在mousecap.h头文件中加上如下的语句:
#define ID_CHILD_VIEW 100
为显示效果,将CMainWindow构造函数调用的AfxRegisterWndClass函数参数的COLOR_WINDOW改为COLOR_3DFACE.
重新编译,运行,界面如下:
可以看出,我们可以像这样向主框架中加入其他控件。
对于手工编程放置控件,不像VC提供的那种在界面上拖拖拉拉就可以创建一个定制界面那样方便。手工编程时,需要仔细计算各个控件的位置及其之间的距离,考虑界面布局等问题。但可以由程序员完全控制。
总之,使用纯代码完全可以实现一个功能齐全的VC程序。
5 结束语
本文着重讲述摒弃App Wizard,通过纯代码构建VC程序架构。不对相关细节作讨论,故对于某些函数的使用方法(如AfxRegisterWndClass)没有说明。主要从结构上完成程序的组织。要求读者有一定的VC编程背景并且对App Wizard报有一定的“反感”。本文的目的在于推崇纯代码构建软件,特别是对编程新手而言。如此,可以更清楚地了解底层机制,可以完全通过自己的代码也可以完成VC++程序的设计编写,而不是离开了App Wizard就束手无策。
参考文献
[1] David Kruglinski, Scot Wingo, George Shepherd.Programming Visual C++. Fifth Edition, Microsoft Press, 1998
Vc++程序设计课程教学大纲 第2篇
总学时:54
学分:3 理论学时:34
实验学时:20 面向专业:计算机科学与技术课程代码:2710015 先开课程:数据结构、C语言、面向对象程序设计课程性质:选修 执笔人:张磊审定人:陈龙猛、于仁师 第一部分:理论教学部分
一、说明
1、课程的性质、地位和任务
《VC++程序设计》最重要的任务是发展学生的智力,即编程、上机调试能力,具体到教学内容上则是重在使学生掌握理论教学中的重点和难点,对VC++语言的编程技巧能熟练掌握,提高自身的编程能力,加强素质教育。注重从事理论研究、实验工作的能力和严谨的科学作风的培养,提倡创新精神。
2、课程教学和教改基本要求
本课程主要讲解Visual C++6.0的语法结构、体系结构、各种组件,以及微软在Visual C++6.0中推出的各种新技术。通过本课程的学习,使学生熟悉采用面向对象编程语言进行Windows 可视化开发,掌握面向对象的编程思想,熟悉面向对象编程的消息响应。
本课程主要采用多媒体教室讲课,讲课与上机实验相结合,并辅以实际应用案例、常见问题分析等,巩固所学内容,基本要求如下:(1)掌握面向对象程序设计的基本概念(2)熟悉Visual C++集成开发环境
(3)掌握Visual C++语言的基本内容、常用的算法
(4)理解WINDOWS的消息机制和WINDOWS应用程序的基本结构
(5)掌握MFC的基本概念,窗口、资源、图形设备接口、文档/视图结构、对话框和控件等对象的程序设计方法
(6)可用Visual C++开发基本的WINDOWS应用程序
二、教学内容与课时分配
第一章
Visual c++概述(学时数:1)
本章将重点介绍Visual c++的总体功能和特点,具体讲述Visual c++6.0版的安装过程,并详细介绍。教学内容:
1、Visual c++开发环境、Visual c++向导、Visual c++应用程序环境。
2、Visual c++安装过程。
3、Visual c++菜单栏、Visual c++工具栏、Visual c++工作区、Visual c++资源编辑器。本章重点难点:Visual c++6.0版开发环境的熟悉
建议教学方法:先讲解主要知识点,再通过多媒体演示达到教学效果。思考题
1、Visual c++的安装有什么要求?
2、Visual c++的帮助文件如何安装?
3、简单描述Visual c++开发环境?
第二章使用Visual c++创建控制台程序(学时数:2)
本章主要通过一个具体实例——“Hello World”程序,演示Visual c++开发环境下建立一个控制台程序的完整过程。教学内容:
1、创建“Hello world”程序的基本步骤。
2、创建控制台程序的输入、输出。
3、熟悉控制台程序句柄与I/O。
4、解析控制台程序窗口。
本章重点难点:Visual c++6.0版开发环境的熟悉
建议教学方法:先讲解主要知识点,再通过实例讲解进行巩固 思考题
1、如何控制自定义控制台程序的输入、输出?
2、如何读取控制台程序中的文字与背景?
3、如何在控制台窗口的指定部位写入指定的字符信息? 第三章使用Visual c++创建windows应用程序(学时数:2)
本章将传统Windows应用程序和以MFC为基础的Windows应用程序作比较,并详细介绍应用程序向导的使用方法和Visual c++的消息系统及其消息映射机制。教学内容:
1、简介传统windows程序。
2、概述Visual c++中windows程序。
3、介绍如何使用向导生成应用程序。
4、介绍如何使用Visual c++中的消息与命令。
本章重点难点:如何使用向导生成应用程序、如何使用Visual c++中的消息与命令。建议教学方法:知识点的详细讲解,结合例子。思考题
1、使用Windows API编程与使用MFC编程有什么区别?
2、用户如何定义消息?
3、简述MFC消息映射的机制?
第四章
windows可执行程序的基本类型(学时数:2)
本章主要介绍Visual c++的三种应用程序类型:对话框应用程序、单文档应用程序和多文档应用程序。详细阐述Windows系统对话框的类型及其在Visual c++的制作方法。教学内容:
1、对话框应用程序的制作。
2、文档应用程序的制作。
本章重点难点:多文档应用程序的制作
建议教学方法:知识点讲解,多媒体实例演示。思考题
1、Windows程序有几种类型?
2、如何创建和使用非模式对话框?
3、文档、视图与文档模板的关系是什么? 第五章
windows标准控件的使用(学时数:3)本章主要介绍Windows中的几种常用控件表头控件、图像列表控件、列表控件、树控件、标签控件、进度条控件等及其在Visual c++的实现方法 教学内容:
1、如何使用表头控件。
2、如何使用图像列表控件。
3、如何使用列表控件。
4、如何使用树控件。
5、如何使用标签控件。
6、如何使用进度条控件。
7、如何使用滑动条控件。
8、如何使用状态条控件。
本章重点难点:各个控件的具体使用方法和用途 建议教学方法:知识点讲解,多媒体实例演示。思考题
1、如何绘制ListCtrl和TreeCtrl中Item的背景颜色?
2、如何在对话框中使用控件与在普通的窗口中使用控件有什么不同?
3、应用控件表头控件、图像列表控件、列表控件、树控件、标签控件等创建一个简单的应用程序?
第六章使用Visual c++编写多媒体程序(学时数: 4)本章主要介绍如何在Visual c++中实现图像、声音、视频等多媒体应用程序的制作。教学内容:
1、介绍几种多媒体数据格式
2、位图操作方法
3、多媒体控制实现方法。
4、简介DirectX编程
本章重点难点:多媒体数据格式、多媒体控制实现方法 建议教学方法:知识点的重点讲解,多媒体实例演示。思考题
1、如何在对话框中显示位图?
2、编写一段程序,实现播放MIDI的功能?
3、DirectDraw与GDI编程有什么区别?
第七章使用Visual c++编写数据库程序(学时数: 4)本章主要介绍Visual c++中三种主要的访问数据库的方法:使用ODBC访问数据库、使用DAO访问数据库、使用ADO访问数据库。教学内容:
1、如何使用ODBC访问数据库。
2、如何使用DAO访问数据库。
3、如何使用ADO访问数据库。
4、说明ODBC与DAO的常用类
本章重点难点:使用ODBC、ADO访问数据库 建议教学方法:知识点的重点讲解,同类的对比 思考题
1、如何配置ODBC数据源,使用MFC如何配置数据源?
2、使用DAO可以打开SQL Server数据库吗?
3、试使用DAO实现如下功能:创建数据库、创建表、然后实现数据库程序的增、删、改、查的功能?
第八章使用Visual c++编写网络应用程序(学时数:4)本章主要介绍如何使用Visual c++编写对网络进行操作的程序。教学内容:
1、Winsock编程技术简介、示例演示。
2、WinInet编程技术简介、示例演示。本章重点难点:WinInet编程技术
建议教学方法:知识点讲解,实例演示相结合。思考题
1、如何编写程序实现“ping”的功能?
2、试使用CAsyncSocket类和派生CSocket类,编写不同主机的通讯程序?
3、试使用MFC编写FTP程序,并能够实现断点续传功能? 第九章使用Visual c++编写动态链接库程序(学时数:4)本章重点讲解如何使用Visual c++编写动态链接库程序。教学内容:
1、动态链接库类型和生成。
2、如何使用动态链接库。
本章重点难点:动态链接库的生成、如何使用动态链接库。建议教学方法:知识点讲解。思考题
1、创建导出函数的方法有几种?
2、.LIB文件和.DLL文件有什么联系?功能是什么?
3、DLL的调用方式有几种,有什么区别?
第十章使用Visual c++编写多线程程序
(学时数:3)本章主要介绍两种建立线程的方法:线程间通讯和线程同步。教学内容:
1、如何编写多线程程序。
2、如何实现线程通讯。
3、如何实现线程同步。
本章重点难点:编写多线程程序。
建议教学方法:知识点的讲解与多媒体演示教学结合 思考题
如何定义线程的优先级?
如何知道一个线程的运行情况? 如何实现线程同步?
第十一章
COM编程简介
(学时数:3)本章简单介绍COM编程的基本概念和方法。教学内容:
1、介绍COM的基本概念。
2、概述COM编程。
3、创建COM程序
本章重点难点:介绍如何创建COM程序。思考题
1、COM与ActiveX有什么区别与联系?
2、COM组建最基本的接口是什么?
3、简述COM对象的生成与销毁过程
第十二章
Visual c++的调试技术
(学时数:2)本章将简单介绍Visual c++的调试技术。教学内容:
1、讲解Visual c++的基本调试技巧。
2、介绍TRACE和ASSERT的使用。
本章重点难点:Visual c++的基本调试技巧。建议教学方法:多媒体演示教学 思考题
1、编写一个简单程序,使用调试器在汇编级别跟踪它的运行情况?
2、断言的使用有什么优点?有几种断言宏?
3、如何观察程序是否有资源泄漏?
三、本课程考核方式、方法
本课程理论部分采用笔试方式,共100分:闭卷考试,占60%;上机实验占20%;平日作业占10%,出勤占10%。第二部分:实验教学部分
一、说明
1、本门课程实验的性质任务、目的与要求
实验是本课程教学的一个非常重要的环节,采取上机的形式进行。本实验课程的教学目标是使学生通过20课时的上机实验,认识并学会VC++集成环境的基本使用,掌握计算机程序的编辑,编译、调试和运行的一系列操作步骤和方法,理解并消化课堂中学到的理论知识,锻炼分析解决问题的能力。初步掌握计算机编程及调试技术,为今后计算机应用在本专业领域打下良好的基础。
基本要求:熟悉Visual C++的集成开发环境、掌握编程步骤、Visual C++语言基础,能用该开发工具设计,编写简单、实用的应用程序。
2、本门课程实验项目设置情况 序号
实验名称
学时
必开
选开
实验类型
内容提要
验 证
基本 操作
综 合设 计
应 用
创 新
VC++语言使用 环境 √
√
VC集成环境及应用程序创建初步
Visual C++简单程序初步设计
√
√
建立简单的Visual C++应用程序
Windows标准控件的使用 √
√
熟悉Windows中的几种常用控件及其在Visual c++中的实现
编写多媒体程序 √
√
熟悉在Vc++中实现图像、声音、视频等多媒体应用程序的制作
Visual c++中访问数据库的主要方法 √
√
熟悉VC++中三种主要访问数据库的方法并学会创建
网络应用程序的编写 √
√
学会使用Vc++编写对网络进行操作的程序
动态链接库程序的编写 √
√
学会使用Vc++编写动态链接库程序
Visual c++的调试
√
√
熟悉并掌握Visual c++的基本调试技巧
二、各实验项目教学要求。
1.实验目的:学习操作使用,理解消化理论知识,理论联系实际,掌握可视化面向对象程序的设计、编辑、调试、运行等基本技能,强化程序设计思想,培养分析问题解决问题的能力。2.所需仪器设备及材料:Pentium以上微机,Windows98以上操作系统,安装Visual C++ 6.0.3.实验步骤:
开机启动编辑运行环境; 建立工程; 程序设计; 存盘调试运行;
重复步骤(3)-(5); 关闭系统。
4.问题讨论,编写实验报告等; 5.各项实验内容
VC++语言使用环境:熟悉Visual C++及其开发环境;初步了解运行一个C++及Visual C++程序的过程。
Visual C++简单程序初步:进一步熟悉Visual C++语言环境;明确Visual C++语言程序的结构,掌握Visual C++语言程序的书写格式。
Windows标准控件的使用:掌握Windows中的几种常用控件表头控件、图像列表控件、列表控件、树控件、标签控件、进度条控件等及其在Visual c++的实现方法。
编写多媒体程序:了解多媒体数据格式,掌握实现图像、声音、视频等多媒体应用程序的制作的方法。
Visual c++中访问数据库的主要方法:掌握Visual c++中三种主要的访问数据库的方法:使用ODBC访问数据库、使用DAO访问数据库、使用ADO访问数据库的方法。
网络应用程序的编写:掌握如何使用Visual c++编写对网络进行操作的程序的方法。动态链接库程序的编写:了解并掌握动态链接库的生成、如何使用动态链接库。Visual c++的调试:了解并掌握使用Visual c++的基本调试技巧。
三、考核方式和成绩评定要求等。
VC应用程序 第3篇
31重视上机实践及习题
做习题是对所学内容进行复习的重要过程,还是深入学习的必要过程。每次课程讲授之后,教师均应当将有着较强代表性的一些习题布置给学生,以此对课堂上所学习到的内容加以巩固。还可以借助于学生作业的具体情况来了解学生掌握课程内容的程度。对于作业中普遍出现的错误,则需要教师当堂讲解,以便于让学生掌握牢靠、理解透彻。与此同时,学生作业中所出现的新颖新奇的程序设计思路及方法,也需要做好作业批注,并且当堂宣讲,鼓励学生勇于迸发出创新的火花。
32激发学习兴趣
为了能够使学生较快及较好的掌握相关方面的计算机知识,真正的融入计算机领域,教师应当尤其重视学生学习兴趣的调动及培养。在接触计算机的最初阶段,相当一部分学生仅仅是感到好玩、新奇,但并非是对此有兴趣,而逐渐地随着课程的持续深入,大量的要求、定义、规则、概念以及机械化格式的出现,非常容易使得学生有乏味枯燥的感觉產生。为了能够将学生的好奇向学习兴趣转化,那么在课程讲解中要注意着手于具体问题,使学生从感性上对新知识加以认识,然后再对理论要点进行讲授。比如,在首次课上,教师可以找已学的一些《线性代数》、《高等数学》等课程的问题,要求学生采取算法语言来予以求解,以这样的方式使学生对程序设计的用途加以切身体会,最重要的是掌握全新的一种问题的解决方法。在课程讲授的过程中,教师还要积极的引导学生学习一类算法,并且在同行课程中尝试应用。另外,教师还可以向学生经常性的介绍趣味性的一些算例,比如“迷宫问题”等,以此将学生的学习兴趣培养起来,促使学生主动积极的学习与获取知识,从而将程序设计基础打好。
大地测量模块的VC++程序实现 第4篇
1 设计框架
在程序设计的过程中,整个框架分为参数设置、测量菜单两个部分。参数设置为整个模块的基础,要进行后续的坐标转换工作,首先要采集与本地坐标系统有关的定位信息。在得到本地区的有关参数之后,需要考虑地方的椭球元素、投影方式、坐标系之间的变换等要素。在确定目标椭球的过程中,可以根据参考文献[1]中提出的确定E3椭球的方法来定义一个适合本地区的E3椭球。利用在单个参考点上WGS-84椭球面与投影面之间的垂向距离,根据式(1)即可求得E3椭球的长半径a3和偏心率e
1.1 椭球元素
有关大地测量模块的软件中,参考椭球的定义是不可缺少的,参考文献[3]中指出,椭球的形状和大小是由子午圈的五个基本参数决定的,分别为椭圆的长半轴a、短半轴b、扁率α、第一偏心率e和第二偏心率e′来决定。但实际上如果需要确定一个椭球,只需要上述五参数中任意两个就可以了。在程序设计过程中,采用了WGS-84等11种不同的参考椭球;同时支持用户自定义椭球的输入,可以输入计算得到的E3椭球元素。
1.2 投影方式
程序设计时将几种常用的投影方式均列在参数设置中,常用的几种投影方式有墨卡托投影(Mercator)、横轴墨卡托投影(Transverse-Mercator)、斜轴墨卡托投影(Oblique-Mercator)、兰勃特等角切圆锥投影(Lambert Conic Conformal-2SP),其中考虑到在通用横轴墨卡托投影对应的投影公式中,若把中央子午线长度比由1转换为0.999 6,即可成为高斯投影[1]。
1.3 七参数转换
进行两个空间坐标系之间的转换,常用的转换模型有布尔莎模型、莫洛金斯基模型以及范士模型,具体模型转换及公式推导可见参考文献[1],这三种转换模型有不同的前提条件,故七参数的数值是不同的,但坐标转换的最终结果却是一样的,因此在程序设计时只采用布尔莎模型求出相应参数,进行不同三维坐标系之间的转换。
2 利用VC++实现功能框架的部分函数
2.1 对Microsoft VC++6.0自带的CEdit类重载
由于在使用的过程中会涉及到很多角度问题,并且普通角度与经纬度的表示形式不同:例如界面上纬度的显示方式为“00-00-00.000 0N”,用通常的CEdit类来定义一个控件的时候,用户不仅仅需要输入度分秒等数字键,同时也要输入“-”“.”等字符。为了方便输入,在程序设计时,主要针对CEdit类的OnChar和OnKeyDown函数进行,对不同位置数字键以及W/E/N/S键按下时和“BackSpace”“Delete”按下时进行判断并重载。重载之后用户就只需在键盘上依照度分秒的次序按数字键,固定的数据就自动填充到默认的角度格式中,这样就极大方便了用户的输入。
2.2 四种投影的正反算函数
通用的正反算分别用如下方式定义:
void Projection—pros(double L,double B,double L0,double B0,double B1,double B2,double FE,double FN,CEllipse *elli,double k,int i,double * x,double * y,double *scale);
void Projection—cons(double x,double y,double L0,double B0,double B1,double B2,double FE,double FN,CEllipse *elli,double k,int i,double *B,double *L,double *scale)。
2.3 单点确定E3椭球元素
void GetE3element(double X,double Y,double Z,double h,double * a3,double *e2)。
3不同投影数据验证
从表1中可以看出,该模块经过投影之后得到的平面坐标与其他软件(hypack软件)投影坐标具有相同的数值,因此在各种投影方式的计算上,本模块的功能是完全可以实现的。
4结语
文中主要介绍了利用VC++6.0定义相应大地测量模块的函数,并详细列举了以实际数据对投影方式和七参数求解的验证,计算结果可以满足用户的需求。
摘要:主要介绍了利用VC++ 6.0对相关大地测量模块的设计,并对模块的功能进行了数据验证,验证结果表明设计的大地测量模块完全可以满足用户的需求,并给出了部分代码。
关键词:坐标转换,七参数,投影,VC++,E3椭球
参考文献
[1]施一民.现代大地控制测量[M].北京:测绘出版社,2003.
[2]朱卫东.建筑施工过程中的测量控制要点[J].山西建筑,2008,34(8):351-352.
VC应用程序 第5篇
1、启动VS2008(我的默认环境是VC),单击“File”->“New”->“Project”
出现如下对话框:
接下来按照图示来,我就不文字叙述了,
2、点击“Finish”后,在右击“Source Files”->“Add”->“New Item”:
出现如下对话框:
如果是C程序,就添加后缀“.c”,单击“Add”就可以写程序代码了(对于头文件和资源文件的添加是一样的,这里就不多说了),
3、我用的测试代码如下:
4、单击“Debug”->“Start Without Debugging”:
出现如下对话框:
单击“Yes”,运行结果为:
徐新:再创VC 第6篇
本月劲爆:
2004年12月31日,是徐新在霸菱亚洲投资基金董事总经理和中国区总裁任职的最后一天。
2005年,对于这位被美国《商业周刊》评为亚洲25位最具有影响力的VC之一的“铁娘子”有了一个新的计划:自己寻找合伙人组建一个新的风险投资公司,然后准备从LP的手中募集到两亿美元的资金,关于这部分资金的使用,她现在已经有了一个明确的投资方向,就是投资中国内地的制造业,消费领域等。
徐新对自己运作资金的能力显得非常自信;快速的语速,让人无法质疑的论点,都成为她屡屡说服别人的必杀武器,但是她和其他的VC一样,更注重实际的投资回报而不是“看谁更能讲故事”。
在霸菱vc徐新工作了近7年,并一直负责该基金在中国的投资业务:先后在中国内地投资9家公司,现在已经有5家公司实现退出,并取得以6800万美元的投入获得1.21亿美元的收益成绩,随后的几家被投公司目前也发展得不错。
但是,这些成功的案例并没有让徐新满足。她期待着在2005年自己主导运作的风险投资基金中再次刷新投资回报的纪录。
贾志强另类VC
让所有的员工都过上好日子,是第一个企业老总的期望,吉富VC在短短的半年时间就实现了这个初步的设想。从这家风险投资公司的资金构成上看,贾志强更像是财富的代言人。
本月劲爆:
贾志强带领的深圳吉富创业投资公司(简称吉富VC)也许是最近在深圳市创业投资同业公会通过审核最为特殊的VC。
2004年1月21日,吉富VC与广发证券工会签订协议,后者将所持有的8429.18万股辽宁成大股权,以6327.87万元的价格转让给前者。这笔交易为吉富VC的账面贡献的利润不菲:截至辽宁成大第三季度财务报表显示,该公司每股净资产为2.3元,吉富VC收购辽宁成大的第股价格却仅为0.75元,相当于辽宁成大每股净资产的三分之一,仅这一笔交易,就为这个成立不到半年的吉富VC带来了上亿元的收入。
天上难有掉馅饼的好事,为何惟独砸中吉富VC?
从有关资料上显示,吉富VC注册资本为2.48亿元,共有2126名自然人股东,其前三名股东分别为广发证券总裁董正青,出资800万元,广发证券董事长王志伟出资430万元,广发证券副总裁李建勇出资318.8万元,前十大股东共计持有11.3%的股份。
据广发证券有关人士介绍,深圳吉富是在整个广发系统的员工中集资发起的,包括广发证券、广发华福、广发北方、广发基金及广发期货在内的5家公司的员工,均可认购深圳吉富的股份。当初,贾志强等原广发证券老员工在2004年8月份仓促成立的这家创业投资公司的目的就是为了和中信证券争夺广发证券的控股权,如今,中信证券早已偃旗息鼓,深圳吉富却仍然在证券市场并且越战越勇。
基于VC++空间定位程序设计 第7篇
所谓工程测量的内外业一体化 (下面简称工程测量一体化) , 即在生产过程中, 摆脱数据在一列变换过程中的人工干预, 使工程测量外业数据采集、内业成果计算和管理统一在一个系统内, 并且对资料信息进行深加工, 作出科学解释与管理, 进行数字地图、数字专用图生产, 建立各种信息管理系统等。目前, 现代测量仪器已经与计算机技术融合, 这表明现代测量技术正向信息化和自动化过渡, 电子计算机技术在工程测量中的核心作用正不断推动着测量过程的变革与进步, 现代通讯技术在测量过程中的应用, 可以使工程测量野外作业、内业计算与管理以及应用项目间的时空距离趋于零, 从而实现内外业与管理过程间的双向控制, 它预示着工程测量模式的重大变革[1,2,3,4,5]。广泛应用于城市测量之中的交会定点测量技术也得到了一定的发展, 主要针对城市中放样 (放点、放线等) , 目前并为发现有专门的交会定点应用程序设计。首先简述了交会定点的计算过程, 然后给出其数据结构, 并应用VC++对其进行程序设计, 从而完成交会定点内外业一体化。
1 交会定点的基本原理
在工程测量中有各种测量方式, 其中交会定点是加密控制点常用的方法, 它可以采用在整个已知控制点上设站, 分别向待定点观测方向和距离, 也可以在待定点上设站向数个已知控制点上观测方向或距离, 然后计算待定点的坐标。常用的交会定点方法有前方交会定点、侧方交会法、后方交会法、边长交会法和自由设站法[1,6]。
1.1 测角前方交会
在图1中, 已知数据是A、B两点的坐标分别在A、B点观测α及β角, 则可求得待定点P的坐标。
求解思路是:若能求得DAP与αAP, 则可求得AP两点间的坐标增量, 由A点的坐标加上该坐标增量即可得P点的坐标:
undefined
根据上述, 经过一系列等价变换, 可得最终的求解公式:
undefined
需要注意的是, 使用上式时, A、B、P的编号应该是逆时针方向的。P点坐标算出后, 可将A、P作为已知点, 计算B点的坐标进行校核。为了提高交会点的精度, 作如下规定:
1) 前方交会和侧方交会应选择三个大地点, 如果架设仪器较为困难, 也至少应有两个大地点;
2) 交会角不应小于30°, 并不应大于150°, 困难时亦不应小于20°, 并应不大于160°。
3) 水平角应观测两个测回, 根据测点数量可用全测回法或方向观测法。
4) 三个大地点的前方交会, 可通过两个三角形求出P点的两组坐标值P (Xp1, Yp1) , (Xp2, Yp2) , 两组算得的点位较差不大于两倍的比例尺精度, 即:
undefined
式中δx, δy为δx=Xp1-Xp2, δy=Yp1-Yp2, M为比例尺分母。
在选定点时, 最好使交会角接近于90°, 而不应大于150°或小于30°。
1.2 侧方交会
如果不便在一个已知点 (例如B点) 安置仪器 (如图2所示) 。而观测了一个已知点及未知点上的两个角度, 则同样可以计算点的坐标, 这就是侧方交会。这时只要计算出B点的β角, 则可用公式求解xP和yP。侧方交会的计算公式与前方交会的计算公式相同。
1.3 后方交会
如图3所示, A、B、C是已知三角点, P点是导线点, 将仪器安置在P点上, 观测P至A、B、C各个方向之间的水平夹角α、β, 然后根据已知三角点的坐标, 可解算P点坐标。计算步骤如下:
1) 引入辅助量a、b、c、d
undefined
令N= (a-c) / (b-d)
2) P点坐标计算
undefined
3) 危险圆判别
当P点正好落在通过A、B、C三点的圆周上时, 后方交会点无法解算。
即:a=c, b=d, N= (a-c) / (b-d) =0/0。
此时为不定解。因此作业时应使P点离危险圆周的距离至少应大于该圆半径的1/5。为了进行检验, 须在P点观测第四个方向K, 测得ε测角。同时可由P点坐标以及B、K点坐标, 按坐标反算公式求得αPB及αPK。ε算=αPK-αPB, 求较差Δε=ε算-ε测。由此可计算出P点的横向位移e为:
undefined
在一般测量规范中, 规定最大横向位移ε允不大于比例尺精度的2倍, 即ε允<20.1M (mm) 。M为测图比例尺的分母。
1.4 边长交会
边长交会也是加密控制点的方法之一。特别是利用光电测距仪或全站仪测定距离时, 这种方法非常简便。已知数据为点A、B的坐标, 观测两已知点至待定点P的距离D1及D2 (如图4所示) 求待定点P的坐标。
在三角形APM中, h2+q2=D21;在三角形BPM中, h2+ (D-q) 2=D22, 后式减前式得
此处q为AP在AB边长上的投影, 由此
式中根号前的“+”或“-”号, 取决于A、P、B点是顺时针还是逆时针方向。
为了进行观测校核, 可由坐标反算公式计算, 并与观测的D2测进行比较。为了进行观测校核, 还应由第三个已知点C观测D3, 分两组计算P点坐标。如较差在允许范围内, 取平均值作为P点的最后坐标。
2 数据结构设计
2.1 前方交会数据结构设计
2.2 后方交会结构设计
2.3 边长交会结构设计
3 结论
通过上述分析后, 利用VC++面向对象程序设计语言, 对前方交会、后方交会以及边长交会进行编程, 并引入实测数据进行验证。本研究的后续工作将围绕着大量交会定点数据的处理 (文件的形式) , 并设计相应的数据库对原始数据与计算后的数据进行存储, 完善更多交会定点数据处理功能。
综上所述, 交会定点测量技术也面临着日新月异的技术变化及人们对传统工程测量观念等诸多变化的挑战。交会定点测量技术已不再是仅仅指测量、放样, 而是研究获取、解释、管理, 并获取被测物体在时间与空间上变化等信息的理论和方法, 该技术正逐渐朝着由简单到复杂、由手工向自动化、智能化、数据库信息化方向发展。
参考文献
[1]罗新宇.土木工程测量学教程[M].北京:中国铁道出版社, 2007.
[2]潘正风.工程测量技术发展现状[J].铁道勘测2, 004 (6) :1-3.
[3]王丽蕊, 王欣.交会定点测量中后方交会危险圆的判别[J].河北水利, 2006 (7) :45-46.
[4]张正禄.工程测量学的研究发展方向[J].现代测绘, 20063, (26) :3-6.
[5]杨久东, 郭建华, 吴风华.工程测量中GPS测量内外业工作的一点体会[J].地理空间信息, 20033, (1) :35-36.
VC++2008屏幕键盘程序设计 第8篇
键盘是计算机的一个重要输入设备, 很多程序都要用到键盘操作。当用户按下键盘上的某个键时, 键盘内的控制器就会检测到这个动作, 并把对应的键盘扫描码传送给计算机;键盘驱动程序把这个键盘扫描码转换为键盘虚拟码, 并把扫描码、虚拟码和其他信息一起传递给操作系统, 这些信息再被封装在一个键盘消息中插入到全局消息列队, 键盘消息被送到当前活动窗口的局部消息队列里。在基于Windows系统的便携设备中, 比如基于Windows 8.1的平板 , 是没有键 盘的, 这时候就需要屏幕键盘 (或者说虚拟键盘、触 摸键盘 )来完成键盘输入操作。可以用多种方法编程实现模拟键盘操作, 比如, 用Post Message函数伪造一个局部级的键盘消息直接投递给目标程序、用API函数keybd_event或Send Input模拟一个全局级的键盘事件、直接读写键盘硬件端口实现驱动级模拟等。
结合实例讨论全局级模拟的屏幕键盘程序设计方法。软件的开发运行环境为: VC++2008、Windows XP SP3、Windows 8.1。
2 相关函数
2.1 Keybd_event
Keybd_event能触发一个键盘事件 , 也就是说能产生一个WM_KEYDOWN或WM_KEYUP消息。Keybd_event有4个参数, 第一个参数为按键的虚拟码; 第二个参数为按键的扫描码, 一般不用设置, 用0代替就行; 第三个参数为选项标志,如果是按 下按键则 置0即可 , 如果是释 放按键则 设成“KEYEVENTF_KEYUP”; 第四个参数一般是置0即可。
2.2 Get Foreground Window
Get Foreground Window返回前台窗口的句柄 , 前台窗口是指用户当前工作的窗口, 该函数不需要输入参数。
2.3 Set Foreground Window
Set Foreground Window把指定窗 口所属的 线程推到 前台 ,并激活这个窗口, 系统的原始输入线程连接到此窗口所属的线程, 即键盘输入连接到这个窗口。系统给创建前台窗口的线程分配的权限稍高于其他线程。Set Foreground Window只有一个输入参数, 即将要设置为前台窗口的窗口句柄。
2.4 Attach Thread Input
Attach Thread Input把一个线程的输入与另一个线程的输入绑定或解除绑定。不同线程创建的窗口彼此独立地处理输入,即它们有自己的输入状态, 不与其他线程同步输入处理。利用Attach Thread Input函数, 一个线程能够将它的输入处理绑定到其他线程上, 进而可以用Set Focus函数将键盘焦点设置到其他线程的窗口上。Attach Thread Input有3个参数, 第一个参数将要绑定到其他线程的线程ID; 第二个参数是第一个参数要绑定到的线程ID; 第三个参数是BOOL类型, 为TURE时参数一 和参数二 指定的两 个线程输 入绑定在 一起 , 为FALSE时解除线程输入绑定。
2.5 Pre Translate Message
Pre Translate Message是MFC消息控制流最具特色的地方 ,是CWnd类的虚函数, 重写该函数可以实现窗口消息在派发给窗口函 数Translate Message和Dispatch Messae之前的过 滤 ,缺省的实现是完成加速键的翻译。是否调用窗口函数Trans-late Message和Dispatch Message是由Pre Translate Message函数的返回值决定的, 如果函数返回值为TRUE, 那么消息处理即终止, 不会调用Translate Messge和Dispatch Message来翻译和分发消息给相应的窗口; 若返回值为FALSE, 则会调用翻译和分发消息函数。
2.6 On Mouse Activate
On Mouse Activate是WM_MOUSEACTIVATE消息响应 函数。当用户单击一个非激活的顶级窗口, 或非激活的顶级窗口的子窗口时, 系统就会发送WM_MOUSEACTIVATE消息给顶级窗口或子窗口, 通过处理WM_MOUSEACTIVATE消息 ,可以控制是否激活窗口, 并确定该窗口是否接收后续的鼠标消息。该函数可以返回以下的值:
3 程序实现
程序结构采用MFC对话框框架, 在主对话框的客户区绘制出键盘按键, 通过鼠标点击或触摸屏触摸按键, 向前台窗口发送键 盘事件 , 实现模拟 键盘操作 。程序在 酷比魔方i-Work8平板上的运行截图如图1和图2所示。
3.1 主对话框类头文件
模拟键盘 操作的所 有功能都 放在主对 话框类Cvkey Dlg里实现, 在其头文件里定义相关的常量、变量和函数。代码如下:
3.2 主对话框类初始化函数
在主对话框类初始化函数On Init Dialog里, 定义键盘的键值, 计算键盘尺寸, 创建定时器, 置顶窗口。代码如下:
3.3 绘制键盘
在主对话框的客户区里绘制键盘。
3.3.1On Paint 绘制键盘
在On Paint消息响应函数里绘制键盘, 代码如下:
3.3.2On Timer 绘制键盘
在On Timer定时器消息响应函数里绘制键盘, 代码如下:
3.3.3 绘制键盘函数
在对话框的客户区里绘制键盘, 代码如下:
3.4 模拟键盘事件
在鼠标点击消息响应函数里, 模拟键盘事件。
3.4.1 鼠标消息响应函数
鼠标左键按下、抬起、双击, 鼠标右键按下、抬起、双击, 鼠标滚轮, 代码如下:
3.4.2 模拟键盘消息函数
模拟键盘消息, 代码如下:
3.5 消息预处理函数
在主对话框类的消息预处理函数Pre Translate Message里,获取前台窗口的句柄, 将屏幕键盘线程与前台窗口线程的输入处理绑定。代码如下:
4 结语
在上面的实例中, 讨论了屏幕键盘程序的设计方法, 并给出了详 细的C++代码 , 程序在Windows XP SP3、Windows8.1下测试通过。屏幕键盘程序可以广泛用在不带键盘的Win-dows便携设备中 , 开发者可以根据需要编写出定制的屏幕键盘软件。
摘要:结合实例,讨论屏幕键盘程序的设计方法,给出了相关的技术方法和详细的代码,程序在Windows XP SP3、Windows 8.1下测试通过。
VC应用程序 第9篇
蓝牙 (Bluetooth) 是一种支持设备短距离通信的无线电技术, 能在包括移动电话、PDA、无线耳机、笔记本电脑以及相关外设等众多设备之间进行无线信息交换。蓝牙采用分散式网络结构以及快跳频和短包技术, 支持点对点和点对多点通信, 工作在全球通用的2.4GHz ISM (即工业、 科学、医 学 )频段, 其数据速率为1Mb/s, 采用时分双工传输方案实现全双工传输, 使用IEEE802.15协议。根据发射输出电平功率不同,蓝牙传输有3种距离等级: Class1为100m左右; Class2约为10m; Class3约为2-3m。
接下来将通过开发一个程序实例, 讨论在Windows系统下, 两台PC机通过蓝牙进行文本信息收发和文件传输的通信程序设计方法。程序 的开发运 行环境为 : VS2008、WindowXP SP3、蓝牙适配器。
2 蓝牙协议栈
协议栈是指一组协议的集合, 蓝牙协议栈是SIG (SpeciaInterest Group) 定义的一组协议的规范 , 目标是允许遵循规范的蓝牙应用能够进行相互间操作。蓝牙协议栈如图1所示。
目前在Windows平台上实现的蓝牙协议栈主要如下:
( 1) Widcomm: 第一个Windows上的协议 栈 , 由Widcomm公司开发 , 也就是现在的Broadcom。
(2) Blue Soleil: 由IVT公司开发 , 可用于桌面和嵌入式系统。
(3) Microsoft Bluetooth Stack: 由微软公司开发 , 在Windows XP SP2及以上版本中内建的协议栈。
上面这些协议栈都提供了SDK开发包, 开发者可以使用开发包提供的API开发自己的蓝牙应用。但是这些协议栈之间存在兼容性问题, 开发者必须针对具体的协议栈进行开发。由于微软的蓝牙协议栈已经内建在系统中, 所以一般选择Microsoft Bluetooth Stack来进行开发。开发者可以使用微软SDK中的Microsoft Bluetooth API, 也可以使用Win Sock, 二者都能实现蓝牙设备的查找、服务的发现、配对等。由于大部分蓝牙设备都提供虚拟串口服务, 所以可以使用系统中的虚拟串口进行数据通信, 也可以使用网络编程、服务器监听或客户端连接的方式来进行数据通信。
在VS2008中包含了 开发蓝牙 应用的SDK, 但是在VS2008以前的版本中 , 如VS2005、VC++6.0等 , 没有包含蓝牙SDK, 需要安装微软提供的Platform SDK。对于VC++6.0,最后一个 受支持的Platform SDK是2003年2月版。对 于VS2005, 可以安装Windows Server 2003 R2 Platform SDK, 其完整的文件名是5.2.3790.2075.51.Platform SDK_Svr2003R2_rtmimg, 文件大小是409MB左右 , 可以将文件名后缀img直接改成iso。
3 蓝牙通信程序设计
程序使用网络编程的方式, 采用服务器/客户端模式来进行蓝牙数据通信。客户端的执行流程是:(1) 搜索本地蓝牙设备, 即扫描本机上的蓝牙设备并显示;(2) 搜索远程蓝牙设备, 即扫描本机附近的蓝牙设备并显示;(3) 创建客户端套接字;(4) 发送连接请求, 连接选定的服务器, 即远程蓝牙设备;(5) 开始通信, 传输文件或收 发文本信 息 ;(6)断开连接, 客户端向服务器发送或收到服务器发送的断开连接请求时 , 即可实现 通信的断 开。服务 器的执行 流程是 :(1) 搜索本地蓝牙设备 , 即扫描本机上的蓝牙设备 并显示 ;(2) 创建服务器套接字 ; (3) 绑定套接字到本地蓝牙设备 ;(4) 建立连接 , 使用listen函数开始监听远程设备的连接 请求, 使用accept函数接受连接并返回一个用来与客户端通信的套接字;(5) 开始通信, 传输文件或收发文本信息; (6)断开连接, 服务器向客户端发送或收到客户端发送的断开连接请求时, 即可实现通信的断开。程序的运行界面截图如图和图3所示。
程序实现了服务器和客户端的功能, 将服务器和客户端做在同一个对话框界面上, 使用时用户可以选择服务器模式或者客户端模式, 也可以同时使用服务器模式和客户端模式。程序中除了主线程之外, 还设置了5个子线程, 分别是服务器监听线程、服务器接收数据线程、服务器发 送文件线 程、客户端接收数据线程和客户端发送文件线程。采用子线程方式, 可以很好地改善主线程的人机交互体验。
需要注意的是, 由于使用的是微软 实现的蓝 牙协议栈 ,所以蓝牙适配器的驱动应该 使用Windows系统自带 的驱动 ,不能使用第三方的蓝牙驱动。
4 关键代码实现
要使用Microsoft Bluetooth API进行蓝牙开发, 首先需要包含相关的头文件和导入库, 代码如下:
还要在程序开始时, 执行一次Win Sock库的初始化, 在程序结束时, 相应执行一次Win Sock库的清理, 代码如下:
4.1搜索本地蓝牙设备
搜索本机的蓝牙设备并显示, 代码如下:
4.2搜索远程蓝牙设备
搜索本机附近的蓝牙设备并显示, 代码如下:
4.3启动本地蓝牙设备
启动本地蓝牙设备作为服务器, 响应远程客户端的连接,代码如下:
4.4连接远程蓝牙设备
本机蓝牙设备作为客户端, 连接远程服务器设备, 代码如下:
4.5服务器发送信息
在服务器模式, 发送信息给客户端, 代码如下:
4.6客户端发送信息
在客户端模式, 发送信息给服务器, 代码如下:
4.7服务器发送文件
在服务器模式, 发送文件给客户端, 采用线程方式, 代码如下:
4.8客户端发送文件
在客户端模式, 发送文件给服务器, 采用线程方式, 代码如下:
4.9服务器监听线程
监听并接受客户端的连接请求, 代码如下:
4.10服务器接收信息线程
接收客户端发来的文本信息和文件数据, 代码如下:
4.11服务器发送文件线程
发送文件数据到客户端, 代码如下:
4.12客户端接收信息线程
接收服务器发来的文本信息和文件数据, 代码如下:
4.13客户端发送文件线程
发送文件数据到服务器, 代码如下:
5结语
讨论了在Windows系统下, 使用Microsoft Bluetooth API,实现两台PC机之间通过蓝牙进行文本信息收发和文件传输的程序设计方 法 , 并用VC++2008编写程序 实例 , 在WindowsXP SP3和Win8.1下测试通过。
摘要:探讨了在Windows系统下,使用Microsoft Bluetooth API实现两台PC机之间通过蓝牙进行文本信息收发和文件传输的程序设计方法,并用VC++2008编写程序实例,在Windows XP SP3和Win8.1下测试通过。
基于VC绘画板的开发与应用 第10篇
当今绘图软件种类繁多,国外有Photoshop、Adobe Illustrator、Fireworks等软件,国内流行的有Windows自带的画图板、金山画王、我行我素等。除了Windows自带的画图板以外,这一系列软件功能强大,但是操作复杂,不易于初学者或者一些简单需求的用户使用,因此编写一款轻便小巧的简易绘图工具,可以完成一些简单的图形绘制操作,能够使得用户得心应手。
1 概述
1.1 设计要求
具体要实现简易绘画板的设计与制作,能够完成基本的点、线、面的绘制;具有喷枪和填充功能;能够绘制曲线;控制线条的颜色、粗细和类型;具有简单的操作界面和较为完善的功能设置;使用户能够绘制出比较具有审美观点和艺术价值的绘画作品。
1.2 功能介绍
(1)铅笔功能模块
模拟铅笔画图的效果,当用户点击工具栏中的铅笔按钮后,将鼠标移动到绘画区域,按下鼠标左键不放并拖动鼠标,鼠标经过的区域则留下一道铅笔的笔迹,直到松开鼠标左键为止。用户可以根据自己的需要绘制图形,使用铅笔功能模块绘制、编辑图形。
(2)绘制矩形功能模块
方便用户绘制矩形的功能模块。当用户点击工具栏中的矩形绘制按钮后,将鼠标移动到绘画区域,按下鼠标左键不放并拖动鼠标,系统能够根据用户按下鼠标左键的点的坐标位置以及拖动至松开鼠标左键的点的坐标位置,确定矩形的左上角点的坐标以及右下角点的坐标或者是左下角点的坐标和右上角点的坐标,也就是起点与终点的坐标最终确定该矩形。用户可以根据自己的需要,使用绘制矩形功能模块方便、快捷的绘制矩形。
(3)文字编辑功能模块
用户可以通过文字编辑功能模块在绘图的过程中加入汉字、字母、数字等文字信息。当用户点击工具栏中的文字编辑按钮后,将鼠标移动到绘画区域,点击鼠标左键后,光标将在点击位置闪动,然后用户敲击键盘可以将文字输入至光标所在位置直到用户停止输入。用户可以根据自己的需要,使用文字编辑功能模块添加文字,使图片的内容更加丰富多彩。
(4)绘制多边形功能模块
方便用户绘制多边形的功能模块。当用户点击工具栏中的多边形绘制功能按钮后,将鼠标移动到绘画区域,按下鼠标左键拖动到任意位置,松开鼠标左键则绘制完所绘多边形的一条边,此时系统能够自动记录用户松开鼠标左键的点的位置的坐标,随后用户可以左键点击绘画区域的任意一点,系统将自动与前次所记录的点连接起来形成多边形的下一条边,直到用户完成所需多边形的绘制。当用户未完成多边形的绘制,即所绘制的多边形没有封口,而选择其他功能模块继续绘制时,系统会根据用户选择多边形绘制功能模块后第一次按下鼠标左键的点的位置与用户在退出多边形绘制功能模块后所左键点击的最后一个点的位置相连接,从而自动完成多边形的绘制。用户可以根据自己的需要,使用绘制多边形功能模块简单、方便的完成多边形的绘制。
(5)调色板编辑功能模块
当用户需要编辑画笔、画刷、喷枪以及矩形、椭圆、多边形绘制的色彩时,则在调色板右侧,根据RGB三原色原理以及用户需要,鼠标拖动红、绿、蓝下的滑块,从而进行调色,然后执行其他功能模块即可。在使用其他绘制功能模块时将使用色板中所调的颜色。用户可以根据自己的需要,使用色板编辑功能模块对绘制工具进行调色。
1.3 系统运行环境
Windows 2000、Windows XP或者更高;
IBM-compatible PC,Pentium 200 MHz或者更高;
64 MB RAM;
24-bit(800 x 600)色彩分辨率;
编程语言:VC++。
2 绘画板的分析与设计
2.1 设计准则
为了评价该设计阶段的设计表示的“优劣程度”,必须遵循几个准则。
(1)软件设计应当表现出层次结构,它应巧妙地利用各个软件部件之间的控制关系。
(2)设计应当是模块化的,即该软件应当从逻辑上被划分成多个部件,分别实现各种特定功能和子功能。
(3)设计最终应当给出具体的模块(例如子程序或过程),这些模块就具有独立的功能特性。
(4)应当应用在软件需求分析期间得到的信息,采取循环反复的方法来获得设计。
其绘画板的设计结构图如图1所示。
2.2 界面设计
系统界面布局分为5个部分:顶部第一横向工具栏(在标题栏下方包括文件、编辑、绘图、查看、帮助、设置按钮),下方为第二横向工具栏(在第一横向工具栏下方包括线形、线宽、画刷种类下拉菜单),右端为纵向工具栏(出现在应用程序窗口最右侧,包括铅笔、毛笔、喷枪、橡皮擦、矩形、椭圆形、多边形、放大、缩小、文字编辑、喷枪一系列按钮),中部为用户绘图区域,应用程序最右端上部是色板,色板上有RGB控制滑块,包括红、绿、蓝三种,其后分别显示当前的RGB值。如图2所示。
3 绘画板的实现
简易绘画板系统按照功能模块可分为工具栏模块、铅笔模块、毛笔模块、画刷模块、绘制圆形(包括椭圆)模块、绘制矩形模块、绘制多边形模块、文字编辑模块、橡皮擦模块、图片加载模块、图片保存模块、放大模块、缩小模块、色板模块、喷枪模块。通过这些模块可以实现图片的简单绘制以及编辑,能够完成基本的点、线、面的绘制;具有喷枪和填充功能;能够绘制曲线;控制线条的颜色、粗细和类型;具有简单的操作界面和较为完善的功能设置;使用户能够绘制出比较具有审美观点和艺术价值的绘画作品。
3.1 铅笔模块设计
画笔是绘图的基本工具,在MFC中画笔是CPen类的对象,它可以在DC(设备描述环境)中完成绘制线条的任务。DC在初始化时,就自动自动配备了一个黑色的默认画笔。
首先定义画笔,即创建画笔对象,调用CPen类的构造函数,它的原型:
CPen(int style,int width,COLORREF color);
参数style用来定义画笔的样式,由系统提供;
参数width用来以像素为单位设置画笔的宽度;
参数color用来以RGB值设置画笔的颜色。
在创建了画笔以后,必须使用CDC的成员函数Select Object把画笔载入DC,以替换DC中原来配置的默认画笔,然后才能使用该画笔绘制线条。最后调用On Draw函数进行绘图。代码如下:
工具栏中的画笔按钮
}
void CPaint View::On LButton Up()松开右键消息处理函数中关于画笔的代码:
case DRAW_LINE:
p Shape=new CLine(m_pt Start Point,m_pt End Point,Set_Color,m_n Width,m_n Pen Style);
p Doc->Add Shape(p Shape);//将绘制的图形作为对象存储到对象数组中
p Doc->Update All Views(NULL);//更新所有视图
Cpen对象在MFC中占有重要地位。
3.2 绘制矩形功能模块
绘制矩形功能模块与铅笔模块流程相似,首先定义画笔并创建自己的画笔,当然如果采用默认的画笔则不用再另外定义画笔,然后将所定义的画笔载入设备描述环境中。用户点击绘制矩形功能按钮系统将调用On Rectangle函数。当用户在绘图区域绘制矩形时,将产生WM_PAINT消息,进入消息响应队列,当用户松开鼠标左键后,系统自动调用On Draw函数进行矩形绘制。代码如下:
void CPaint View::On LButton Up()松开右键消息处理函数中关于绘制矩形的代码:
case DRAW_RECTANGLE:
p Shape=new CRectangle(m_pt Start Point,m_pt End Point,Set_Color,m_n Width,m_n Pen Style,
m_n Brush,m_b Line Brush);
p Doc->Add Shape(p Shape);//将绘制的图形作为对象存储到对象数组中
p Doc->Update All Views(NULL);//更新所有视图
3.3 文字编辑功能模块
显示文本要使用CDC类的成员函数Text Out,它的原型为:
BOOL Text Out(int x,int y,const CString&str)
其中,参数x为文本显示在应用程序窗口用户区的水平位置;y为文本的垂直位置;str为要显示的字符串,它是一个CString的对象。
为了准确显示文本,Windows用一个TEXTMETRIC结构类型的数据来存储字体的信息,但是通常获得字体的信息是使用CDC类的成员函数:
BOOL Get Text Metrics(LPTEXTMETRIC lp Metrics)const;
其中,参数lp Metrics是用户定义的一个TEXTMETRIC结构类型数据的指针。在试图类On Draw()函数中使用该函数获得字体的信息。
4 总结
本文针对绘画板的设计进行研究,首先介绍了绘画板的概述,重点描述了绘画板系统的功能,其次对绘画板进行分析和设计,最后并对绘画板的具体实现进行了描述,重点描述了铅笔模块、绘制矩形模块和文字编辑功能模块,并给出了部分核心代码。由于篇幅所限,对于其它功能在此并没有给出。对此感兴趣的读者,可以在此基础之上,进一步的完善,实现自己的绘画板系统。
参考文献
[1]田小林,王建华.MG-12864-2液晶显示器的应用设计[J].现代显示,2004.
[2]向健勇等.寄语SAA7114H的视频图像采集系统的设计[J].现代显示,2004.
[3]曾建潮.软件工程.武汉理工大学出版社,2003.8.
水果VC不能替代蔬菜 第11篇
25%—35%的酒精物理降温用
对高热病人,在服用退烧药效果不明显时,通常选择酒精擦浴来降温。擦浴时应该用含量为25%—35%的酒精,擦拭四肢及血管丰富的腋下、腹股沟、颈部、前额等部位,可使局部血管扩张、皮肤发红,加速血液循环以利散热;且酒精挥发时也会带走热量利于降温。
中医保养耳朵法—鸣天鼓
用掌心的劳宫穴(微握拳,中指所指之处就是劳宫穴)贴住耳孔,手掌搭在后脑勺上。食指放在中指上,往下弹拨,弹几次再压紧耳孔,再突然放松。反复几次后耳朵就会有特别清爽的感觉。
孕妇内衣选购原则
首先视自身的外型改变来考虑需求;多询问有经验的亲朋好友,她们是过来人,有第一手的经验和资讯。市面上的孕产妇用品种类多、品牌杂,有些商品的功能过于夸大,因此必须多了解、多比较,才能买到自己最需要的用品;材质重于外观。内衣的材料、质地需要把握吸汗、舒适的原则。
给牙齿补充营养
给牙齿补钙 牙骨疏松容易导致牙龈炎,多吃富含钙质的食物,可强化骨骼,预防牙龈炎和牙周炎的发生。
戒烟酒 烟和酒会降低人体的免疫力,流失维持口腔健康所需的维生素及矿物质,要想拥有健康的牙齿,必须戒烟和酒。
多吃生的蔬菜 生的蔬菜含有很多纤维素,能帮助清洁,对牙齿及牙龈产生有益刺激,防止牙龈炎。
补充营养素 如维生素A、B族维生素、维生素C及锌,预防感染、治疗炎症,防治牙龈出血。
解决便秘有妙招
若想大便通畅,必须要有规则正常的生活及运动,并要养成规则性的排便习惯,尽量不要依赖药品来治疗便秘,优化食物的摄入才是根本。
1.选择高纤维食物。
2.早起马上喝一大杯温开水,再稍微按摩腹部。
3.可沿肚脐周围作环形按压,有助于排便。每天定时去厕所,养成定时排便的习惯。
VC应用程序 第12篇
关键词:VC,对话框,状态栏,Win32API,CStatusBar类
1 问题的提出
Visual C++提供的MFC (微软基础类库) , 实际上是一个应用程序框架, 它的目的就是要让程序员通过应用程序向导 (AppWizard) 快速生成初步的应用程序框架文件, 然后通过资源编辑器来直观地设计用户界面、通过类向导 (ClassWizard) 向有关框架文件中添加代码, 从而建立起Windows下的应用程序。这种编程环境相对于SDK来说显然方便了许多。
MFC提出了以文档/视图为中心的编程模式, 在它的类库中封装了对文档/视图结构程序全面的支持。因此, 使用MFC编写单文档或多文档类型的应用程序是非常方便的。
但是, MFC提供对话框类型的应用程序开发环境却不那么令人满意, 尤其是对于使用过Visual Basic、Delphi、PowerBuilder等开发工具的程序员, 感觉会更不好。因为VC对话框类型的应用程序的窗口界面过于简单和单调, 比如没有菜单, 没有工具栏, 没有状态栏等。虽然菜单可以通过修改对话框属性来轻松加入, 但工具栏和状态栏却不能象VB、Delphi等开发工具那样使用控件在可是的环境中建立, 因为VC所提供的Windows标准控件没有工具栏和状态栏。
那么, 怎样才能在对话框类型的应用程序窗口中加入状态栏呢?现在将介绍两种实现方法。
2 实现方法
在对话框类型的应用程序窗口中加入状态栏有两种方法, 一种方法是使用MFC提供的状态栏类 (CStatusBar) 建立;另一种方法是使用有关的Win32 API函数建立。
2.1 使用CStatusBar类建立状态栏
对于单文档和多文档类型的应用程序, 应用程序向导会为应用程序自动创建一个状态栏。但应用程序向导并不为对话框类型的应用程序创建状态栏。如果需要在窗口中建立状态栏, 程序员必须通过编程来实现。
使用MFC中提供的状态栏类 (CStatusBar) 来为对话框窗口创建一个状态栏需要以下几个步骤 (为了讲述方便, 假设我们的对话框类应用程序工程为TStatusBar) :
2.1.1 建立CStatusBar类的对象m_StatusBar
为对话框类CTStatusBarDlg增加一个CStatusBar类的对象成员m_StatusBar。即在CTStatusBarDlg类定义 (在TStatusBarDlg.h文件中) 的protected段中增加一个语句:
CStatusBar m_StatusBar;
2.1.2 定义描述状态栏的静态数组
状态栏实际上是个窗口, 一般分为若干个窗格, 每个窗格显示不同的信息。状态栏窗格的划分情况由一个UNIT型的数组来描述。该数组的定义代码可以放在CTStatusBarDlg.cpp文件开始处的编译伪指令之后。具体代码如下:
该数组中的元素个的数就是状态栏中窗格的个数, 即每一个常量表示一个窗格, 其中ID_SEPARATOR (也可以有多个) 窗格显示的信息以后由程序填入 (系统不会自动填入) , ID_INDICATOR_CAPS、ID_INDICATOR_NUM和ID_INDICATOR_SCRL等窗格显示的信息, 对于单文档或多文档类型的程序, 系统会根据当时的有关键的状态自动填入相应的信息, 但对于对话框类型的应用程序, 系统并不自动填入相关信息, 也需要在程序中通过代码来填写相关信息。
2.1.3 创建状态栏对象并显示于对话框窗口
完成了前两步准备工作之后现在可以创建并显示状态栏了, 这些工作应该在对话框窗口的初始化事件中完成。代码放在CTStatusBarDlg::OnInitDialog () 函数定义 (CTStatusBarDlg.cpp文件) 的尾部 (即最后一条语句return TRUE;之前) 。具体代码如下:
2.1.4 在对话框窗口的OnSize事件中重新定位状态栏
至此, 状态栏已经建立完毕, 以后就可以使用状态栏类的SetPaneText成员函数向指定的窗格中填写想要显示的信息了。
但是, 如果对话框窗口的边框风格被设置为可以改变大小的, 则当窗口的大小改变时, 发现状态栏的位置和大小并不会随着窗口的变化而变化。为了解决这个问题, 可以在对话框窗口的OnSize事件中使用Win32 API函数SetWindowPos来重新定位与显示状态栏:
注意:状态栏类也有名为SetWindowPos的成员函数, 但不知为什么, 在OnSize事件使用时运行时会出错, 所以此处改用Win32 API函数SetWindowPos。
2.2 使用Win32 API函数建立状态栏
使用Win32 API函数来为对话框窗口创建状态栏的步骤如下 (为了讲述方便, 我们还假设对话框类应用程序工程为
TStatusBar) :
2.2.1 为CTStatusBarDlg类增加数据成员
因为使用Win32 API函数来为对话框窗口创建状态栏时, 需要用到对话框窗口的句柄和状态栏 (也是一种窗口, 因为它是窗口类的子类) 的句柄, 所以为了程序中使用方便, 可以将它们作为CTStatusBarDlg类的数据成员添加到CTStatusBarDlg类的定义中。即在CTStatusBarDlg类定义 (在TStatusBarDlg.h文件中) 的protected段中增加两个语句:
2.2.2 新建一个对话框资源
使用Win32 API函数来创建状态栏时需要一个对话框 (Dialog) 资源, 为此可以使用资源编辑器新建一个对话框资源, 假设其ID为IDD_STATUS (其他属性均为默认设置) 。
2.2.3 创建状态栏并让其显示于对话框窗口
与使用CStatusBar类建立状态栏类似, 在完成了前两步准备工作之后, 就可以在对话框窗口 (应用程序主窗口) 的初始化事件中创建和显示状态栏了。代码也是放在CTStatusBarDlg:OnInitDialog () 函数定义 (CTStatusBarDlg.cpp文件) 的尾部 (即最后一条语句return TRUE;之前) 。具体代码如下:
2.2.4 在对话框窗口的OnSize事件中重新定位状态栏
与第一种实现方法一样, 如果对话框窗口的边框风格被设置为可以改变大小的, 也需要在对话框窗口的OnSize事件中重新划分和定位状态栏, 其代码为:
3 示例程序的建立及添加的代码
限于篇幅, 这里只给出第一种实现方法的程序代码。
打开VC6.0, 新建一个名为TstatusBar的MFC AppWizard (exe基本对话框工程, 系统将自动建立一系列文件, 然后在TstatusBarDlg.h和TstatusBarDlg.cpp文件中添加2.1中所述的代码。
添加代码后, 相关文件的内容为:
(1) TstatusBarDlg.h文件中自编的代码:
(2) TstatusBarDlg.cpp文件中自编的代码:
注:本程序在WindowsXP中, 使用Visual C++6.0编译通过并运行正确。