VisualStudio及编程技术野猫学习笔记_第1页
VisualStudio及编程技术野猫学习笔记_第2页
VisualStudio及编程技术野猫学习笔记_第3页
VisualStudio及编程技术野猫学习笔记_第4页
VisualStudio及编程技术野猫学习笔记_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2014-12-07 叶茂野猫野猫野猫野猫野猫62/62野猫VisualStudio及编程技术总结总论编程基础操作系统操作系统的种类相当多,各种设备安装的操作系统可从简单到复杂,可分为智能卡操作系统、实时操作系统、传感器节点操作系统、嵌入式操作系统、个人计算机操作系统、多处理器操作系统、网络操作系统和大型机操作系统。按应用领域划分主要有三种:桌面操作系统、服务器操作系统和嵌入式操作系统。桌面操作系统主要用于个人计算机上。个人计算机市场从硬件架构上来说主要分为两大阵营,PC机与Mac机,从软件上可主要分为两大类,分别为类Unix操作系统和Windows操作系统。其中Unix和类Unix操作系统有MacOSX,Linux发行版(如Debian,Ubuntu,LinuxMint,openSUSE,Fedora等);微软公司Windows操作系统有Windows98,WindowsXP,WindowsVista,Windows7,Windows8,Windows10。服务器操作系统一般指的是安装在大型计算机上的操作系统,比如Web服务器、应用服务器和数据库服务器等。服务器操作系统主要集中在三大类:Unix系列:SUNSolaris,IBM-AIX,HP-UX,FreeBSD,OSXServer[3]等;Linux系列:RedHatLinux,CentOS,Debian,UbuntuServer等;Windows系列:WindowsNTServer,WindowsServer2003,WindowsServer2008,WindowsServer2008R2等。嵌入式操作系统是应用在嵌入式系统的操作系统。嵌入式系统广泛应用在生活的各个方面,涵盖范围从便携设备到大型固定设施,如数码相机、手机、平板电脑、家用电器、医疗设备、交通灯、航空电子设备和工厂控制设备等,越来越多嵌入式系统安装有实时操作系统。在嵌入式领域常用的操作系统有嵌入式Linux、WindowsEmbedded、VxWorks等,以及广泛使用在智能手机或平板电脑等消费电子产品的操作系统,如Android、iOS、Symbian、WindowsPhone和BlackBerryOS等。桌面和服务器操作系统多是C语言编写,而嵌入式操作系统中手机系统多是Java语言编写,但苹果手机系统是object-C语言。编程语言计算机语言有3大类:机器语言、汇编语言、高级语言,机器语言是机器依赖的,而且非常烦琐,后简化为助记符语言,即汇编语言,后又在此基础上进一步简化,而成为高级语言,显然,高级语言需要通过编译器转换成机器语言才能使计算机理解。高级语言分为:Fortran(1954)、Cobol(1961)、Basic(1964)、C(1972)、object-C(1980)、C++(1983)、Java(1995)、C#(2000)。1999年随着MicrosoftWindows图形用户界面GUI的推出,出现了VisualBasic、VisualC++、VisualC#。Fortran的最大特性是接近数学公式的自然描述,在计算机里具有很高的执行效率。易学,语法严谨。可以直接对矩阵和复数进行运算,这一点类似MATLAB。自诞生以来广泛地应用于数值计算领域,积累了大量高效而可靠的源程序。很多专用的大型数值运算计算机针对Fortran做了优化。现在仍广泛地应用于并行计算和高性能计算领域。Cobol擅长于需要精确和有效地操作大量数据的商业应用。目前仍然有大量的企业软件是用它编写的。它是数据处理领域最为广泛的程序设计语言,是第一个广泛使用的高级编程语言。Basic用于快速而方便地编写简单程序,主要目的是让新手熟悉编程技术。属于事件驱动语言。优点:简单易学,会话式,既能进行科学计算,又能数据处理等、有两种执行方式:解释方式和编译方式。其中解释方式可以边输程序边运行、非常适合初学者。C语言是一个有结构化程序设计、具有变量作用域以及递归功能的过程式语言,与硬件无关,具有广泛可移植性。传递参数均是以值传递,另外也可以传递指针、不同的变量类型可以用结构体组合在一起。通过指针,C语言可以容易的对存储器进行低级控制。编译预处理让C语言的编译更具有弹性。开发了UNIX系统。Objective-C是非常“实际”的语言。它使用一个用C写成、很小的运行库,只会令应用程序的大小增加很小。ObjC不包括命名空间机制,取而代之的是程序设计师必须在其类别名称加上前缀,时常引致冲突。虽然Objective-C是C的母集,但它也不视C的基本型别为第一级的对象。和C++不同,Objective-C不支持运算子多载(它不支持ad-hoc多型)。亦与C++不同,但和Java相同,Objective-C只容许对象继承一个类别(不设多重继承)。Categories和protocols不但可以提供很多多重继承的好处,而且没有很多缺点,例如额外执行时间过重和二进制不兼容。C++语言在C语言的基础上提供了面向对象编程特性,C++是一种静态数据类型检查的、支持多重编程范式的通用程序设计语言。它支持过程化程序设计、数据抽象、面向对象程序设计、泛型程序设计等多种程序设计风格。随着代码量和复杂度的增加,C++的优势将会越来越明显。造成这种差别的就是C++的软件工程性。但C++由于语言本身过度复杂,这甚至使人类难于理解其语义。更为糟糕的是C++的编译系统受到C++的复杂性的影响,非常难于编写,即使能够使用的编译器也存在了大量的问题,这些问题大多难于被发现,在unix/linux领域受到抨击。java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由SunMicrosystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaEE(j2ee),JavaME(j2me),JavaSE(j2se))的总称。Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。C#是一种安全的、稳定的、简单的、优雅的,由C和C++衍生出来的面向对象的编程语言。它在继承C和C++强大功能的同时去掉了一些它们的复杂特性(例如没有宏以及不允许多重继承)。C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。总结:高级语言各有应用领域,Fortran用于复杂数学计算的科学工程,Cobol用于大数据量的商业应用,Basic用于初学,C语言用于底层开发系统,而C++、C#、Java多用于开发各种应用软件。越高级的语言,就越远离低层,因此要全面衡量各种语言,根据实际的项目需要选择。运行效率要求高的、底层控制要求高的用C/C++,否则可以选择Java/C#;跨平台的要求高的可以用Java。运算符优先级:单操作>算术>比较>逻辑>赋值。ASCII字符集是一个比较精简的字符集,为方便全球共用一个字符集,人们创建了Unicode标准,它又分为UTF-8、UTF-16、UTF-32,它们的区别是用几位表示字符,ASICII是用1个字节,UTF-8用1到4个字节,UTF-16用2个以上字节。编程感想编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程。为了使计算机能够理解人的意图,人类就必须要将需解决的问题的思路、方法、和手段通过计算机能够理解的形式告诉计算机,使得计算机能够根据人的指令一步一步去工作,完成某种特定的任务。这种人和计算机之间交流的过程就是编程。操作系统将一些简单的指令封装成一个简单的操作,使得我们的操作更容易更简单,然而操作系统提供的操作始终是有限的,如果要扩展计算机的软件系统,就需要编程了。程序编写需要有通用函数的思想、分解的思想、显化调试的思想。调试技巧调试的根本方法是显化操作,可以监视、可以messagebox。利用{}的匹配作用,如果{}之间有错误,那么鼠标指在{上时会{变红,因此可以此判断错误就在{}之间,进而可以分段找出错误,此为大型代码查错速法。断点,逐语句F10、逐过程F11、和监控。分解调试。调试(F5、shift+F5)——局部变量和自动变量,调出变量窗口,它们都负责显示一些当前断住状态下的变量的值,注意,这些只有在程序中断的时候才有意义。自动变量选项卡并非指auto变量,而是指VS帮我们猜想我们可能感兴趣的一些变量的值,或者函数返回值,而局部变量基本上就是本过程的一些变量的值了。注意,这些选项卡不仅仅可以用于查看,甚至可以用于你临时修改它们的值,方法就是双击值就可以了。调试——监视,调试——调用堆栈。右击你想查看的变量,选择快速监视。程序分为debug和release版本,前者用于调试,后者优化发布。常见错误符号缺失、名字拼写错误、重复定义、找不到。下标越界、=与==误用、死循环。程序默认读写在双重“工程名”文件夹内。找不到关键字。VS中double(1/3*pi)=0常见英文简写ADO ActiveXDataObjects 一组优化的访问数据库的专用对象集API ApplicationProgrammingInterface应用编程接口ASPActiveServerPage 动态服务器页面BBS BulletinBoardSystem 论坛CEO ChiefExecutiveOfficer 首席执行官CLR CommonLanguageRuntime 公共语言运行环境CLI CommonLanguageInfrastructure 公共语言基础结构DBA DataBaseAdministrator 数据库管理员FCL FrameworkClassLibrary 框架类库HTTP HyperTextTransferProtocol 超文本传输协议HTML HyperTextMark-upLanguage 超文本标记语言IT InformationTechnology 信息技术ISOInternationalOrganizationforStandardization 国际标准化组织OA OfficeAutomatization 办公自动化OOP Object-OrientedProgramming 面向对象编程OOD Object-OrientedDesign 面向对象设计OOA Object-OrientedAnalysis 面向对象分析PHP PersonalHomePage 超级文本预处理语言SDK SoftwareDevelopmentKit 软件开发包SOAP SimpleObjectAccessProtoco 简单对象访问协议SGMLStandardGeneralizedMarkupLanguage 标准通用标记语言URI UniversalResourceIdentifier 通用资源标志符URL UniformResourceLocation 统一资源定位符WWWWorldWideWeb 万维网,是默认的web主机名XML ExtensibleMarkupLanguage 可扩展性的语言VSVS优点一统VB、VC++、VC#、VF#4种语言,推出.NET来实现跨语言、跨平台。VS设置添加筛选器了,默认情况下VS为我们创建三个筛选器:头文件、源文件和资源文件,实际上我们可以再增加很多。下载安装一个SVNForVS使你的项目管理更加强大,可以还原代码至任意编译过的时间。如果你已经安装好了AnkhSVN插件但是又看不到的话,那么请检查下系统选项卡里面是否选择了它作为默认的源代码管理工具。VisualAssistX(简称VAX)是一款优秀的VS辅助插件,下载安装后可以辅助你编程,比如智能联想补全代码。随着VisualStudio的不断完善,VisualAssistX逐渐失去作用。安装好本地帮助文件,则可以在程序任何地方F1获取帮助。需要更改项目名称时,利用记事本打开所有项目文件夹中的重要文件,查找替换掉原名字即可。工具——选项——环境——键盘可以查看快捷键对应的操作和操作对应的快捷键,并可创建或修改快捷键。工具-选项-文本编辑器-所有语言-常规-取消勾选“没有选定内容时对穿行应用剪切或复制命令”,可以防止复制空行。程序发布技巧(有疑问立即百度,不留问题过夜)形成自己的编程风格每个人都有自己的编程习惯,许多习惯的集合就是编程风格。我习惯分3个层次:类名单词首字母都大写,方法名除第一个单词以外都大写首字母,实例化对象和变量(属性)皆小写,多个单词通过下划线连接。常用Ctrl+K,Ctrl+S来合并大段代码,常用Ctrl+K,Ctrl+F来格式化代码,常用////来添加方法的说明。举例:publicclassPerson{publicstringgod_name;//FieldpublicPerson()//Constructor{name="unknown";}publicvoidsetName(stringnew_name)//Method{name=new_name;}}用VS2005打开VS2008的方法先用记事本打开.sln文件,你将看到:MicrosoftVisualStudioSolutionFile,FormatVersion10.00#VisualStudio2008你把它改成:MicrosoftVisualStudioSolutionFile,FormatVersion9.00#VisualStudio2005即可用2005来打开,若还不行则把.vcproj这样的文件打开,把Version="9.00改为Version="8.00断点被跳过说明代码编码出现问题,可以用记事本打开该cpp文件,然后另存为unicode编码方式,用另存为的cpp文件覆盖原cpp文件就ok了。快捷键(所有快捷键都按常理出牌)Ctrl+shift+ins可以在过去剪切或复制到剪贴板上的20条内容间进行循环粘贴。Ctrl+enter在上方插入一行,ctrl+shift+enter在下方插入一行。双击可以选中单词。Ctrl+L剪切当前行,Ctrl+shift+L删除当前行。Alt+shift+T交换当前行与它下面的行。Ctrl+U小写化,ctrl+shift+U大写化。Ctrl+shift+PgDn可以选择当前光标位置以下至编辑器视图顶部之间的所有文本。Ctrl+-向后导航,Ctrl+shift+-向前导航先Ctrl+D定位到查找栏,再输入一个数字,再按Ctrl+G就可跳转至该行。同时按住Alt和鼠标可以实现块选。插入跟踪点,可以实现对指定断点处某个变量的值进行完整跟踪。在编辑的中输入代码片段,比如"for",通过按"tab"两次插入代码块,此时你可以把第一个"i"改成"j",然后按Tab键,则所有的i变量都变成了"j"。Ctrl+]可以跳到相应的另一个匹配标记处,比如{}互相跳转。Ctrl+C复制当前行,Ctrl+X剪切当前行F9在当前行插入断点,Ctrl+F9禁用或启用断点,右击红色断点可以设置断点的条件,程序运行到断点时可以修改断点处变量的值。Ctrl+Alt+F7重新生成解决方案,F5启动调试,F12转到定义Ctrl+K、Ctrl+F可以设置选定内容或当前行的格式,而Ctrl+K、Ctrl+D可以设置整个文档的格式。Ctrl+K、Ctrl+S可以将选中代码用#region套起来,方便折叠Ctrl+M、Ctrl+O折叠到定义,使代码最容易阅读Ctrl+K、Ctrl+K设置书签,Ctrl+K、Ctrl+N转到下一个书签,Ctrl+K、Ctrl+P转到上一个书签(书签用于标记位置),可以为快速查找的所有对象创建书签。视图-书签窗口。Ctrl+I渐进式搜索,Ctrl+Shift+I渐进式反向搜索,真的好强大呀!右击"工程"中打开菜单可以打开文件所在文件夹。Ctrl+Tab打开IDE导航器,快速查看并浏览所有打开的文件和工具窗口。删除空行使用正则表达式,有以下2种方法:把\n*\n替换为\n把^:b*$\n替换为空VB常见问题解决:安装VB6.0中文企业版后,保存中文工程时出现中文乱码请安装补丁程序。让开发环境支持鼠标滚轮下载一个动态库VisualBasic6mousewheel.exe,我的软件库里有。为何弹出”addthisprojecttosourcesafe?”当你安装过VisualSourceSafe,保存文件时就会自动弹出此框,主要是为了和其他人组成一个开发组开发软件,对个人用户的用处只在于保存所有修改过的版本。VB程序调用类文件方法先运行类文件所在的vbp文件,点击文件——生成*.dll,覆盖原dll文件。然后在主程序vbp中工程引用中添加该dll文件。语句End不是函数,是一条语句。可以单使用(结束整个应用程序)也可以和别的关键字配合使用,用来结束某个特定的过程.主要有以下几种用法:End停止执行。不是必要的,可以放在过程中的任何位置关闭代码执行、关闭以Open语句打开的文件并清除变量。EndFunction必要的,用于结束一个Function语句。EndIf必要的,用于结束一个If…Then…Else语句块。EndProperty必要的,用于结束一个PropertyLet、PropertyGet、或PropertySet过程。EndSelect必要的,用于结束一个SelectCase语句。EndSub必要的,用于结束一个Sub语句。EndType必要的,用于结束一个用户定义类型的定义(Type语句)。EndWith必要的,用于结束一个With语句。VB中1/2=0.5而VC中1/2=0。在默认情况下,VB是按ByRef传递参数的,在一般情况下ByVal方式要比ByRef传递参数快,但当你要传递比较大的字符串或数组时,ByRef方式就要比ByVal方式快,因为ByRef仅仅需要传递指向数据的四字节指针,而不是实际的数据.所以,在进行应用的时候,可以考虑实际情况进行处理,以便达到最佳的运行速度.长整型变量(Long)是VB中最快的变量类型.在做运算的时候,如果不是必须要保留小数,尽量避免使用浮点运算,因为整数运算不需要使用数字协处理器.尽量避免使用对象的属性代替常量进行运算,针对于任何对象属性的访问都会影响运算的速度.尽量使用动态数组,而避免使用静态数组,因为通过Erase方法可以清空动态数组中不需要的元素并释放出占用的内存,而对于静态数组,只能将数组中元素的内容清空,并不会释放数组元素所使用的内存符号!单精度Single#双精度Double&长整型Long%整型IntegerVB中定义数组会自动初始化,而VC中不会。VC++与C#大体相同,比如函数重载基础const关键字常量不允许更改值constinta=1;constintb=2;指向常量的指针不能改变常量值constint*c=a;c=&b;(*c++;是错误的)常量指针不能改变指向int*constd=a;对比:指向常量的指针可以改地址值而不可改对象值,常量指针可以改对象值而不可改地址值,指向常量的常量指针二者皆不可改。对于任何一个类,如果期望它被广泛使用,就应该把那些不修改类数据成员的成员函数声明为const成员函数。如:char*get_data()const{returndata;}不可将会改变数据成员的函数定义为常量成员函数,如voidwrite(charvalue)const{cursor++;}是错误的。如果一个类成员函数不会修改类成员变量的值,则声明定义时最后在其后加上const限定符。引用引用主要被用作函数的形式参数。字符(串)头文件:<string.h>是C标准库中的字符串处理函数的头文件如strcmpstrcat等等函数;<cstring>是与C标准库的<string.h>相对应的,但被加入到std名字空间的版本,是C++的组成部分,它可以说是把C的string.h的升级版,但它不是C的组成部分。所以如果你用的是C++,那么请用cstring,如果你用的是C请用string.h。string.h和C++中的string类是有很大区别的,<string>并非<string.h>的“升级版本”,他们是毫无关系的两个头文件。string是C++定义的std::string所使用的文件,是string类的头文件,属于STL范畴。它有很多对字符串操作的方法。一般一个C++库老的版本带“.h”扩展名的库文件,比如iostream.h,在新标准后的标准库中都有一个不带“.h”扩展名的相对应,区别除了后者有好多改进之外,还有一点就是后者的东东都塞进了“std”名字空间中。最后总结为:<string.h>是标准C头文件,对应的是基于char*的字符串处理函数,这类头文件的内容因为旧,不在名字空间std中;<cstring>是C++头文件,标准C头文件的升级版,这类头文件的内容在名字空间std中;<string>是C++string类的头文件,有很多对字符串操作的方法,这类头文件的内容在名字空间std中。在没有#include<string>此头文件时,无法输出使用string标志符定义的字符串,注意string类型变量的定义,比如strings1("test");即定义了一个字符串s1,它的值为test。等价于chars2[5]=”test”;可以首地址赋值s1=s2,但不可以s2=s1.2、strcpy:VC从2005版本开始,微软引入了一系列的安全加强的函数来增强CRT(C运行时),这里对应的是strcpy_s。_s意为safe的意思,同样的道理,strcat也是同样。因此要解决这个问题,我们可以用strcpy_s来替换strcpy,但是注意strcpy_s并非所有编译器都提供,因此如果要跨编译器,请采用错误信息中所提示的方式,定义_CRT_SECURE_NO_WARNINGS宏来掩耳盗铃吧。3、TCHAR、wchar_t、char:这个问题太普遍了,几乎所有的初学者都会遇到而且感到难以应付,因为按照提示使用(LPCWSTR)强制转型貌似并不能帮助我们解决问题,而且这个程序在VC6下面应该是没有任何问题的,问题的根本就是字符集问题,在VC6中,我们默认使用的是多字节字符集,而现在我们默认需要的是UNICODE字符集,简单的,我们把这个字符集改成多字节字符集这个问题就解决了。右键单击解决方案浏览器下面的项目,属性。但是我并不推荐大家这么做,因为让自己的程序适应各种字符集是我们写代码的人义不容辞的义务。我们把程序改成下面这样:#include<iostream>#include<Windows.h>#include<tchar.h>usingnamespacestd;intmain(){MessageBox(NULL,TEXT("你好HelloWorld!"),TEXT("Information"),0);MessageBox(NULL,_T("你好HelloWorld!"),_T("Information"),0);return0;}用两个宏TEXT或者_T都可以解决这个问题,它们两个并没有太大区别,也许区别在于前者是通过windows.h头文件引入的,而_T是通过tchar.h引入的,我推荐大家使用_T和tchar.h,因为tchar.h还帮助我们引入了其它一些很有用的宏,比如_tcscpy_s,这个宏在使用UNICODE字符集的时候被替换成wcscpy_s,在使用多字节字符集的使用被替换成strcpy_s。关于这部分的内容,请大家不要错过《Windows核心编程》的第二章(第四版或第五版都可以),以及《深入学习C++String2.1版》。它们都有提到。LPCSTR,Pointertoaconstantnull-terminatedstringof8-bitWindows(ANSI)characters.LPCTSTR,AnLPCWSTRifUNICODEisdefined,anLPCSTRotherwise._T,用于VC++.NET中定义通用字符串。有三个函数可以将字符串的内容转换为字符数组和Cstring1.data(),返回没有“\0”的字符串数组2,c_str(),返回有“\0”的字符串数组3,copy()string是c++标准库里面其中一个,封装了对字符串的操作把string转换为char*有3中方法:1.data如:stringstr="abc";char*p=str.data();2.c_str如:stringstr="gdfd";char*p=str.c_str();3.copy比如stringstr="hello";charp[40];str.copy(p,5,0);//这里5,代表复制几个字符,0代表复制的位置*(p+5)='\0';//要手动加上结束符cout<<p;示例程序:#include<iostream>#include<string>usingnamespacestd;intmain(){stringline;getline(cin,line);charstr[20];intsize=line.size();line.copy(str,line.size(),0);//charstr[20]="liuyanbo";charupper[20];for(inti=0;i<size;++i){//cout<<static_cast<char>(toupper(str[i]));upper[i]=static_cast<char>(toupper(str[i]));}upper[i]='\0';cout<<upper<<endl;return0;}CStringCString是一种很有用的数据类型。它们很大程度上简化了MFC中的许多操作,使得MFC在做字符串操作的时候方便了很多。CString位于头文件afx.h中。如果普通Window程序想用CString,需要设置工程属性/配置属性/常规/MFC/使用动态DLL。CString作用如下:对象连接多个CString对象的连接可以通过重载运算符+、+=实现。例如:CStringstr(_T("jizhuomi"));//str内容为"jizhuomi"str=_T("www")+str+_T("-");//str为"wwwjizhuomi-"str+=_T("com");//str为wwwjizhuomi-comCStringgray("Gray");CStringcat("Cat");CStringgraycat=gray+cat;//thengraycat="GrayCat"要比用下面的方法好得多:chargray[]="Gray";charcat[]="Cat";char*graycat=malloc(strlen(gray)+strlen(cat)+1);strcpy(graycat,gray);strcat(graycat,cat);2、格式化字符串与其用sprintf()函数或wsprintf()函数来格式化一个字符串,还不如用CString对象的Format()方法:CStrings;s.Format(_T("Thetotalis%d"),total);用这种方法的好处是你不用担心用来存放格式化后数据的缓冲区是否足够大,这些工作由CString类替你完成。3、CString类的构造函数CString类有很多构造函数,这里只介绍几个比较常用的:CString(constCString&stringSrc);将一个已经存在的CString对象stringSrc的内容拷贝到该CString对象。例如:CStringstr1(_T(jizhuomi));//将常量字符串拷贝到str1CStringstr2(str1);//将str1的内容拷贝到str2CString(LPCTSTRlpch,intnLength);将字符串lpch中的前nLength个字符拷贝到该CString对象。例如:CStringstr(_T("wwwjizhuomi"),3);//构造的字符串对象内容为"www"CString(TCHARch,intnLength=1);使用此函数构造的CString对象中将含有nLength个重复的ch字符。例如:CStringstr(_T('w'),3);//str为"www"4、CString类的大小写转换及顺序转换函数CString&MakeLower();将字符串中的所有大写字符转换为小写字符。CString&MakeUpper();将字符串中的所有小写字符转换为大写字符。CString&MakeReverse();将字符串中所有字符的顺序颠倒。例如:CStringstr(_T("JiZhuoMi"));str.MakeLower();//str为"jizhuomi"str.MakeUpper();//str为"JIZHUOMI"str.MakeReverse();//str为"IMOUHZIJ"6、CString对象的比较CString对象的比较可以通过==、!=、<;、>;、<=、>=等重载运算符实现,也可以使用Compare和CompareNoCase成员函数实现。intCompare(PCXSTRpsz)const;将该CString对象与psz字符串比较,如果相等则返回0,如果小于psz则返回值小于0,如果大于psz则返回值大于0。intCompareNoCase(PCXSTRpsz)constthrow();此函数与Compare功能类似,只是不区分大小写。例如:CStringstr1=_T("JiZhuoMi");CStringstr2=_T("jizhuomi");if(str1==str2){//因为str1、str2不相等,所以不执行下面的代码...}if(0==str1.CompareNoCase(str2)){//因为不区分大小写比较时,CompareNoCase函数返回0,所以执行下面的代码...}7、CString对象字符串的提取操作CStringLeft(intnCount)const;提取该字符串左边nCount个字符的子字符串,并返回一个包含这个子字符串的拷贝的CString对象。CStringRight(intnCount)const;提取该字符串右边nCount个字符的子字符串,并返回一个包含这个子字符串的拷贝的CString对象。CStringMid(intiFirst,intnCount)const;提取该字符串中以索引iFirst位置开始的nCount个字符组成的子字符串,并返回一个包含这个子字符串的拷贝的CString对象。CStringMid(intiFirst)const;提取该字符串中以索引iFirst位置开始直至字符串结尾的子字符串,并返回一个包含这个子字符串的拷贝的CString对象。例如:CStringstr1=_T("jizhuomi");CStringstr2=str1.Left⑶;//str2为"jiz"str2=str1.Right⑵;//str2为"mi"str2=str1.Mid(1,3);//str2为"izh"str2=str1.Mid⑸;//str2为"omi"8、CString对象字符串的查找操作intFind(PCXSTRpszSub,intiStart=0)constthrow();intFind(XCHARch,intiStart=0)constthrow();在CString对象字符串的iStart索引位置开始,查找子字符串pszSub或字符ch第一次出现的位置,如果没有找到则返回-1。intFindOneOf(PCXSTRpszCharSet)constthrow();查找pszCharSet字符串中的任意字符,返回第一次出现的位置,找不到则返回-1。intReverseFind(XCHARch)constthrow();从字符串末尾开始查找指定的字符ch,返回其位置,找不到则返回-1。这里要注意,尽管是从后向前查找,但是位置的索引还是要从开始算起。CStringstr=_T("jizhuomi");intnIndex1=str.Find(_T("zh"));//nIndex1的值为2intnIndex2=str.FindOneOf(_T("mui"));//nIndex2的值为1intnIndex3=str.ReverseFind(_T('i'));//nIndex3的值为79、CString类对象字符串的替换与删除intReplace(PCXSTRpszOld,PCXSTRpszNew);用字符串pszNew替换CString对象中的子字符串pszOld,返回替换的字符个数。intReplace(XCHARchOld,XCHARchNew);用字符chNew替换CString对象中的字符chOld,返回替换的字符个数。intDelete(intiIndex,intnCount=1);从字符串中删除iIndex位置开始的nCount个字符,返回删除操作后的字符串的长度。intRemove(XCHARchRemove);删除字符串中的所有由chRemove指定的字符,返回删除的字符个数。例如:CStringstr=_T("jizhuomi");intn1=str.Replace(_T('i'),_T('j'));//str为"jjzhuomj",n1为2intn2=str.Delete(1,2);//str为"jhuomj",n2为6intn3=str.Remove(_T('j'));//str为"ihuomi",n3为110、CString类的格式化字符串方法使用CString类的Format成员函数可以将int、short、long、float、double等数据类型格式化为字符串对象。void__cdeclFormat(PCXSTRpszFormat,[,argument]...);参数pszFormat为格式控制字符串;参数argument可选,为要格式化的数据,一般每个argument在pszFormat中都有对应的表示其类型的子字符串,int型的argument对应的应该是"%d",float型的应对应"%f",等等。例如:CStringstr;inta=1;floatb=2.3f;str.Format(_T("a=%d,b=%f"),a,b);//str为"a=1,b=2.300000"[1]11、类型转换把CString类型的数据转化成整数类型最简单的方法就是使用标准的字符串到整数转换例程。虽然通常你怀疑使用_atoi()函数是一个好的选择,它也很少会是一个正确的选择。如果你准备使用Unicode字符,你应该用_ttoi(),它在ANSI编码系统中被编译成_atoi(),而在Unicode编码系统中编译成_wtoi()。你也可以考虑使用_tcstoul()或者_tcstol(),它们都能把字符串转化成任意进制的长整数(如二进制、八进制、十进制或十六进制),不同点在于前者转化后的数据是无符号的(unsigned),而后者相反。看下面的例子:CStringhex=_T("FAB");CStringdecimal=_T("4011");ASSERT(_tcstoul(hex,0,16)==_ttoi(decimal));char*转换这是初学者使用CString时最常见的问题。有了C++的帮助,很多问题你不需要深入的去考虑它,直接拿来用就行了,但是如果你不能深入了解它的运行机制,又会有很多问题让你迷惑,特别是有些看起来没有问题的代码,却偏偏不能正常工作。比如,你会奇怪为什么不能写像下面这样的代码呢:CStringgraycat="Gray"+"Cat";或者这样:CStringgraycat("Gray"+"Cat");事实上,编译器将抱怨上面的这些尝试。为什么呢?因为针对CString和LPCTSTR数据类型的各种各样的组合,"+"运算符被定义成一个重载操作符。而不是两个LPCTSTR数据类型,它是底层数据类型。你不能对基本数据(如int、char或者char*)类型重载C++的运算符。你可以象下面这样做:CStringgraycat=CString("Gray")+CString("Cat");或者这样:CStringgraycat=CString("Gray")+"Cat";研究一番就会发现:"+"总是使用在至少有一个CString对象和一个LPCSTR的场合。注意,编写有Unicode意识的代码总是一件好事,比如:CStringgraycat=CString(_T("Gray"))+_T("Cat");这将使得你的代码可以直接移植。char*转化为CString你有一个char*类型的数据,或者说一个字符串。怎么样创建CString对象呢?这里有一些例子:char*p="Thisisatest";或者象下面这样更具有Unicode意识:TCHAR*p=_T("Thisisatest")或LPTSTRp=_T("Thisisatest");你可以使用下面任意一种写法:CStrings="Thisisatest";//8-bitonlyCStrings=_T("Thisisatest");//Unicode-awareCStrings("Thisisatest");//8-bitonlyCStrings(_T("Thisisatest"));//Unicode-awareCStrings=p;CStrings(p);用这些方法可以轻松将常量字符串或指针转换成CString。需要注意的是,字符的赋值总是被拷贝到CString对象中去的,所以你可以象下面这样操作:TCHAR*p=_T("Gray");CStrings(p);p=_T("Cat");s+=p;结果字符串肯定是"GrayCat"。格式化是一种把其它不是字符串类型的数据转化为CString类型的最常用技巧,比如,把一个整数转化成CString类型,可用如下方法:CStrings;s.Format(_T("%d"),total);CString和string的输出string是控制台程序所用,利用cout直接输出,CString是MFC程序所用,利用ofstream定义的fout直接输出。//ceshi.cpp:定义控制台应用程序的入口点。//此程序用于异于char、string、CString的输出异同#include"stdafx.h"#include<string>#include<iostream>#include<afx.h>#include<fstream>usingnamespacestd;int_tmain(intargc,_TCHAR*argv[]){ stringa("one");//定义字符串a,取值为one charb[6]="two"; //CStringsTest(a.c_str());//利用a赋值给sTest,等价于CStringsTest(_T("one")); CStringsTest(b);//利用b赋值给sTest,等价于CStringsTest(_T("two")); cout<<"a="<<a<<endl; cout<<"b="<<b<<endl; a=b; //将b字符数组赋给a字符串,不可串赋给数组。 cout<<"a=b="<<a<<endl; ofstreamOutToFile("c:\\test.txt"); wchar_t*chTest=newwchar_t[sTest.GetLength()+1];//动态申请空间,由于GetBuffer返回为wchar_t chTest=sTest.GetBuffer(0);//获取CString内容的地址,wchar_t为宽char型。 for(inti=0;i<sTest.GetLength();i++) { OutToFile<<(char)*(chTest+i); } sTest.ReleaseBuffer();//调用了GetBuffer后一定要调用ReleaseBuffer释放,否则会出现内存泄露 OutToFile.close(); cout<<"sTest的内容已输出至文件!"<<endl; cin>>a; return0;}CString,int,string,char*之间的转换1、转成CStringstring转CString——CString.format("%s",string.c_str());char*转CString——CString.format("%s",char*);int转CString——CString.format("%d",int);常见错误:strValue.Format(_T("%d"),pSlider->GetPos());可以用_T解决兼容。2、转成stringCString转string——strings(CString.GetBuffer());//GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.char转string——strings(char*);int转成string——除了用CString::Format,还有FormatV、sprintf和不需要借助于Afx的itoa3、转成char*string转char*——char*p=string.c_str();CString转char*——char*p=CString.GetBuffer(CString.GetLength()));或(LPCSTR)CStringstring.c_str()只能转换成constchar*,要转成char*这样写:stringmngName;chart[200];memset(t,0,200);strcpy(t,mngName.c_str());转成intCString转int——intint_change=atoi((LPCSTR)CString);string转int——atoi、_atoi_l、_wtoi_ltypedef有四个用途:1、定义一种类型的别名,而不只是简单的宏替换。用在旧的C的代码中(具体多旧没有查),帮助struct。以前的代码中,声明struct新对象时,必须要带上struct,即形式为:struct结构名对象名,如:structtagPOINT1{intx;inty;};structtagPOINT1p1;而在C++中,则可以直接写:结构名对象名,即:tagPOINT1p1;估计某人觉得经常多写一个struct太麻烦了,于是就发明了:typedefstructtagPOINT{intx;inty;}POINT;POINTp1;//这样就比原来的方式少写了一个struct,比较省事,尤其在大量使用的时候;2、用typedef来定义与平台无关的类型。当跨平台时,只要改下typedef本身就行,不用对其他源码做任何修改。标准库就广泛使用了这个技巧,比如size_t。另外,因为typedef是定义了一种类型的新别名,不是简单的字符串替换,所以它比宏来得稳健(虽然用宏有时也可以完成以上的用途)。易错点:1、typedef在语法上是一个存储类的关键字(如auto、extern、mutable、static、register等一样),虽然它并不真正影响对象的存储特性,如:typedefstaticintINT2;//不可行编译将失败,会提示“指定了一个以上的存储类”。2、typedefchar*pStr;charstring[4]="abc";constchar*p1=string;constpStrp2=string;p1++;p2++;以上代码中p2++出错了。这个问题再一次提醒我们:typedef和#define不同,它不是简单的文本替换。上述代码中constpStrp2并不等于constchar*p2。constpStrp2和constlongx本质上没有区别,都是对变量进行只读限制,只不过此处变量p2的数据类型是我们自己定义的而不是系统固有类型而已。因此,constpStrp2的含义是:限定数据类型为char*的变量p2为只读,因此p2++错误。数据结构指针if(ptr!=NULL) //用于判断指针有无值*ptr++;数组intnum[5];定义了一个数组,ptr=num;注意,num是数组名,存储的是数组的首地址,但它不是指针,不能num++之类的修改num存储的地址。指针强于数组名,因此ptr[3]等同于num[3]。&、*、[]是常见的运算符,都可以重载。num[3]等同于*(num+3)。动态数组利用new操作符可以操作堆(heap),生成动态数组。如cin>>num;int*ptr=newint[num];就定义了一个长度为num的整形动态数组。动态数组需要手动销毁,否则会发生内存泄漏(在停止或重新启动程序后这块内存才可再度被利用),为防止内存泄漏,可以利用delete[]ptr;(可将ptr数组全部销毁,若只是deleteptr;则只释放数组首元素)。在对指针使用delete后,指针可以赋值后继续使用。例如ptr=newint;*ptr=5;ptr=newint;执行之后第一次声明的动态变量所占的内存就无法访问、无法重用了。if(checks[capacity]!=0){Check*tempPtr=newCheck[capacity*2];for(inti=0;i<capacity;i++)tempPtr[i]=checks[i];delete[]checks;checks=tempPtr;capacity*=2;}以上代码实现了当动态数组用满时,将其大小加倍。栈stack栈就是一堆元素,last-infirst-out数据结构,每个元素都属于相同的类型,任何类型的元素都可用于栈(如字符串栈、浮点型栈、对象栈)。push、pop操作,peek函数获取某元素,使用前就先确认此栈不空。栈是最简单的数据结构,因此当拥有一个有关对象的栈时,不需要为这些对象重载运算符函数。栈的类模板在stack.h文件中。链表链表是一个项集合,其中的每个项是某节点的一部分,这个节点又包含到达其他节点的链接。在每一种情况下,从第一个节点开始跟踪,直到最后一个节点,定义了一个项的顺序排列。数组也定义了一组顺序排列的项,不过,在数组中,顺序组织由数组中的位置隐式提供。数组还支持通过索引随机访问,而链表不支持。链表节点及链接:typedefstructnode*link;structnode{Itemitem;linknext;};只要想使用一个新节点,就要创建一个node结构的实例,并为它保留内存,用linkx=malloc(sizeof*x);来引导stdlib.h中的malloc函数和sizeof运算符来节点保留足够的内存,并在x中返回一个指向它的指针。链接x用法:(*x).item和(*x).next,等同于x->item和x->next.链接与C指针之间的这种对应关系是必需的,但前者是一种抽象,后者是一种具体的表现形式。我们也可以用数组索引表达链接。删除节点x的下一个节点t,语句:t=x->next;x->next=t->next;free(t);或者更简单形式:x->next=x->next->next;在表中节点x之后位置插入节点t,语句:t->next=x->next;x->next=t;语句很容易理解(画图),插入和删除的简单性正是链表存在的理由。数组与链表恰好优势互补,链表不太适合于查找一个已知索引的项或者查找已知项之前的项。函数声明若定义在执行之后,则必须先声明。比如intThreeAdd(int,int,int);即为申明默认值函数使用默认值时intThreeAdd(int,int,int=2);即为第3个参数提供了默认值。游长变元表voidConnectData(inti,...)函数第一个参数为整型,其后使用3个句号定义可变参数,利用VS内部定义的va_arg获取多余的输入形参。函数模板template<classT>TAdd(Tone,Ttwo){returnone+two;}intmain(intargc,char*argv[]){doublei;i=Add(10.52,20.24);intm;m=Add(20,30);printf(“%f”,i);printf(“%d”,m);return0;}主函数win32的控制台程序,主函数不是intmain(),而是int_tmain(),头文件也不是<iostream.h>而是<stdafx.h>,"_t"是为了支持Unicode而准备的一个宏,_tmain是main为了支持unicode所使用的main的別名。而<stdafx.h>是用来预编译用的头文件,旨在减小文件的大小和减少编译的时间,这个<stdafx.h>中包括了<iostream.h>和<tchar.h>。_tmain的定义在<tchar.h>可以找到,如#define_tmainmain,则要加#include<tchar.h>才能用。因此_tmaincompile后仍为main,所以都可以执行。main是C/C++的标准入口函数名WinMain是windowsAPI窗体程序的入口函数。(intWINAPIWinMain())中WINAPI是__stdcall宏,在windef.h中定义的。_tmain_tWinMain是Unicode版本函数别名,对应与wmain和wWinMain。C语言的WindowsAPI编程,并不一定需要使用WinMain入口函数。如果不使用WinMain的四个参数,那么直接使用main代替WinMain就完全可以了。如果程序中使用了WinManin的某个参数,那么也可以用main替代,但是需要增加WinMain的四个参数作为变量。WinMain只要能使用windowsAPI的软件都支持,但用main就未必了。常用函数Sleep函数在C++语言中是非常重要并且非常常用的一个函数,它的作用为当程序执行到这个函数时,将暂停,然后到达条件后才继续执行,此处的条件为暂停的时间,即实参部分,单位是毫秒。(注:1秒=1000毫秒)。比如你的实参部分为100,即Sleep(1000);那么,当程序执行到这里是,将暂停1000毫秒,即一秒,然后才继续执行。#include<windows.h>//头文件类结构struct类似class而又比class简单,结构的对象可以赋值给同一结构的另一个对象,可以用结构传递参数。class比struct多了函数成员和封装性(即不可访问对象的数据成员),由class生成的每个对象都被认为与程序的其他部分是分离的。struct的定义比class多一个大括号后类定义构造函数等函数同C#,可以不定义使用默认的,但定义方式不同,方法可定义在类内部,也可定义在其后。一个类如果含有纯虚函数,则该类被称为抽象类,但不需要abstract修饰类名。纯虚函数定义:virtualvoidDrawShape()=0;其中等于0就表明它是一个纯虚函数。开发程序时,可以将某些类的共有的数据和方法封装成一个抽象类。在抽象类中声明公共的方法(纯虚方法),每一个从抽象类中派生的子类实现这些公共方法。这样,定义一个抽象类指针,将其指向不同的子类,在调用抽象类中的纯虚方法时,同样的语句可能实现不同的功能。主程序只跟对象的函数成员通信,由对象的函数成员与对象的数据成员通信。即对象的公用部分(函数成员)充当程序和对象的数据之间的接口,故称公用部分为类接口。使用公共接口比直接调用数据更慢一点,但却更安全、易修改的多。数据结构有时候可以加速数据的处理,但函数调用对速度的影响不值得考虑。类的每个函数都知道类定义中的数据成员,每定义1个类就编写一个对之测试的程序,确保类完全无误。类的定义文件.cpp文件和实现文件.cpp文件,还有主程序.cpp文件,所有cpp文件自动关联,所以无需#include我们类中声明变量而不在函数中声明变量的原因是对象总是可以记住类定义中的变量的值,即使对象的代码已经不再运行。利用operate关键字可以重载运算符,当左操作数不是类的对象,但是右操作数是类的对象时,函数原型直接定义在类定义的下面,反之则定义在类定义中。除了对赋值运算符=进行重载外,一般不为数据结构的类重载操作符。字符串实际上就是一个类,它有重载运算符[]函数,字符串也是一种抽象数据类型(abstractdatatype,ADT),不仅拥有数据,而且拥有函数。可以认为类一种抽象数据类型。C++比较特别的是支持多重继承,这有风险。classCDog{public: unsignedintm_Weight; unsignedintm_Age; CDog();//默认构造函数 CDog(intweight,intage);//自定义构造函数 ~CDog();析构函数};CDog::CDog(){ m_Age=1; m_Weight=2; printf("defaultfunctionwasinvoked\n");}CDog::CDog(intweight,intage){ m_Weight=weight; m_Age=age; printf("customfunctionwasinvoked\n");}CDog::~CDog(){}intmain(intargc,char*argv[]){ CDogmydog;//调用默认的构造函数 CDogcustomdog(3,20);//调用自定义的构造函数 return0;}类模板CWnd、CWindow的区别CWindow是ATl中封装的窗口类,没有ClassWizzard支持的。CWnd是MFC的封装有ClassWizzard支持。CWindow是在windowce平台上使用的,CWnd是mfc中所有窗口类的基类Windows应用程序肯有相对固定的基本结构,由入口函数WinMain、窗口(处理)函数WndPro构成基本框架,并包含各种数据类型,数据结构与函数等。WinMain函数有3个基本的组成部分:函数说明、初始化、和消息循环。利用GetMessage函数来从消息队列中读取一条消息,并将消息放在一个MSG结构对象中。窗口函数定义了应用程序对接收到不同消息的响应,其中包含了应用程序对各种可能接收到的消息的处理程序,是消息处理分支控制语句的集合(switch)。MessageBox()与afxMessageBoxMessageBox()是Win32API函数,afxMessageBox是MFC中的全局函数.在MFC中能用MessageBox()的地方都能用AfxMessageBox().AfxMessageBox比MessageBox方便,而MessageBox比AfxMessageBox灵活(如指定对话框标题等)!Afx开头的都是全局函数,也就是说AfxMessageBox可以用于任何程序;而MessageBox只能用在CWnd及其派生类中。MessageBox可以任意设置标题,其参数分别为内容、类型、帮助标识,而AfxMessageBox不能设置标题,其参数分别为内容、标题、类型,二者皆可只有第一个参数。AfxMessageBox的函数原型:intAfxMessageBox(LPCTSTRlpszText,UINTnType=MB_OK,UINTnIDHelp=0);intAFXAPIAfxMessageBox(UINTnIDPrompt,UINTnType=MB_OK,UINTnIDHelp=(UINT)–1);在第一种形式中,lpszText表示在消息框内部显示的文本,消息框的标题为应用程序的可执行文件名(如Hello)。在第二种形式中,nIDPrompt为要显示的文本字符串在字符串表中的ID。函数调用时会自动从字符串表中载入字符串并显示在消息框中。nType为消息框中显示的按钮风格和图标风格的组合,可以采用|(或)操作符组合各种风格。intMessageBox(LPCTSTRlpszText,LPCTSTRlpszCaption=NULL,UINTnType=MB_OK);参数:lpszText:消息正文lpszCaption:消息框标题(默认没有)nType:消息框的风格举例:AfxMessageBox("Areyousure?",MB_YESNO|MB_ICONQUESTION);inta=MessageBox("是否确认删除?","Warning!!",MB_YESNO|MB_ICONWARNING);if(a==IDYES)AfxMessageBox("Yes");elseAfxMessageBox("No");//MessageBox用法举例#include<Windows.h>MessageBox(NULL,_T("Hello!"),_T("警告"),MB_ICONWARNING);文件操作#include"stdafx.h"#include<iostream>#include<fstream>#include<Windows.h>usingnamespacestd;int_tmain(intargc,_TCHAR*argv[]){ ifstreamfin("in.txt"); ofstreamfout("out.txt"); doublea[100]={0}; inti=0; while(!fin.eof()) { fin>>a[i]; fout<<a[i++]<<""; } fin.close(); fout.close(); MessageBox(NULL,_T("示例用法"),_T("demo"),MB_OK); return0;}MFCMFC介绍MicrosoftFoundationClasses,是一个微软公司提供的类库(classlibraries),以C++类的形式封装了Windows的API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,MicrosoftVisualC++提供了相应的工具来完成这个工作:AppWizard可以用来生成初步的框架文件(代码和资源等),资源编辑器用于帮助直观地设计用户接口,ClassWizard用来协助添加代码到框架文件,最后,经过编译,通过类库实现了应用程序特定的逻辑。(Windows系统目录下的一系列mfc*.dll文件)常用控件作为一般窗口,控件具有通用的窗口属性。可以使用ShowWindwo、MoveWindow函数等窗口管理函数来显示或隐藏控件,改变控件的位置、尺寸。控件通过发送WM_COMMAND消息进行相关的通信,不同控件类型发送消息的通知代码是不一样的。C++的MFC控件大体同C#,但代码看起来比C#复杂一些,内部原理一样。ScrolllBar、ProgressCtrl、DateTimeCtrl.控件的成员变量有2种,一种是用来控制控件行为,称为control类型变量,control类型变量比value类型变量功能更强,另一种用来记录/显示控件内容,称为Value类型变量,多用于和用户有交互输入/输出的控件(比如编辑框控件)中。以下的使用的是control类型的成员变量:下面这个例子用了GetDlgItem、SetWindowText、AfxGetApp()等常用函数。voidCMyStaticDlg::OnOK(){ CStatic*static1=(CStatic*)GetDlgItem(IDC_STATIC1); static1->SetWindowText("明日科技"); }voidCMyStaticDlg::OnOk2(){ if(!IsWindow(m_Dynamic.m_hWnd))//m_Dynamic是在窗口类中定义的CStatic对象m_Dynamic.Create("欢迎您!",WS_CHILD,CRect(110,50,180,100),this,1525); m_Dynamic.ShowWindow(SW_SHOW); }voidCMyStaticDlg::OnOk3(){ CStatic*static2=(CStatic*)GetDlgItem(IDC_STATIC2); static2->ModifyStyle(0,SS_BITMAP);//修改按钮风格 static2->SetBitmap(LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP1)));//设置位图}voidCMyStaticDlg::OnOk4(){ CStatic*static3=(CStatic*)GetDlgItem(IDC_STATIC3); static3->ModifyStyle(0,SS_ICON);//修改按钮风格 static3->SetIcon(AfxGetApp()->LoadIcon(IDI_ICON1));//加载图标 }voidCMyStaticDlg::OnOk5(){ CStatic*static4=(CStatic*)GetDlgItem(IDC_STATIC4); static4->ModifyStyle(0,SS_NOTIFY);//修改按钮风格 }voidCMyStaticDlg::OnStatic4(){ CStatic*static4=(CStatic*)GetDlgItem(IDC_STATIC4); static4->SetWindowText(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论