Visual C#访问接口 对接口成员的访问

合集下载

解决VisualC++编译器中混合.c文件时收到C1853预编译头错误的方法

解决VisualC++编译器中混合.c文件时收到C1853预编译头错误的方法

解决VisualC++编译器中混合.c文件时收到C1853预编译头错误的方法第一篇:解决Visual C++ 编译器中混合 .c 文件时收到 C1853 预编译头错误的方法解决Visual C++ 编译器中混合.c 文件时收到 C1853 预编译头错误的方法当Visual C++ 项目启用了预编译头(Precompiled header)功能时,如果项目中同时混合有.c 和.cpp 源文件,则可能收到 C1853 编译器错误:fatal error C1853: 'pjtname.pch' precompiled header file is from a previous version of the compiler, or the precompiled header is C++ and you are using it from C(or vice versa)(致命错误C1853: “filename.pch”预编译头文件来自编译器的早期版本,或者预编译头为C++ 而在C 中使用它(或相反))。

该错误是因为当项目中混合了.cpp 和.c 文件时,编译器会对它们采取不同的编译方式(主要是因为对函数声明的处理方式不同),因而不能共用一个预编译头文件。

在VC++ 中,默认的预编译头文件是针对 C++ 的(stdafx.h 和 stdafx.cpp),当然也可以创建针对 C 的预编译头。

有趣的是,在旧版的VC++ 中,这个错误的提示很具有误导性:fatal error C1853: 'xxx.pch' is not a precompiled header file created with this compiler.常常让人摸不着头脑。

应该说,在新版中的这个提示是有所改进的。

不过在网上搜索一番,对这个问题往往都是建议对整个项目取消预编译头的设置。

这显然不是一个好的解决方案。

《visualc2010入门教程》系列二:安装配置和首次使用vs2010

《visualc2010入门教程》系列二:安装配置和首次使用vs2010

Visual C++ 2010 入门教程》系列二:安装、配置和首次使用VS2010日期:2010.6.15 写在前面在我还在上学的时候,我选择了C++ ,最初我用VC6 作为我的IDE ,我看过很多本C++ 的教材,有的适合我,有的不适合我,其中有本叫《Visual C++ 2005 入门经典》的书帮了我不少的忙。

因为通常的C++教材都只会介绍C++的语法什么的,很少会告诉我们如何去编译、运行,告诉我们什么是控制台程序,什么事Win程序,什么是GUI程序,C++能干什么,VC和C++ 的区别是什么。

现在有很多的朋友应该也有这些问题吧?学C++ 用C++ 也有几年了,算不上熟悉,算是初窥门径吧,我想我应该做点什么帮助一下那些和曾经的我一样困惑的朋友,特别是学生朋友,告诉他们他们所困惑的问题的答案。

记得我学C++ 的时候,没有人教,有的时候也走了不少弯路,甚至连调试也不会,也不知道可以通过看调用堆栈看调用次序,还自己慢慢的去搜索,好傻啊。

接下来我会做个《Visual C++ 2010 入门教程》系列,用来帮助初学者。

刚开始学的时候是很痛苦的,这个我深有体会,特别是身边还没有人能够指导一二的。

内容主要涵盖在Windows 下面使用C++进行开发的常见内容,Visual Studio 2010 的使用,如何创建新项目,如何调试,如果配置项目属性等等,另外水平有限,其中难免有错误,希望大家谅解,如果大家有发 现问题还请务必及时指出来,否则误导了他人我就罪不容恕注意,本教程非 C++ 教程,不会教你 C++ ,只会教你如何使用 Visual C++ 2010 去练习去学习其它 C++教在使用 Visual C++ 2010 实践的时候如果遇到问题可以到这里来参考。

推荐《C++ Primer 沢《C++程序设计语言》《Visual VC 和 C++ 的那些事第二章 安装、配置和首次使用 VS2010章将帮助大家安装 Visual C++ 2010 ,帮助大家做一些常见 的配置,以及第一次使用它来写 HelloWord 程序。

明确目的是VisualC入门的前提

明确目的是VisualC入门的前提
指Windows应用软件,还包括其他系统的应用软件或是一些 应用服务(如网站服务模块等),总之就是应用软件。而 开发应用软件需要知道业务流程,如开发财务管理系统, 需要知道的业务流程如下: • 管理员如何登录,登录后可以进行何种操作。 • 一般用户如何登录,登录后可以进行哪些查询操作。 • 当然,很多软件开发的复杂性并不在于编程技巧,事实上, 软件工程理论反复强调的是软件开发不是个人编程的神秘 技巧,而是集体劳动的结晶,应用软件开发难度往往就在 于业务流程和工作流程的复杂性和不确定性。
• “FirstProgram.ncb”:“*.ncb”文件是无编译浏览文件,当自 动完成功能出问题时可以删除此文件。
• “FirstProgram.opt”:“*.opt”文件是工程关于开发环境的参 数文件,如工具条位置等信息。
• “FirstProgram.plg”:“*.plg”文件保存了编译过程的信息, 每当重新编译项目时,该文件会被更新。
代码文件就会相应产生一个目标文件。
1.3.4 实例-创建第一个MFC程序:Hello , MFC !
• 【本小节示例参考:\源代码\C01\test】 • 在使用Visual C++进行项目开发时,很多情况下开始的操作步骤
是类似的,特别是运行在Windows中的应用程序,都有比较标准的 界面,如主菜单有“文件”、“编辑”和“视图”等,为了避免 重复性的开发劳动,微软公司根据Windows常用软件的结构,提供 了MFC(Microsoft Foundation Class)微软基础类库体系,MFC 是一种可以根据开发者定制的模式生成可运行的代码框架的类库 体系,编译这个代码框架可以生成各种类型的应用程序框架,当 然,如果没有进行功能的编程,这些代码框架是不做任何工作的。 • 在本节中,将学习如何使用Visual C++6.0的应用程序向导来创建 一个基于MFC的软件项目,并在软件界面中打印“Hello , MFC !” 字符串。在软件开发过程中,人们很早就认识到应用程序的创建 具有相似性和重复性,因此,如果能有一种功能,即自动化创建 一类程序,则可以大大提高软件开发的效率和软件编程的入门门 槛。

Visual C++ 6.0使用说明

Visual C++ 6.0使用说明

Visual C++ 6.0使用说明在VC6.0下,必须先创建工程(Project),然后再添加源文件。

一个真正的软件,往往需要多个源文件和多种资源,例如图片、视频、控件等,通常是把它们放到一个文件夹下,进行有效的管理。

你可以把工程理解为这样的一个文件夹,IDE通过工程来管理这些文件。

工程有不同的类型,例如开发“黑窗口”的控制台程序,需要创建Win32 Console Application工程;开发带界面的GUI程序,需要创建Win32 Application工程。

1) 新建Win32 Console Application工程打开VC6.0,在菜单栏中选择“文件-> 新建”,或者Ctrl+N,弹出下面的对话框:切换到“工程”选项卡,选择“Win32 Console Application”,填写工程名称和路径,点击“确定”,会弹出一个对话框询问类型,这里选择“一个空工程”,如下图所示:点击“完成”按钮完成工程的创建。

2) 新建C源文件在菜单栏中选择“文件-> 新建”,或者Ctrl+N,弹出下面的对话框:切换到“文件”选项卡,选择“C++ Source File”,填写文件名,点击确定完成。

该步骤是向刚才创建的工程添加源文件。

3) 编写C语言代码在工作空间中可以看到刚才创建的工程和源文件,如下图所示:双击hello.c,进入编辑界面,输入上节中的代码。

4) 编译并运行代码在“组建”菜单中找到编译、组建和运行的功能,如下图所示:更加简单的方法是使用快捷方式,如下图所示:保存编写好的源代码,点击运行按钮或Ctrl+F5,如果程序正确,可以看到运行结果,如下图所示:注意:编译生成的.exe 文件在工程目录下的Debug文件夹内。

以上面的工程为例,路径为 E:\cDemo,打开看到有一个Debug文件夹,进入可以看到cDemo.exe。

在Debug目录中还会看到一个名为hello.obj 的文件。

VisualC轻松入门Windows应用程序介绍

VisualC轻松入门Windows应用程序介绍


• • • •
10.2.2 什么样的程序是Win32应用程序
• 在Windows1.0版本的时代,Windows本身的功能很少,并且Windows软件非 常少,如果单靠Microsoft公司自行开发软件,显然是不可取的,原因在 于应用软件的需求各异,而且要求种类繁多,另外,有些应用软件比操作 系统本身更复杂,如大型的数据库系统等。聪明的Microsoft公司的智囊 们当然不会选择自己开发应用软件。 如果将应用软件集成到操作系统中如何?显然,这样更不可取,这样的操 作系统非常庞大,大到几百GB的硬盘都可能放不下,因此,到目前为止, 我们使用的Windows XP或Windows Vista操作系统虽然有自带的应用软件, 如计算器、文档编辑器、画图工具等,但这些软件都小之又小,简单得不 能再简单。 操作系统一般有两种接口:一个是键盘鼠标操作接口,一个是应用程序接 口。前者是为系统使用的用户提供操作计算机的接口,后者是为程序设计 人员操作计算机而提供的接口。同样的道理,为了让其他软件公司能在 Windows环境下编程,Microsoft公司也提供了Windows应用程序接口,实 际上,这些接口就是一千多个函数集合,只要软件公司具有一个与 Windows操作系统兼容的编译器,并熟练掌握这一千多个函数就可以在 Windows环境下进行任意应用软件的开发。
10.2.1 应用程序的类型简介
• 应用程序可以按照多种分类方式:按照业务类型分类、按照应用领域分类、 按照框架接口和界面分类等。本书并不是某个专业业务领域的书籍,着重 让读者掌握Visual C++6.0集成开发环境和C++编程语言,因此,只需要读 者按照框架接口和界面分类来掌握各种程序设计即可。应用程序按照框架 接口和界面可以分为以下几种类型: Win32应用程序:Win32应用程序原本是指运行在Windows操作系统32位计 算机平台上的应用程序,当然,其他几个种类的应用程序也是运行在这种 环境下。狭义的Win32应用程序是指不使用MFC类库而直接使用Win32 SDK 编写的应用程序。 对话框应用程序:对话框应用程序是MFC应用程序的一个分支,它的特点 是只有一个或多个对话框,而没有文档视图结构。 动态链接库:动态链接库是Windows程序中常使用的组件,编写Windows动 态链接库(Windows DLL)可以让多个程序共享相同功能的代码。 单文档应用程序(SDI):对话框应用程序是MFC应用程序的一个分支,它相 对于对话框应用程序具有单文档视图结构,并且可以生成对话框。 多文档应用程序(MDI) :对话框应用程序是MFC应用程序的一个分支,它 相对于对话框应用程序具有多个文档视图结构,也可以生成对话框。

Visual C++ 2008 SP1 MFC (OFFICE界面)使用入门

Visual C++ 2008 SP1 MFC (OFFICE界面)使用入门

图形画板2008设计文档目录1. 图形后台框架1.1. 基本图形类框架如下:2. 界面框架2.1. 快捷菜单2.2. 主菜单2.3. 工具栏3. 如何创建OFFICE风格的MFC工程4. 如何在工具栏上面添加按钮4.1. 添加菜单主项4.2. 为菜单项添加事件4.3. 添加Ribbon字符4.4. 将按钮添加到工具栏4.4.1. 创建主类别(CMFCRibbonCategory)4.4.2. 创建面板(CMFCRibbonPanel)4.4.3. 添加按钮(CMFCRibbonButton)到面板∙∙1. 图形后台框架1.1. 基本图形类框架如下:2. 界面框架主用应用了Visual Studio 2008 SP1添加的新增强包,可以方面的创建出像OFFCIE2007的Ribbon界面。

Ribbon工具栏是在MainFrm.CPP中的void CMainFrame::InitializeRibbon()生成的整个工具栏CMFCRibbonBar分为2.1. 快捷菜单2.2. 主菜单主菜单按钮CMFCRibbonApplicationButton主菜单CMFCRibbonMainPanel2.3. 工具栏主要分成3层结构:第一层:分类(容器)CMFCRibbonCategory,如图中红色部分所示。

第二层:面板(容器)CMFCRibbonPanel ,如图中红色部分所示。

第三层:元素CMFCRibbonBaseElem,如图中红色部分所示。

先有一个整体的概念~3. 如何创建OFFICE风格的MFC工程以下是创建Visual C++ 2008 SP1创建Office风格的MFC的步骤:首先,新建项目,选择Visual C++ 中的MFC应用程序,输入名称,点击确定接着选择Office的项目类型,MFC的使用选择“在静态库中使用MFC”(这样可以保证在任何Windows系统中都能正确运行,如果选择共享DLL,则只能在有MFC7.0库的机子上正确运行,所以推荐选“在静态库中使用MFC”)接下来的几个步骤都直接按默认即可这里我们先将“导航窗格”的勾去掉(由于本程序没有用到它,所以再此不详细介绍)这里将视图类的基类选为CScrollView,点击完成然后运行一下,基本的雏形就出来啦,简单吧~4. 如何在工具栏上面添加按钮4.1. 添加菜单主项接着继续添加菜单子项,并在属性栏中设置相应的属性,注意Prompt要按照“解释\n标题”这种格式,例如:Prompt绘制一个圆\n画圆做完要记得保存哦4.2. 为菜单项添加事件右键点击需要添加事件的选项,选择添加“事件处理程序”点击“添加编辑”,然后就到视图类的结尾找到这个事件的函数,开始编写事件,可以注意到“函数处理程序名称”是根据“命令名”自动生成的,虽然自己也可以修改,不过还是按默认的比较好,所以也说明上面提到的加入ID时候要根据这样的命名规则来命名。

VisualC6.0可视化编程窗口介绍

VisualC6.0可视化编程窗口介绍

网络安全概述
25
时1分41秒
设置断点
• 当程序运行到一个断点时就会停下来,这时可以 检查程序的状态,运行代码,以及调试窗口估计 表达式的值。调试器支持的断点类型有
➢ 位置断点(无条件断点):在一个特定的位置中 断程序
➢ 数据断点:当表达式为真或值改变时,中断程序。 ➢ 消息断点:当在一个WndProc函数中接受一个消
2024年7月8日星期一12
网络安全概述
4
时1分41秒
• Resource View
• 显示工程中所有资源,单击“+”号依次打开 树形结构每一项,直到所有的“+”号都变成 “-”号,显示出了所有的资源,包括对话框 图符、字符串表和版本信息。双击某项, 就会显示该资源的图形编辑窗口,可直接 在这个窗口上增加和修改资源特征。
2024年7月8日星期一12
网络安全概述
9
时1分41秒
• 树形察看控件(Tree Control) • 制表文控件(Tab Control) • 动画显示控件(Animate) • 多信息编辑框(Rich Edit) • 用户控件(Custom Control)
2024年7月8日星期一12
网络安全概述
• App Wizard在生成应用程序的框架和工程 文件后,自动回到Visual C++6.0工作台, 并可调入新的工程工作区。由此进入了编 写可视化程序的主窗口——可视化编程窗 口,下面将各部分一一介绍
2024年7月8日星期一12
网络安全概述
1
时1分41秒
工作区窗口
• 工作区窗口有三个列表 • Class View
• 当选择是一个派生类时,可通过快捷菜单 增加成员函数或成员变量,

visual_c_mfc(收费)[精华]

visual_c_mfc(收费)[精华]

Visual C++ MFC 简明教程原著:Marshall Brain 编译:张圣华第一部分:MFC导论Visual C++ 不仅仅是一个编译器。

它是一个全面的应用程序开发环境,使用它你充分利用具有面向对象特性的C++ 来开发出专业级的Windows 应用程序。

为了能充分利用这些特性,你必须理解C++ 程序设计语言。

掌握了C++,你就必须掌握Microsoft 基本类库(MFC) 的层次结构。

该层次结构包容了Windows API 中的用户界面部分,并使你能够很容易地以面向对象的方式建立Windows 应用程序。

这种层次结构适用于所有版本的Windows 并彼此兼容。

你用MFC 所建立的代码是完全可移植的。

该教程将向你介绍MFC的基本概念和术语以及事件驱动程序设计方法。

在本节中,你将会输入、编译和运行一个简单的MFC程序。

下一节中将向你详细解释这些代码。

第三部分讨论了MFC控制和如何定制它们。

第四部分将介绍消息映射,你将会处理MFC的事件。

什么是MFC?如果你要建立一个Windows 应用程序,应该如何下手?好的开端是从设计用户界面开始。

首先,你要决定什么样的用户能使用该程序并根据需要来设置相应的用户界面对象。

Windows 用户界面有一些标准的控制,如按钮、菜单、滚动条和列表等,这对那些Windows 用户已经是很熟悉了。

要记住的是,作为程序员必须选择一组控制并决定如何把它们安排到屏幕上。

传统上,你需要在纸上做一下用户界面的草图,直到对各元素感到满意为止。

这对于一些比较小的项目,以及一些大项目的早期原型阶段是可以的。

下一步,是要实现代码。

为任何Windows 平台建立应用程序时,程序员都有两种选择:C 或C++。

使用C,程序员是在Windows 应用程序界面( API ) 的水平上编写代码。

该界面是由几百个C 函数所组成,这些函数在Windows API 参考手册中都有介绍。

对于Windows NT, API 被称为“Win32 API”,以区别于其用于Windows 3.1的16位API。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Visual C#访问接口 对接口成员的访问 对接口方法的调用和采用索引指示器访问的规则与类中的情况也是相同的。如果底层成员的命名与继承而来的高层成员一致,那么底层成员将覆盖同名的高层成员。但由于接口支持多继承,在多继承中,如果两个父接口含有同名的成员,这就产生了二义性(这也正是C#中取消了类的多继承机制的原因之一),这时需要进行显式的定义:

using System ; interface ISequence { int Count { get; set; } } interface IRing { void Count(int i) ; } interface IRingSequence: ISequence, IRing { } class CTest { void Test(IRingSequence rs) { //rs.Count(1) ; 错误, Count 有二义性 //rs.Count = 1; 错误, Count 有二义性 ((ISequence)rs).Count = 1; // 正确 ((IRing)rs).Count(1) ; // 正确调用IRing.Count } } 上面的例子中,前两条语句rs .Count(1)和rs .Count = 1会产生二义性,从而导致编译时错误,因此必须显式地给rs 指派父接口类型,这种指派在运行时不会带来额外的开销。

再看下面的例子: using System ; interface IInteger { void Add(int i) ; } interface IDouble { void Add(double d) ; } interface INumber: IInteger, IDouble {} class CMyTest { void Test(INumber Num) { // Num.Add(1) ; 错误 Num.Add(1.0) ; // 正确 ((IInteger)n).Add(1) ; // 正确 ((IDouble)n).Add(1) ; // 正确 } } 调用Num.Add(1) 会导致二义性,因为候选的重载方法的参数类型均适用。但是,调用Num.Add(1.0) 是允许的,因为1.0 是浮点数参数类型与方法IInteger.Add()的参数类型不一致,这时只有IDouble.Add 才是适用的。不过只要加入了显式的指派,就决不会产生二义性。

接口的多重继承的问题也会带来成员访问上的问题。例如: interface IBase { void FWay(int i) ; } interface ILeft: IBase { new void FWay (int i) ; } interface IRight: IBase { void G( ) ; } interface IDerived: ILeft, IRight { } class CTest { void Test(IDerived d) { d. FWay (1) ; // 调用ILeft. FWay ((IBase)d). FWay (1) ; // 调用IBase. FWay ((ILeft)d). FWay (1) ; // 调用ILeft. FWay ((IRight)d). FWay (1) ; // 调用IBase. FWay } } 上例中,方法IBase.FWay在派生的接口ILeft中被Ileft的成员方法FWay覆盖了。所以对d. FWay (1)的调用实际上调用了。虽然从IBase-> IRight-> IDerived这条继承路径上来看,ILeft.FWay方法是没有被覆盖的。我们只要记住这一点:一旦成员被覆盖以后,所有对其的访问都被覆盖以后的成员"拦截"了。

类对接口的实现 前面我们已经说过,接口定义不包括方法的实现部分。接口可以通过类或结构来实现。我们主要讲述通过类来实现接口。用类来实现接口时,接口的名称必须包含在类定义中的基类列表中。

下面的例子给出了由类来实现接口的例子。其中ISequence 为一个队列接口,提供了向队列尾部添加对象的成员方法Add( ),IRing 为一个循环表接口,提供了向环中插入对象的方法Insert(object obj),方法返回插入的位置。类RingSquence 实现了接口ISequence 和接口IRing。

using System ; interface ISequence { object Add( ) ; } interface ISequence { object Add( ) ; } interface IRing { int Insert(object obj) ; } class RingSequence: ISequence, IRing { public object Add( ) {…} public int Insert(object obj) {…} }

如果类实现了某个接口,类也隐式地继承了该接口的所有父接口,不管这些父接口有没有在类定义的基类表中列出。看下面的例子:

using System ; interface IControl { void Paint( ); } interface ITextBox: IControl { void SetText(string text); } interface IListBox: IControl { void SetItems(string[] items); } interface IComboBox: ITextBox, IListBox { } 这里, 接口IcomboBox继承了ItextBox和IlistBox。类TextBox不仅实现了接口ITextBox,还实现了接口ITextBox 的父接口IControl。

前面我们已经看到,一个类可以实现多个接口。再看下面的例子: interface IDataBound { void Bind(Binder b); } public class EditBox: Control, IControl, IDataBound { public void Paint( ); public void Bind(Binder b) {...} }

类EditBox从类Control中派生并且实现了Icontrol和IdataBound。在前面的例子中接口Icontrol中的Paint方法和IdataBound接口中的Bind方法都用类EditBox中的公共成员实现。C#提供一种实现这些方法的可选择的途径,这样可以使执行这些的类避免把这些成员设定为公共的。接口成员可以用有效的名称来实现。例如,类EditBox可以改作方法Icontrol.Paint和IdataBound.Bind来来实现。

public class EditBox: IControl, IDataBound { void IControl.Paint( ) {...} void IDataBound.Bind(Binder b) {...}

}

因为通过外部指派接口成员实现了每个成员,所以用这种方法实现的成员称为外部接口成员。外部接口成员可以只是通过接口来调用。例如,Paint方法中EditBox的实现可以只是通过创建Icontrol接口来调用。

class Test { static void Main( ) { EditBox editbox = new EditBox( ); editbox.Paint( ); //错误: EditBox 没有Paint 事件 IControl control = editbox; control.Paint( ); // 调用 EditBox的Paint事件 } }

上例中,类EditBox 从Control 类继承并同时实现了IControl and IDataBound 接口。EditBox 中的Paint 方法来自IControl 接口,Bind 方法来自IDataBound 接口,二者在EditBox 类中都作为公有成员实现。当然,在C# 中我们也可以选择不作为公有成员实现接口。

如果每个成员都明显地指出了被实现的接口,通过这种途径被实现的接口我们称之为显式接口成员(explicit interface member)。 用这种方式我们改写上面的例子:

public class EditBox: IControl, IDataBound { void IControl.Paint( ) {…} void IDataBound.Bind(Binder b) {…} }

显式接口成员只能通过接口调用。例如:

class CTest { static void Main( ) { EditBox editbox = new EditBox( ) ; editbox.Paint( ) ; //错误:不同的方法 IControl control = editbox; control.Paint( ) ; //调用 EditBox的Paint方法 } }

上述代码中对editbox.Paint( )的调用是错误的,因为editbox 本身并没有提供这一方法。control.Paint( )是正确的调用方式。

注释:接口本身不提供所定义的成员的实现,它仅仅说明这些成员,这些成员必须依靠实现接口的类或其它接口的支持。

知道了怎样访问接口,我们还要知道怎样实现接口,要实现C#的接口,请看下一节-实现接口

类对接口的实现

前面我们已经说过,接口定义不包括方法的实现部分。接口可以通过类或结构来实现。我们主要讲述通过类来实现接口。用类来实现接口时,接口的名称必须包含在类定义中的基类列表中。

下面的例子给出了由类来实现接口的例子。其中ISequence 为一个队列接口,提供了向队列尾部添加对象的成员方法Add( ),IRing 为一个循环表接口,提供了向环中插入对象的方法Insert(object obj),方法返回插入的位置。类RingSquence 实现了接口ISequence 和接口IRing。

相关文档
最新文档