VC++学习总结
- 格式:docx
- 大小:404.88 KB
- 文档页数:26
学习VC++的几点体会,供学弟学妹们参考VC++这门课呢,就2级考试及期末考试的要求而言,死记硬背的东西不多,难度其实不大。
对于我们初学者,因为它自成一派,所以需要细细积累品味它的一些约定俗成的逻辑运行方式。
学习过程中,平时上课注意留意细节。
老师讲的一些东西,要不厌其烦的听,课后再及时把老师讲的东西回顾一下(一大节课下来,回顾20分钟足以)。
论难度,定是比不上高数,大学物理的。
1.难点主要如下—(1)链表(无非最后一个节点next为0,删增节点时注意原前后节点的前后连接要抚平,例如加节点是原前后节点要先放手再牵手,把那要加的家伙手牵在中间。
(2)指针(用来操作地址)改变地址空间存放数值、+1或-1方便地指向数组上一个或下一个元素,再进行相应操作。
(3)虚基类(见第3点)。
(4)函数递归的执行—输出次序(倒过来),与逻辑上的反推次序一致。
(5)静态变量:在一个完整的函数中,依靠函数递归多次调用静态变量时,每次递归,初值都是用的上次操作所得的结果,区别于动态变量。
联系第(4)点,最后一次递归后,陆续输出前面递归中未输出的静态变量值,应该是什么呢???是不是一样的呢????2.基础—程序最基本的三个结构:(1)顺序,(2)选择(if-else及其嵌套,switch语句(什么样的数)以及从哪开始,到哪结束),(3)循环(while(),do……while,for()),个人认为这三个语句尤其重要、基本。
例如:char*p,a[50];p=a;While(p++);有什么妙用?例如:int n=5,s=0;while(n--);s+=++n;cout<<n<<’\t’<<s<<endle;分号的作用(S操作只做一次)使得答案:0 0。
这些细微之处,要注意积累,区别。
3.关于函数值调用,形参与实参的关系:值传递,地址传递,引用传递。
4.最后一大块是类,类的三大特性,类的成员组成:数据及函数,不再罗嗦。
vc++2010实验实训结果或结论VC++2010是微软推出的一款集成开发环境,主要用于C++程序的开发。
通过实验实训,我们对VC++2010进行了深入的学习和实践,掌握了其基本操作和功能,同时也对其在C++程序开发中的应用进行了探索和实践。
在实验实训过程中,我们获得了许多有价值的经验和知识,并得出了一些结论和结果。
首先,在实验实训中,我们深入了解了VC++2010的界面和功能。
VC++2010的界面清晰明了,功能丰富多样,包括代码编辑器、解决方案资源管理器、工具箱、属性窗口、输出窗口等。
我们学会了如何创建新项目、添加文件、编写代码、编译和运行程序等基本操作,也熟悉了VC++2010的各种工具和窗口的功能和用法。
其次,在实验实训中,我们掌握了VC++2010在C++程序开发中的应用。
我们通过实例分析和练习,学会了使用VC++2010进行C++程序的开发和调试。
我们编写了一些简单的C++程序,如Hello World程序、计算器程序、图形图像处理程序等,通过这些实践,我们深入了解了VC++2010在C++程序开发中的应用和技巧。
此外,在实验实训过程中,我们还发现了一些问题和解决了一些难点。
比如,在编写程序时遇到了一些错误和异常,我们通过调试和查阅资料,最终找到了解决方法。
我们还发现了一些VC++2010的一些特性和功能,如智能感知、代码重构、版本控制等,这些功能使得程序的开发和维护更加高效和便捷。
最后,通过实验实训,我们得出了一些结论和结果。
首先,VC++2010是一款功能强大、易用便捷的集成开发环境,适用于C++程序的开发。
其次,VC++2010在C++程序开发中具有丰富的功能和工具,包括代码编辑器、调试工具、版本控制等,能够满足程序开发的各种需求。
再次,通过实验实训,我们对VC++2010有了深入的了解和掌握,获得了宝贵的经验和知识,这将对我们今后的学习和工作有很大的帮助。
总之,通过VC++2010实验实训,我们对VC++2010有了全面的了解和掌握,对C++程序的开发也有了更深入的理解和实践。
VC学习笔记写在前面的话:1、VC代码量很大,且有很多是自动生成的,一个人很难做到精通每句代码的作用,不像C 语言那样整个代码可以自己写,而且也清楚每句代码的作用。
VC初学者要做的是知道在哪里添加代码,了解添加代码的作用,哪些代码可修改,哪些代码对应哪个模块。
2、C语言放眼望去,无非是各种流程控制语句,而VC放眼望去,是各种类和对象。
简单的说,类和对象的关系就像整型和整型变量的关系,例如C语言中的“int temp”,int相当于类,temp相当于对象。
我们不能直接操作类int,但是可以操作对象temp。
类只是一个概念、一组特征和行为的抽象的集合,只有将类实例化(定义一个对象)才可以使用。
3、如果遇到了奇怪的编译问题,可以先试下菜单栏的“组建——》清除”,然后再重新编译运行看看。
4、初学VC不建议抱一本书从头看到尾,你也看不下去,就算你看下去也忘了。
一门语言的学习方法不应该是这样的。
建议初学者从读代码改代码学起,每本书里都有实例,就从实例的代码读起,代码里遇到不懂的地方再去翻书查看相关知识点,根据自己的理解看看这样改一下行不行,自己能不能添加一部分类似的模块与代码。
代码读的多了,改的多了,自然就会写了。
写的多了,那么你就可以抱一本书从头读到尾,这时你才能真正理解书中的思想。
基础知识:1、【【“.”是一个运算符,用来访问类的成员,如A.B,调用对象A中的B方法。
】】2、3、如定义一个类“class CUser”,则其构造函数为:CUser (),析构函数为:~CUser () 。
4、VC中单冒号和双冒号的作用1.冒号(:)用法(1)表示机构内位域的定义(即该变量占几个bit空间)typedef struct _XXX{unsigned char a:4;unsigned char c;} ; XXX(2)构造函数后面的冒号起分割作用,是类给成员变量赋值的方法,初始化列表,更适用于成员变量的常量const型。
V C + + 报告一、学习心得通过Vc++的课程学习,我了解了Visual C++语言的基本知识,熟悉了用Visual C++ 编制应用软件的基本技能。
了解了Window编程一些基本概念和基本方法。
掌握了工程软件中所需要的常用功能的编制,如菜单、界面、窗口、图形、控件等。
了解了工程问题程序设计的基本思想和设计方法。
为以后的力学计算和开发实际工程软件打下了编程基础。
Visual C++语言的基本知识,具体来说,(1)菜单与函数,学会了建立框架和菜单,掌握函数的概念,能够建立函数和调用函数。
(2)对话框及其应用,掌握了通过对话框来实现数据的输入与输出,不同类之间实现数据传递。
(3)控制与命令,学会了应用控制与命令来实现程序的各种功能,了解了各种控件的功能,包括工具条,按钮,列表框,进度条,时间控制等;掌握了常用控件的使用方法;(4)图形,掌握了在Visual C++中字体的应用,颜色的选择,图形的绘制,位图的应用等等。
了解了Visual C++绘制图形的基本思想。
能够运用常用的绘图函数;等等编程对于自己来说还是比较陌生的,之前虽说学过java,但是没有实际电脑操作,学的内容比较抽象,难以理解。
Vc++的课程学习,让自己更深入的了解了编程,了解了程序。
编写程序是一件很麻烦的事,因为特别容易出错,出错后需要对照电脑的提示一项一项的来检查,更多的时候是不知道如何去修改。
所以编写程序特别的能磨炼人的性子,出错了不能着急,越着急反而就越解决不了问题。
当不理解或是不会用相关的函数或程序时,就需要我们去查资料,在网上查,在vc++相关书中查,锻炼了我们的学习能力。
Vc++的课程学习,又让我们多了一项技能。
学习了很多,收获了很多。
二、自编程序说明1、自编程序有三个功能,(1)实现在任意位置的集中力作用下,悬臂梁任意位置的挠度和自由端转角的求解。
(2)能够实现计算出的挠度和自由端转角的文本输出。
(3)直接绘制出在集中力作用下的悬臂梁的模型图。
关于VC的学习心得关于C++这门课,其实我自己在大一时就接触过,那时候接触的就是单纯的一些C++的基本语法规则,基本的编程规则,这学期老师又在课堂上将这些基础知识复习了一下,但是我们都有这样的困惑:课堂和教材的内容基本上都能接受和理解,但真要实际动手编写程序又感到脑袋一片空白而无从下手;其二,整个课程的所有内容好不容易学完了,但对编写实用化的程序,总感到眼花缭乱而无法下手,真个儿“欲起平之恨无力”。
以至于在很长一段时间里在我的内心里产生了一种学习C语言和C++的恐惧感,认为自己不是学C语言和C++的料,将来打死我也不会朝C语言和C++的方向发展.俗话说:万丈高楼起平地!C++虽然是与C语言的编程思想有着截然不同的套路,但是作为C语言的扩充,他的基础部分还是在C 语言.所以课下我又将C语言的基础部分知识自己熟悉了一遍,并将其与C++中的语法规则关键字的用法比较了一番,从最小的部分对两门语言进行了深入的学习。
本以为学习到这里我的C++深入学习之路已经完成了一大半,自己再学习一些算法什么的就可以结业,用这门语言去找一门好的工作了,但是我发现自己还是太天真了,就是掌握一些数据结构的算法就想去搞软件开发工作确实太天真了,下面想说的是这学期的学习重点了--面向对像的可视化集成编程系统。
于是我们就这样稀里糊涂的接受了MFC的编译开发,本以为这种开发也就是一些简单的C++,程序的编写,深入了解后发现这两者的差别其实很大的。
记得书上说过,Visual C++ 不仅仅是一个编译器。
它是一个全面的应用程序开发环境,使用它你充分利用具有面向对象特性的 C++ 来开发出专业级的 Windows 应用程序.为了能充分利用这些特性,你必须理解 C++ 程序设计语言。
掌握了C++,你就必须掌握 Microsoft 基本类库(MFC)的层次结构。
该层次结构包容了 Windows API 中的用户界面部分,并使你能够很容易地以面向对象的方式建立 Windows 应用程序。
VC学习经验谈一、VC是什么?学VC是学什么?首先VC是一个软件(IDE集成开发环境)(编译、编辑、调试)C和C++。
WindowsSDK(软件开发工具)VC的灵魂:MFC(微软基础类库)ATL(ActiveX模板类库)其他的SDK,如OpenGL,DirectX,ActiveMoive,DrawDib(WinG) VC是许许多多技术的综合,就好像少林72般绝技,一般在应用中学会其中很少一部分就够了。
我们的现在目的,其实不过是学一套少林长拳。
这套长拳应包括:1、养成一种严谨的软件开发习惯,熟悉软件工程的基本原则。
2、C语言基础3、C++最基本内容:类、继承性、封装性、多态性的概念4、如何用向导建立一个程序框架5、设计菜单6、设计工具条7、设计和使用对话框,熟悉最常用的对话框控件:按钮、静态文本、编辑框等8、知道怎样新建类、成员函数、成员变量、消息处理函数。
9、了解最常用的Windows消息:如WM_PAINT(重绘窗口),鼠标按下、弹起、移动,初始化对话框,等。
10、了解最简单的GDI(图形设备接口):写文字、画框、画点、画线、画圆,设置画笔、画刷。
11、熟悉最常用的MFC类:CWndCDocumentCViewCDCCDialogCWinAppCGdiObject及子类CString、CPoint、CRect、CSize等简单数据类型CFile以上提到的这些内容,是每个人都会用到的内容。
二、MFC简介上述主要内容都是与实际操作关系非常密切的,在此不可能讲清楚;而且,这些在一般的书里都会讲到。
我主要将最重要的MFC介绍一下。
MFC是对WindowsAPI的封装,大大简化了我们的工作;学VC主要就是要学MFC,大约有100多个类,但常用的也就二三十个。
应该象背4级单词一样将这些常用类搞懂;当然不要死记,要通过看帮助、看例子、动手练习来学会它们;而且,并非每个类的内部的所有函数都要学会,要日积月累。
vc 课程设计实验总结一、教学目标本课程的教学目标是使学生掌握VC课程的基本知识和技能,能够运用VC进行简单的程序设计。
具体目标如下:1.掌握C++语言的基本语法和数据类型。
2.理解函数的定义和调用。
3.掌握面向对象编程的基本概念,如类和对象、封装、继承和多态。
4.能够使用VC进行程序的编写、编译和调试。
5.能够运用面向对象编程思想解决实际问题。
情感态度价值观目标:1.培养学生对计算机科学的兴趣和热情。
2.培养学生解决问题的能力和团队合作精神。
二、教学内容根据课程目标,教学内容主要包括C++语言的基本语法和数据类型、函数的定义和调用、面向对象编程的基本概念。
具体安排如下:1.第一章:C++语言的基本语法和数据类型。
2.第二章:函数的定义和调用。
3.第三章:面向对象编程的基本概念。
教学过程中,将结合具体案例进行讲解和演示,使学生能够更好地理解和运用所学知识。
三、教学方法本课程采用讲授法、讨论法和实验法进行教学。
1.讲授法:通过讲解和示范,使学生掌握C++语言的基本语法和数据类型、函数的定义和调用、面向对象编程的基本概念。
2.讨论法:通过小组讨论,引导学生深入思考和理解编程问题。
3.实验法:通过上机实验,让学生动手编写和调试程序,培养学生的实际编程能力。
四、教学资源教学资源包括教材、实验设备和多媒体资料。
1.教材:选用《C++ Primer》作为主教材,辅助以《VC++程序设计》等参考书。
2.实验设备:为学生提供计算机实验室,配备有VC++编译器和调试器等开发工具。
3.多媒体资料:提供教学PPT、视频教程等资料,丰富学生的学习体验。
五、教学评估为了全面、客观地评估学生的学习成果,本课程采用以下评估方式:1.平时表现:通过课堂参与、提问、小组讨论等环节,评估学生的学习态度和积极性。
2.作业:布置适量的课后作业,评估学生对知识点的掌握情况和实际编程能力。
3.考试:进行期中和期末考试,全面测试学生的知识水平和应用能力。
学习c#心得范文(通用5篇)学习c#心得范文篇1学习总是无止境的,只有高度。
以前,总认为自己的C#基础还可以,因此就有点自以为是的样子;岂知自己学习到的不过一点皮毛而已。
这几天找了一些视频教程学习,看了一小部分后才知道什么是深度!自己是一个什么样的现状!如果将自己放在现在的这个圈子里面,那的确还算可以;但是,以后我面对的不单是现在的这些,而是更多的人,那才是最后的目的;因此,必须学会将眼光放长远一点,不要那样鼠目寸光。
同时,必须给自己选定一个未来的发展方向,选定方向后就要朝着这个方向发展,努力。
话题扯得有点远,回归正题!很多时候我总是想用最短的时间做最多的事情;因此,在做有些事情的时候就显得有点急功近利,总想很快将其做好,到头来我的收获是什么?通过这几天的学习,我始终提醒着自己一定不要急。
虽然,这几天学习的全都是以往的知识点,但是,我的收获却也还不小;特别是关于函数、字符串的相关知识点的学习;函数的重载,之所以可以进行重载操作,其主要原因是函数参数的不同,而不是函数的返回值不同;以及对字符串的操作……同时,更加的让我明白一个道理,作为一个程序员不单是会写程序,更重要的是动手能力;理论上的程序不一定就是可以达到目的的程序;因此,必须要敢于动手进行操作。
学习是无止境,只有学习的高度。
学习c#心得范文篇2最近一个星期将从图书馆借的《visual c# 20xx step by step》英文版看完了,是Microsoft Press 的,很权威。
由于是英文版,所以读起来很流畅,丝毫没有中文翻译书籍蹩脚的感觉。
下面说说我读这本书的感受,和我个人对c#的一点看法。
这本书是一本入门书籍,读这本书根本不需要什么基础知识,对编程一点都不懂的人也可以看,适合入门用。
但如果有一定的编程基础,特别是面向对象,或以前具有window native编程经验,或web编程经验,sql server经验,读起来就很快,我用了一个星期的时间,便读完了,将书中的练习都在自己的机器上实现了一遍。
vc知识总结-12009年08月03日星期一 00:37(1)当文档被修改时,如何在标题上加上标志'*'?重载CDocument类的虚函数virtual SetModifiedFlag:void CTest2Doc::SetModifiedFlag(BOOL bModified){CString strTitle = GetTitle();CString strDirtyFlag = " *"; // note space before the '*'// so we don't break Save As dialogif (!IsModified() && bModified){SetTitle(strTitle + strDirtyFlag);}else if ( IsModified() && !bModified ){int nTitleLength = strTitle.GetLength();int nDirtyLength = strDirtyFlag.GetLength();SetTitle( strTitle.Left(nTitleLength - nDirtyLength) );}UpdateFrameCounts();CDocument::SetModifiedFlag(bModified);}(2)VC6.0对VC5.0的兼容性?很不幸,vc6.0在调试模式对vc5.0不兼容,但发行模式没有问题.原因在微软改变了调试模式所用dll的格式,而保留了原文件名. 因此,不要在vc6.0中打开vc5.0的调试版本工程. (3)打印和打印机的问题?我碰到这么一个问题:在打印方法中使用了MM_LOMETRIC模式,在LOGFONT结构中改变了字体的大小,但不知道173(或者对于屏幕而言是25)是从哪来的,它是自动的.然而当我用另外一个打印机时173并不适合.我想知道的是:我如何对所有的打印来调整这个数字.我以前也碰到过类似的问题,我让用户改变字体(大小,颜色等等).这些改变在屏幕上看起来挺好,但是打印时太小(我的同事在程序包中加入一个放大类).原因非常简单:打印机的分辨率可能是300dpi,而屏幕的分辨率则低得多.我是这么解决的:在获得屏幕字体信息后,我获取屏幕字体的毫米级大小(使用LPtoDP,然后将模式变为MM_LOMETRIC,调用DPtoLP),接着对打印机设定了相同的模式,再调用LPtoDP.切换回原来的模式之后,我调用了DPtoLP,这样就得到了想要的字体高度和宽度. 在LOGFONT中使用这个值,并且带有其它诸如下划线,斜体等字体信息,我实现了用户的要求.(4)CRichEditCtrl滚动条的问题?我使用了CRichEditCtrl控制来显示某个文件中的数据(将该控制设置为只读).我已经设置了ES_MULTILINE | ES_AUTOVSCROLL,但当数据内容比控制显示多的时候,滚动条并不出现,是不是因为设置了只读属性而引起了其它的问题?ES_AUTOVSCROLL | ES_AUTOHSCROLL属性只在控制是可编辑时有效.你可心使用下面的滚动条风格来使滚动条出现:WS_VSCROLL | WS_HSCROLL,但是这样一来,不管你的数据量有多大,滚动条总是会出现.(5)从数据库中读大于32k的内容?我在从数据库中读数据时碰到了问题.当数据栏包含超过32k的内容时,我就读不出来,我试过ODBC::SQLGetData()也不行.哪种类型的数据库?MS SQL,SYBASE... 试试设置一下大小:BOOL CGetBlobStmt::Execute(LPCTSTR stmt){m_cbSize = 0;m_size = 0;LPBYTElpData;lpData = (LPBYTE)GlobalLock(m_hData);m_retcode = SQLSetStmtOption(GetHandle(),SQL_MAX_LENGTH,m_dwBytesLeft);m_retcode = SQLExecDirect(GetHandle(),(UCHAR*)stmt,SQL_NTS);if (m_retcode == SQL_SUCCESS){m_retcode = SQLFetch(GetHandle());if (m_retcode == SQL_SUCCESS ||m_retcode == SQL_SUCCESS_WITH_INFO){m_retcode = SQLGetData(GetHandle(),1,SQL_C_BINARY,lpData,254,&m_cbSize); while(m_retcode == SQL_SUCCESS_WITH_INFO){lpData+= 254;m_retcode = SQLGetData(GetHandle(),1,SQL_C_BINARY,lpData,254,&m_cbSize); }GetError();}}GlobalUnlock(m_hData);#if TESTDATATRACE("%ld",m_size);#endifSaveFile();return RETVALUE;}(6)如何获得CRichEditCtrl中字符的位置?我想在CRichEditCtrl中使用右键菜单,因此想判定光标处字符的位置,请指点.查看如下的帮助:IRichEditOleCallback::GetContextMenuEM_SETOLECALLBACK(7)如何限制mdi子框架最大化时的大小?用ptMaxTrackSize代替prMaxSize,如下所示:void CChildFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI){// TOD Add your message handler code here and/or call defaultCChildFrame::OnGetMinMaxInfo(lpMMI);lpMMI->ptMaxTrackSize.x = 300;lpMMI->ptMaxTrackSize.y = 400;}(8)如何切换视口而不破坏它们?我创建了一个带有静态分隔区的sdi应用程序,左边显示工作区,右过显示左边选取的东西.我想达到的是如果在分隔区之间进行切换,而不覆盖或破坏原来的CView对象.以下代码是你所想要的:class CExSplitterWnd : public CSplitterWnd{// Constructionpublic:CExSplitterWnd();// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CExSplitterWnd)//}}AFX_VIRTUAL// Implementationvirtual ~CExSplitterWnd();BOOL AttachView(CWnd* pView, int row, int col);BOOL DetachView(int row, int col);// Generated message map functions//{{AFX_MSG(CExSplitterWnd)// NOTE - the ClassWizard will add and remove member functions here.//}}AFX_MSGDECLARE_MESSAGE_MAP()};CExSplitterWnd::CExSplitterWnd(){}CExSplitterWnd::~CExSplitterWnd(){}BOOL CExSplitterWnd::AttachView(CWnd* pView, int row, int col){//Make sure the splitter window was createdif (!IsWindow(m_hWnd)){ASSERT(0);TRACE(_T("Create the splitter window before attaching windows to panes"));return (FALSE);}//Make sure the row and col indices are within boundsif (row >= GetRowCount() || col >= GetColumnCount()){ASSERT(0);return FALSE;}//Is the window to be attached a valid oneif (pView == NULL || (!IsWindow(pView->m_hWnd))){ASSERT(0);return FALSE;}pView->SetDlgCtrlID(IdFromRowCol(row, col));pView->SetParent(this);pView->ShowWindow(SW_SHOW);pView->UpdateWindow();return (TRUE);}BOOL CExSplitterWnd::DetachView(int row, int col){//Make sure the splitter window was createdif (!IsWindow(m_hWnd)){ASSERT(0);TRACE(_T("Create the splitter window before attaching windows to panes"));return (FALSE);}//Make sure the row and col indices are//within boundsif (row >= GetRowCount() || col >= GetColumnCount()){ASSERT(0);return FALSE;}CWnd* pWnd = GetPane(row, col);if (pWnd == NULL || (!IsWindow(pWnd->m_hWnd))){ASSERT(0);return FALSE;}pWnd->ShowWindow(SW_HIDE);pWnd->UpdateWindow();//Set the parent window handle to NULL so that this child window is not//destroyed when the parent (splitter) is destroyedpWnd->SetParent(NULL);return (TRUE);}(9)改变列表控制时发生闪烁现象?我创建了一个简单的对话框,在对话框中设置了一个列表控件,这个控件占用了对话框的全部客户区.对话框是可以改变大小的,因此我要保证列表控件在对话框中维持正确的位置,在对话框的ONSize()事件中我对列表控件使用了MoveWindow(),这起到了作用,但当用户改变对话框的大小时,列表控件不停地闪烁.要解决这个问题,在用MoveWindow之前,先用ShowWindow(SW_HIDE)隐藏列表控件,然后在MoveWindow之后用ShowWindow(SW_SHOW)来显示列表控件.(10)处理列表控件可见项的问题?我在一个列表控件中加入了好多条目.我通过获取某个条目是否可见或最后是哪个条目来进行处理.我看了CListCtrl::GetItem()的帮助,但是没有找到如何判断一个条目是否可见的方法.如果你只想处理可见的条目,你可以用GetTopIndex.它返回最大可见条目的索引值,然后你再用GetCountPerPage来得到在可见区域的条目数.(11)产生线程的问题?我在使用CreateThread时碰到了问题.我想让调用的函数和被调用的函数属于同一个类,结果在我调用CreateThread时得到如下错误:error C2440: 'type cast' : cannot convert from 'unsigned long (__stdcall Cdmi::*)(void *)' to 'unsigned long (__stdcall *)(void *)'方法一:(1)'unsigned long (__stdcall Cdmi::*)(void *)'是指向Cdmi某个成员函数的指针.(2)'unsigned long (__stdcall *)(void *)'仅仅只是一个c形式函数的指针. 编译器无法将(1)转换为(2)是因为c++成员函数取第一个(隐藏)参数"this pointer"作为成员函数,但当是一个静态的成员时则例外.可按如下方法解决.class XMyThread{public:void StartThread(void);virtual UINT ThreadFunction(void);static UINT __bogusthreadfunc(LPVOID lpparam);};void XMyThread::StartThread(){AfxBeginThread(__bogusthreadfunc,this);}UINT XMyThread::ThreadFunction(void){//here you do all your real workreturn 0;}UINT XMyThread::__bogusthreadfunc(LPVOID lpparam){XMyThread* This = dynamic_cast(lpparam);return This->ThreadFunction();}for the sake of clairty, I did not add StopThread and I did not save the CWinThread* returned by AfxBeginThread.If you wanted a thread that does other things, simply derive from XMyThread and override ThreadFunction()example:class XAnotherThread : public XMyThread{virtual UINT ThreadFunction(void);};UINT XAnotherThread :: ThreadFunction(void){//do some other work herereturn 0;}方法二:Cdmi::MonitorFiles()是个静态的成员函数.(12)CFile使用了缓冲区吗?请告诉我CFile到底有没有使用缓冲区来处理文件?CFile没有使用运行库的I/O缓冲例程,从这个意义上讲CFile并没有使用缓冲.但是有可能操作系统在处理文件时使用了缓冲区,如果你完全不需要缓冲区,你可以设置FILE_FLAG_NO_BUFFERING.CFile工作在这种模式下的唯一的方法是CFile::Attach(). (13)DAO的密码?我创建了一个使用数据库的mfc应用程序.用类模板生成CDaoRecordset直接打开数据库(不通过ODBC),但问题是我如何打开有密码保护的数据库?方法一:试试下面的代码:DAODBEngine* pDBEngine = AfxDaoGetEngine();ASSERT(pDBEngine != NULL);COleVariant varUserName (strUserName, VT_BSTRT);COleVariant varPassword (strPassword, VT_BSTRT);DAO_CHECK(pDBEngine->put_DefaultUser (V_BSTR(&varUserName));DAO_CHECK(pDBEngine->put_DefaultPassword (V_BSTR(&varPassword));方法二:你可以使用CDaoDatabase的Open方法来打开:MyDaoDatabase->Open("C:\MyDatabaseFile.mdb",FALSE,FALSE,";PWD=MyPassWord" );btw:不要忘了PWD=前面的;号.(14)如何知道CListBox什么时候滚动了?每次绘制列表框都要重绘某项,通过消息WM_CTLCOLOR从父窗口获得DC颜色.因此每欠列表框的滚动你都可以用WM_CTLCOLOR来检验是否滚动.HBRUSH CParentDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){// is the control _the_ list box we're interested in?if( nCtlColor == CTLCOLOR_LISTBOX &&pWnd->GetDlgCtrlID() == IDC_LIST ){// if the top index changed, the list box has been scrolledint iTop = ((CListBox*)pWnd)->GetTopIndex();if( iTop != m_iTopOld ){// keeps tracking of the top index changesm_iTopOld = iTop;// process scrolling...}}HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);return hbr;}使用这种方法可以不必为了实现这个功能而去产生一个继承类.(15)视口的不活动性如何处理?有什么方法使CListView成为类似WM_DIASBLED的风格,或者使它和背景色一致.方法一:你所要做的是处理CListView的WM_SETFOCUS消息,然后在TreeView中调用SetFocus,这样,ListView就永远不会获得焦点.afx_msg void CMyListView::OnSetFocus(CWnd* pOldWnd);{// assuming m_pwndTreeView points to the valid TreeView// on the left sidem_pwndTreeView->SetFocus();}方法二:重载PreTranslateMessage,然后当消息为WM_LBUTTONDOWN或WM_RBUTTONDOWN时返回真即可.(16)如何使用COleClientItem的IDispatch接口?我创建了一个如何使用COleClientItem对象,我想使用它的自动化方法.有什么方法来获得IDispatch的接口?我试过以CCmdTarget为基类的的GetIDispatch函数但却出错,我用过EnableAutomation和GetIDispatch,却什么也没得到.MSDN中有一篇关于这个的文章(TN039).如下的代码也可能是你所需要的:LPDISPATCH CMyClientItem::GetIDispatch(){ASSERT_VALID(this);ASSERT(m_lpObject != NULL);LPUNKNOWN lpUnk = m_lpObject;Run(); // must be runningLPOLELINK lpOleLink = NULL;if (m_lpObject->QueryInterface(IID_IOleLink,(LPVOID FAR*)&lpOleLink) == NOERROR){ASSERT(lpOleLink != NULL);lpUnk = NULL;if (lpOleLink->GetBoundSource(&lpUnk) != NOERROR){TRACE0("Warning: Link is not connected!\n");lpOleLink->Release();return NULL;}ASSERT(lpUnk != NULL);}LPDISPATCH lpDispatch = NULL;if (lpUnk->QueryInterface(IID_IDispatch, &lpDispatch)!= NOERROR){TRACE0("Warning: does not support IDispatch!\n");return NULL;}ASSERT(lpDispatch != NULL);return lpDispatch;}(17)关于用户自定义的消息使用?我写了一个基于MFC应用程序的对话框,在这个程序中,我创建了等待网络传输数据的线程,一旦该线程接收到数据,它就传送一个用户自定义的消息到对话框,使对话框知道有数据过来.但是为何在CMyDialog::PreTranslateMessage(MSG* pMsg)中能捕捉到WM_MYCMD这个消息,却不能和OnMyCommand相映射?将你所有自定义消息的基类设为WM_APP,而不是WM_USER.(18)在打开一个文档时退出?我有一个mdi程序,在打开文件的处理过程中,我想判断该文档是不是应用程序需要处理的文档,因此,我检测文档中的某个数字是否符合要求,如何在发现不是该文档时出现一个错误提示,然后不打开该文档?给文档设定某个标志,如果文档不是所要的就设定它.然后OnOpenDocument中检测,当发现标志被设定后返回FALSE.(19)在CListCtrl控件中多选择项的删除?如何从在CListCtrl中删除多个选择项?按如下方法处理:如果你的在CListCtrl是m_list,to_delete是个整数数组.i=3D0;POSITION pos=3Dm_list.GetFirstSelectedItemPosition();if(pos)while(pos)to_delete[i++]=3Dm_list.GetNextSelectedItem(pos);然后用删除保存在to_delete中的项目,用GetSelectedCount来得到已选项的个数.(20)工作线程的登录状态?我使用循环删除了用AfxBeginThread创建的线程的好几个实例.每个线程打开一个iNET连接,打开一个URL并返回结果.我需要找出哪一个或者何时这些线程进入到登录状态.按如下方法处理:(伪代码)// Start Threadsfor( unsigned u = 0; u < NUMBER_OF_THREADS; u++ ){ThreadHandleArray[ u ] = AfxBeginThread( ...... )->m_hThread;}DWORD count = NUMBER_OF_THREADSDWORD dwWait;while( count ){dwWait = ::WaitForMultipleObjects( count, ThreadHandleArray, FALSE,INFINITE );if( dwWait >= WAIT_OBJECT_0 && dwWait < ( WAIT_OBJECT_0 + count ) ){dwWait -= WAIT_OBJECT_0;// dwWait now has index to thread that completed do whateveryou want to do with it// set array back up for next waitif( dwWait != ( count - 1 ) )ThreadHandleArray[ dwWait ] = ThreadHandleArray[count - 1 ];count--;}}(21)如何增加视图中ActiveX控件的事件处理函数?如果我在对话框中加入微软的网络浏览器,很容易通过类模板加入对事件的处理.但我现在在视图中用m_pBrowser=new CWebBrowser2加入了网络浏览器,我该如何对事件进行处理?到(inet章节)去看看,有一篇文章名为"Building a Webbrowser in a Afternoon".如下的代码也可能是你所需要的:#include // For AFX_EVENT def.BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo){AFX_EVENT *pEvent = (AFX_EVENT *)pExtra;//If this is a control notification event.if (nCode == CN_EVENT){// If we have information on this event.if (pEvent){// Event DISPID is stored at pEvent->m_dispid// Event DISPPARAMS are stored at pEvent->m_pDispParams// Handle the event from here...}}return CWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);}(22)如何创建一个动态的Tree控件?我想创建一个动态的tree控件,就象弹出窗口一样,但它并不象想象中那么容易.方法一:用CreateWindow(SDK)创建风格为WS_POPUP,WS_CAPTION和WS_TICKFRAME的窗口,并作为父窗口.方法二:创建一个包含Tree控件的对话框.(23)SDI程序开始时不打开文档?我创建了一个SDI应用,但每次启动时它都会打开一个文档("untitled"),如何不让它打开该文档呢?看看InitInstance函数中有没有关于OnFileNew的调用,去掉它即可.(24)List控件中整栏选择?我在处理List控件时碰到了麻烦,我想创建一个ListView,来依据Tree控件的选择同时在ListView和ReportView中显示列表的信息.以下是相关的代码:// Set full line selectListView_SetExtendedListViewStyle(m_plstCustomers->GetSafeHwnd(),LVS_EX_FULLROWSELECT);按如下方法处理:// -------------------- begin of snippet --------------------------------bool CCommCtrlUtil32::ListCtrl_ModifyExtendedStyle(CListCtrl& p_rListCtrl,const DWORD p_dwStyleEx,const bool p_bAdd){HWND t_hWnd = p_rListCtrl.GetSafeHwnd();DWORD t_dwStyleEx = ListView_GetExtendedListViewStyle(t_hWnd);if(p_bAdd){if(0 == (p_dwStyleEx & t_dwStyleEx)){// add stylet_dwStyleEx |= p_dwStyleEx;}}else{if(0 != (p_dwStyleEx & t_dwStyleEx)){// remove stylet_dwStyleEx &= ~p_dwStyleEx;}}ListView_SetExtendedListViewStyle(t_hWnd, t_dwStyleEx);return true;}(25)如何重载MRU文件?我创建了一个应用程序可以载入图象文件,但当我点击FILE菜单下MRU文件列表时,却不能从磁盘载入以前曾经打开过的文件.下面是我所能想到的解决方案:(1)在文档类中定义一个成员函数(例如:CMyDoc::Reopen)来处理重新打开这个问题,指明参数和返回值.(2)产生一个CMultiDocTemplate的继承类(如CMyDocTemplate),定义一个构造函数,取和基类相同的参数,不做任何事,只是调用基类的构造函数.(3)重载MatchDocType:CMyDocTemplate::Confidence CMyDocTemplate::MatchDocType(LPCTSTR lpszPath,CDocument *&rpDocMatch){Confidence match = CMultiDocTemplate::MatchDocType(lpszPath, rpDocMatch);if(yesAlreadyOpen == match) // clear enough{ASSERT_KINDOF(CMyDoc, rpDocMatch);((CMyDoc *) rpDocMatch)->Reopen(/* your parameters */);// you can take any other actions here...}return match;}当这个函数返回"yesAlreadyOpen"时,你的文档框架将会被激活.26)CImageList控件中图象橙色被显示为黄色?我使用了一个CImageList控件来装入位图,用于TREE控件,其它的色彩都很正常就是橙色被显示成为黄色.你只能使用系统指定的20种颜色(橙色不包括在内);当然,你也可以用下面的方法来装载位图资源而不受颜色数的限制.HBITMAP LoadResourceBitmap(HINSTANCE hInstance, LPSTR lpString,HPALETTE FAR* lphPalette){HRSRC hRsrc;HGLOBAL hGlobal;HBITMAP hBitmapFinal = NULL;LPBITMAPINFOHEADER lpbi;HDC hdc;int iNumColors;if (hRsrc = ::FindResource(hInstance, lpString, RT_BITMAP)){hGlobal = ::LoadResource(hInstance, hRsrc);lpbi = (LPBITMAPINFOHEADER)LockResource(hGlobal);hdc = ::GetDC(NULL);*lphPalette = CreateDIBPalette ((LPBITMAPINFO)lpbi, &iNumColors);if (*lphPalette){::SelectPalette(hdc,*lphPalette,FALSE);::RealizePalette(hdc);}hBitmapFinal = ::CreateDIBitmap(hdc,(LPBITMAPINFOHEADER)lpbi,(LONG)CBM_INIT,(LPSTR)lpbi + lpbi->biSize + iNumColors * sizeof(RGBQUAD),(LPBITMAPINFO)lpbi,DIB_RGB_COLORS );::ReleaseDC(NULL,hdc);// ::UnlockResource(hGlobal);// ::FreeResource(hGlobal);}return (hBitmapFinal);}// internally used by LoadResourceBitmapHPALETTE CreateDIBPalette (LPBITMAPINFO lpbmi, LPINT lpiNumColors) {LPBITMAPINFOHEADER lpbi;LPLOGPALETTE lpPal;HANDLE hLogPal;HPALETTE hPal = NULL;int i;lpbi = (LPBITMAPINFOHEADER)lpbmi;if (lpbi->biBitCount <= 8)*lpiNumColors = (1 << lpbi->biBitCount);else*lpiNumColors = 0; // No palette needed for 24 BPP DIBif (lpbi->biClrUsed > 0)*lpiNumColors = lpbi->biClrUsed; // Use biClrUsedif (*lpiNumColors){hLogPal = GlobalAlloc (GHND, sizeof (LOGPALETTE) +sizeof (PALETTEENTRY) * (*lpiNumColors));lpPal = (LPLOGPALETTE) GlobalLock (hLogPal);lpPal->palVersion = 0x300;lpPal->palNumEntries = *lpiNumColors;for (i = 0; i < *lpiNumColors; i++){lpPal->palPalEntry.peRed = lpbmi->bmiColors.rgbRed;lpPal->palPalEntry.peGreen = lpbmi->bmiColors.rgbGreen;lpPal->palPalEntry.peBlue = lpbmi->bmiColors.rgbBlue;if (i<=10 || i>=246)lpPal->palPalEntry.peFlags = PC_NOCOLLAPSE;elselpPal->palPalEntry.peFlags = 0;}hPal = CreatePalette (lpPal);GlobalUnlock (hLogPal);GlobalFree (hLogPal);}return hPal;}该函数也重载了位图调色板,这个功能被CBitmap::LoadBitmap忽略了(它假定位图只使用20种颜色).因此要保证在DC中有SelectPalette和RealizePalette.(27)无法正确改变应用程序的图标?我有一个基于对话框的应用程序,在初始化时我使用了AfxGetApp()->LoadIcon(IDI_BRIEFCASE)来载入自己的图标,当把程序拷贝到桌面上时,图标是我所期望的.但在资源管理器中的图标却还是MFC的图标.资源管理器仅使用16x16的小图标,可能你在资源编辑器中只修改了32x32的标准图标.你需要重建16x16的小图标.vc知识总结-22009年08月03日星期一 00:39(28)工具条状态的问题?在应用程序中我创建了三个工具条,我想让它们在应用程序启动的时候排成一行正好在主菜单的下面,我该如何去做?在VC CDs上有一个例子:int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){//other stuff here...EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndToolBar,AFX_IDW_DOCKBAR_TOP);DockControlBarLeftOf(&m_wndListToolBar,&m_wndToolBar);return 0;}void CMainFrame::DockControlBarLeftOf(CToolBar* Bar,CToolBar* LeftOf){CRect rect;DWORD dw;UINT n;// get MFC to adjust the dimensions of all docked ToolBars// so that GetWindowRect will be accurateRecalcLayout();LeftOf->GetWindowRect(&rect);rect.OffsetRect(1,0);dw=LeftOf->GetBarStyle();n = 0;n = (dw & CBRS_ALIGN_TOP) ? AFX_IDW_DOCKBAR_TOP :n;n = (dw & CBRS_ALIGN_BOTTOM && n==0) ? AFX_IDW_DOCKBAR_BOTTOM :n;n = (dw & CBRS_ALIGN_LEFT && n==0) ? AFX_IDW_DOCKBAR_LEFT :n;n = (dw & CBRS_ALIGN_RIGHT && n==0) ? AFX_IDW_DOCKBAR_RIGHT :n;// When we take the default parameters on rect, DockControlBar will dock// each Toolbar on a seperate line. By calculating a rectangle, we in effect// are simulating a Toolbar being dragged to that location and docked.DockControlBar(Bar,n,&rect);}(29)在SDI应用程序中使用Active控件?我刚了解到如何在MFC应用程序中使用Active控件,文档上说只能在视图为CFormView和CDialog时使用,但要是其它的情况该怎么办呢?你可以在你应用程序的任何地方使用Active控件,而不仅仅局限于CFormView和CDialog 为视图基类的情况.DevStudio通过资源编辑器和对话框模板来使得在上述两个条件下使用Active控件更容易.因此,你也可以在任何视图中使用Active控件,条件是你直接操纵该控件,创建它并手工的布置好它的位置(这也是DevStudio为你所做的事).(30)有RichEdit控件的对话框无法正常显示?我在对话框中放置了一个RichEdit控件,但是对话框却无法正常显示.在你的应用程序InitInstance()中调用了::AfxInitRichEdit()吗?(31)DLL中的模板成员函数?在一个DLL中,我在自己创建的类中使用了模板成员函数来代替预处理宏.但出现以下错误: error C2664: 'double Data::extract(double &)' : cannot convert parameter 1from 'class CArray' to 'double &'为什么在匹配模板定义时它要寻找一个DOUBLE参数?我觉得你可能是在表达成员函数(内联)时出现了问题,请参照下面的示例:class AFX_EXT_CLASS Data : public CObject //This is not a template{public:Data();Data(BYTE * buffer,int size);templateData(const CArray& array);templateCArray& extract(CArray& array){CArchive ar(&buffer, CArchive::store);ar >> array;};double extract(double&);(...)private:CMemFile buffer;}(32)CFormView中的上下文帮助?我想在基于CFormView类的SDI应用程序中加入真正的上下文帮助,但没有成功.你应该重载CMyFormView类的OnHelpHitTest函数:LRESULT CMyFormView::OnHelpHitTest(WPARAM, LPARAM lParam){LRESULT lResult = (LRESULT)0x00;CWnd* pWndChild = ChildWindowFromPoint(CPoint(lParam),CWP_ALL|CWP_SKIPINVISIBLE);if (pWndChild && ::IsWindow(pWndChild->m_hWnd)){lResult = ::GetWindowLong(pWndChild->m_hWnd, GWL_ID);if (lResult)lResult += HID_BASE_COMMAND;}if (lResult == (LRESULT)0x00)lResult = ::GetWindowLong(m_hWnd, GWL_ID) + HID_BASE_RESOURCE;return lResult;}然后你就可以使用平时用的帮助文件了,但你要保证有正确的前缀,请参照TN028:Context-Sensitive Help Support.例如:ID_SOME_MENU_ITEM_OR_COMMAND_BUTTONIDR_SOME_WINDOW_OR_DIALOGIDP_PROMPTIDW_CONTROL_THAT_IS_NOT_A_COMAND_BUTTON你要确认你所使用的控件的ID包含在文件resource.hm中.(33)CArchive类的WriteObject函数问题?谁知道在使用CArchive类的WriteObject函数时,如何避免将类名写入文件吗? WriteObject函数不仅写入了类名,而且还写入PID(请查看TN02),如果你只想写进一个文本文件,并且你也想用串行化,你可以使用文件指针(用GetFile)来存储字符串.或者,你可以使用CFILE类来处理这个问题,如果是文本文件,你也可以用CStdioFile类.(34)RegisterWindowMessage中的BroadcastSystemMessage如何处理?我想用BroadcastSystemMessage来在两个进程之间通讯,我从一个进程发送了一个用RegisterWindowMessage注册过的消息,但在目的进程中却没有收到该消息.我认为你应该在两个进程的最高级窗口中都注册该消息.请看下例:static UINT sBroadcastCommand= ::RegisterWindowMessage( _T("BroadcastCommand"));BEGIN_MESSAGE_MAP( Gui_Top_Level_MainFrame, Gui_MainFrame ) ON_REGISTERED_MESSAGE( sBroadcastCommand, onBroadcastCommand ) END_MESSAGE_MAP()LRESULT Gui_MainFrame :: onBroadcastCommand( UINT aMsg, LPARAM lParam ) {your code...}然后发送进行应该包含:While the sending process would contain:static UINT sBroadcastCommand= ::RegisterWindowMessage( _T("BroadcastCommand"));void Someclass :: someMethod( void ){::PostMessage( (HWND)HWND_BROADCAST,sBroadcastCommand, 0,yourMessageId );}(35)CListCtrl中选择变化时如何获得通知?我在Report View中使用了一个CListCtrl(自绘制类型),我想知道什么时候选择项发生了改变.在选择项变化时,可以使用按钮有效或失效,按如下操作:加入LVN_ITEMCHANGED消息处理.void CYourClassNameHere::OnItemchangedEventList(NMHDR* pNMHDR, LRESULT* pResult){NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;*pResult = 0;if (pNMListView->uChanged == LVIF_STATE){if (pNMListView->uNewState)GetDlgItem(IDC_DELETE)->EnableWindow(TRUE);elseGetDlgItem(IDC_DELETE)->EnableWindow(FALSE);}(36)如何向ATL-COM对象传送一个数组?我想创建一个函数来向ATL-COM对象传送数组.如下代码的方法用于ACTIVEX中,可能对ATL-COM也有启发吧.CoInitialize(NULL);CLSID m_clsid;USES_CONVERSION;::CLSIDFromString(T2OLE("ROUNDANALOG.RoundAnlgAARCtrl.1"), &m_clsid); IDispatch FAR* pObj = (IDispatch FAR*)NULL;CString str = "UpdateControl";BSTR bstr = str.AllocSysString();HRESULT hr = CoCreateInstance(m_clsid, NULL, CLSCTX_ALL, IID_IDispatch, (void**)&pObj);SafeArrayAccessData(psa, (void**)&bstrArray);bstrArray[0] = str.AllocSysString();bstrArray[1] = str.AllocSysString();SafeArrayUnaccessData(psa);VARIANTARG* pvars = new VARIANTARG[1];VariantInit(&pvars[0]);pvars[0].vt = VT_ARRAY|VT_BYREF|VT_BSTR;pvars[0].pparray = &psa;DISPID dispid;hr = pObj->GetIDsOfNames(IID_NULL, &bstr, 1,LOCALE_USER_DEFAULT, &dispid); DISPPARAMS disp = {pvars, &dispid, 1,1};hr = pObj->Invoke(dispid, IID_NULL,LOCALE_USER_DEFAULT,DISPATCH_PROPERTYPUT,&disp,NULL, NULL, NULL); delete[] pvars;pObj->Release();CoUninitialize();在你的控制中建立如下并变量参考:void CRoundAnlgAARCtrl::SaveFunc(const VARIANT FAR& var){// TOD Add your dispatch handler code hereASSERT(var.vt == VT_ARRAY | VT_BYREF | VT_BSTR);SAFEARRAY* psa = *var.pparray;(37)如何选择CTreeCtrl中的节点文本进行编辑?在向CTreeCtrl中加入一项后,有什么方法可以编辑该节点的文本呢?首先设置你的CcompTreeCtrl具有TVS_EDITLABELS属性.在设计时用控件属性来设置在运行时用GetStyle()/SetStyle()成员函数来设置.然后请看下述代码:HTREEITEM CCompTreeCtrl::AddSet(){static int setCnt =3D 1;HTREEITEM hItem;CString csSet;//create text for new note: New Set 1, New Set 2 ...csSet.Format( _T( "New Set %d" ), setCnt++ );hItem =3D InsertItem( csSet, IMG_CLOSEDFOLDER, IMG_CLOSEDFOLDER );if( hItem !=3D NULL )EditLabel( hItem );return hItem;}(38)如何改变默认的光标形状?我试着将光标改变为其它的形状和颜色,但却没有变化.在对话框/窗口/你需要的地方加上对WM_SETCURSOR消息的处理.BOOL MyDialog::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message){// TOD Add your message handler code here and/or call default::SetCursor(AfxGetApp()->LoadCursor(IDC_MYCURSOR));return TRUE;//return CDialog::OnSetCursor(pWnd, nHitTest, message);}你没有成功的原因是因为窗口类光标风格不能为NULL.(39)如何用键盘滚动分割的视口?我的问题是当我用鼠标滚动分割窗口时,视口滚动都很正常,但用键盘时,却什么也没有发生.在你的视图继承类中加入如下两个函数,假定该类为CScrollerView:void CScrollerView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags){BOOL processed;for (unsigned int i=0;i< nRepCnt&&processed;i++)processed=KeyScroll(nChar);if (!processed)CScrollView::OnKeyDown(nChar, nRepCnt, nFlags);}BOOL CScrollerView::KeyScroll(UINT nChar){switch (nChar){case VK_UP:OnVScroll(SB_LINEUP,0,NULL);break;case VK_DOWN:OnVScroll(SB_LINEDOWN,0,NULL);break;case VK_LEFT:OnHScroll(SB_LINELEFT,0,NULL);break;case VK_RIGHT:OnHScroll(SB_LINERIGHT,0,NULL);break;case VK_HOME:OnHScroll(SB_LEFT,0,NULL);break;case VK_END:OnHScroll(SB_RIGHT,0,NULL);break;case VK_PRIOR:OnVScroll(SB_PAGEUP,0,NULL);break;case VK_NEXT:OnVScroll(SB_PAGEDOWN,0,NULL);break;default:return FALSE; // not for us// and let the default class// process it.}return TRUE;}(40)如何在线程中处理状态条?在我的应用程序CWnd的继承中有指针指向状态条,用pStatusBar->SetPaneText(0,status,TRUE)在状态条上显示一些文本都很正常.但在第二个线程中调用该函数却不行,出现hwnd警告.当你传送一个CWnd的指针到另外一个线程时,m_hWnd将为空.我的办法是用PostThreadMessage传送消息到状态条的父类,让它对状态条进行处理.(41)如何阻止WINDOWS关闭?我有一个应用程序会不停地工作.当该程序正常运行时,该如何避免用户关掉系统?是不是该用WM_QUERYENDSESSION.是的,在你的主框架窗口类中使用.// in the class headerafx_msg BOOL OnQueryEndSession( WPARAM wReserved, LPARAM lEndReason ); // in the Message MapON_MESSAGE( WM_QUERYENDSESSION, OnQueryEndSession )// in the class bodyBOOL CMainFrame::OnQueryEndSession( WPARAM wReserved, LPARAM lEndReason ){if( lEndReason =3D=3D ENDSESSION_LOGOFF ) {// user is logging offelse// Windows is going downreturn( bCanExit );}(42)如何使一个按钮Disable?我使用下面代码来Disable一个为ID_BUTTON的按钮,为什么会没有变化.GetDlgItem(IDC_BUTTON)->EnableWindow(FALSE);CWnd类中的EnableWindow函数用来Enable或Disable一个窗口类的对象,因为CButton 类继承于类CWnd,所以你可以使用来操作一个按钮.Enable一个基于窗口类的对象可以用以下代码:pWnd->EnableWindow(TRUE);Disable一个对象可用pWnd->EnableWindow(FALSE);其中pWnd为一个指向窗口对象的指针VC++中消息WM_ENABLE告诉窗口它正在Disable 或Enable,但它并不能使一个窗口Enable或Disable.(43)怎样从MFC扩展动态链结库(DLL)中显示一个对话框?我在过去的几天中试着在DLL中定义的函数中显示一个对话框,可是已经在DLL中定义好的对话框资源,在常规DLL调用时,我可以正常的显示出来,为什么在扩展DLL中同样的资源我却不能显示.当你在DLL中使用资源时,有些小细节需要注意,首先,在DLL运行时,必须保存DLL的实例,可以通过AfxInitExtensionModulestatic AFX_EXTENSION_MODULE extensionDLL;extern "C" int APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID) {if (dwReason == DLL_PROCESS_ATTACH){// Extension DLL one-time initializationif (!AfxInitExtensionModule(extensionDLL, hInstance))return false;}return(true);}然后,每次使用DLL资源时,你必须改变资源的句柄,使其指向DLL,并保存exe的资源,以便以后正确恢复void get_DLL_resource(void){/* this function changes the resource handle to that of the DLL *///这个函数改变资源句柄使其指向DLLif (resource_counter == 0){save_hInstance = AfxGetResourceHandle();AfxSetResourceHandle(extensionDLL.hModule);}resource_counter++;}接着你需要其它函数来恢复资源句柄void reset_DLL_resource(void){/* this function restores the resource handle set by'get_DLL_resource()' */if (resource_counter > 0)resource_counter--;if (resource_counter == 0)AfxSetResourceHandle(save_hInstance);}接下来一点非常重要,只要有可能就必须恢复资源句柄,否则,你将会遇到许多问题.原因是可执行文件必须重画工具条等等,比如说,如果用户移动DLL的对话框,如果资源句柄仍然为DLL 的资源,程序就崩溃了,我发现最好恢复句柄的时机在对话框的OnInitDialog()中,这时对话框的模板等已经读出了.(44)想隐藏用户界面怎么办?我编了一个小巧而有趣的工具,当用户使用时我不想让它显示出任何用户界面。
学习VC中所得的点点技术⼼得3(转)101 怎样取得程序⾃⼰占⽤的内存和CPU占⽤率:GetProcessMemoryInfo和GetPerformanceInfo102 如何让你的程序运⾏在release模式下:build->set active configuration103 监视⽂件夹是否被更新:FindFirstChangeNotification、FindNextChangeNotification、FindCloseChangeNotification这三个函数范例见:105 动态菜单:106 如何获取客户区的中⼼坐标:107 强⾏操作内存虚拟地址中某个指定地⽅的内容:---------------------------------------------- int *a=(int*)0x00440000; //这⾥以访问0x00440000地址为例cout<<*a<<endl;----------------------------------------------108 如何响应条码机: 条码扫描仪主要有三种接⼝: 1.RS232 2.共⽤接盘接⼝ B外设. 对于RS232,需要编程来监视和读取条码;对于共⽤接盘接⼝,条码信息被转换成相应的键盘消息,具有输⼊焦点的应⽤程序会收到键盘输⼊消息,我们以前的做法是做⼀个全局keyboard Hook或应⽤程序级别上 keyboard hook, 监视键盘消息,当有连续的键盘消息(在很短的时间内),并且这些键盘字符能构成完成的条码信息,就产⽣⼀条⾃定义消息,通知窗⼝(向监视程序注册的窗⼝)条码信息到达,条码机只是相当于⼀个键盘,所以你也可以在界⾯上放⼀个edit框,条码机读出条码后还会在字符串后⾯加⼀个回车(这个⼀般是可设置的,可加可不加),如果条码机⾃动加回车,则你重写OnOK函数,将edit框的内容取出放⼊list即可。
来源:/holybin/article/details/28403109或者:/phenixyf/article/details/41744039在C语言下,字符串的定义只能是char*或者char[100]数组的类型。
处理这些字符串的简便方法是用C语言库自带的字符串处理函数,这些函数有:3 4 5 6 7 8 910111213141516171819 #include<string.h> intmain(void){charstring[10];char*str1="abcdefghi"; strcpy(string,str1); printf("%s\n",string); return0;}12 3 4 5 6 7 8 9 10 #include<stdio.h>voidmain(){chardestination[25];char*blank="",*c="C++",*Borland="Borland"; strcpy(destination,Borland);strcat(destination,blank);strcat(destination,c);printf("%s\n",destination);strchr函数名:strchr功能: 在一个串中查找给定字符的第一个匹配之处\ 用法: char *strchr(char *str, char c);程序例:1 2 3 4 5 6 7 8 91011121314 #include<string.h>#include<stdio.h>intmain(void){charstring[15];char*ptr,c='r';strcpy(string,"Thisisastring");ptr=strchr(string,c);if(ptr)printf("Thecharacter%cisatposition:%d\n",c,ptr-string); elseprintf("Thecharacterwasnotfound\n");return0;}strcmp函数名:strcmp功能: 串比较用法: int strcmp(char *str1, char *str2);看Asic码,str1>str2,返回值> 0;两串相等,返回0 程序例:1 2 3 4 5 6 7 8 9101112 #include<string.h>#include<stdio.h>intmain(void){char*buf1="aaa",*buf2="bbb",*buf3="ccc"; intptr;ptr=strcmp(buf2,buf1);if(ptr>0)printf("buffer2isgreaterthanbuffer1\n"); elseprintf("buffer2islessthanbuffer1\n");ptr=strcmp(buf2,buf3);131415161718 if(ptr>0)printf("buffer2isgreaterthanbuffer3\n"); elseprintf("buffer2islessthanbuffer3\n"); return0;}strnicmp函数名:strnicmp功能: 将一个串中的一部分与另一个串比较, 不管大小写用法: int strnicmp(char *str1, char *str2, unsigned maxlen);程序例:1 2 3 4 5 6 7 8 9101112131415 #include<string.h>#include<stdio.h>intmain(void){char*buf1="BBB",*buf2="bbb";intptr;ptr=strnicmp(buf2,buf1);if(ptr>0)printf("buffer2isgreaterthanbuffer1\n"); if(ptr<0)printf("buffer2islessthanbuffer1\n");if(ptr==0)printf("buffer2equalsbuffer1\n");return0;}strlen函数名:strlen功能: strlen函数求的是字符串的长度,它求得方法是从字符串的首地址开始到遇到第一个'\0'停止计数,如果你只定义没有给它赋初值,这个结果是不定的,它会从字符串首地址一直记下去,直到遇到'\0'才会停止。
原型:size_tstrlen(const char *s);1 2 3 4 5 6 #include<stdio.h>#include<string.h> intmain(){inti=0;char*he="Hello,world";7 8 9 10i=strlen(he);printf("字符串长度为%d\n",i); return0;}运行结果:字符串长度为11strcspn函数名:strcspn功能: 在串中查找第一个给定字符集内容的段用法: int strcspn(char *str1, char *str2);程序例:1 2 3 4 5 6 7 8 91011 #include<stdio.h>#include<string.h>{intmain(void)char*string1="1234567890";char*string2="747DC8";intlength;length=strcspn(string1,string2);printf("Characterwherestringsintersectisatposition%d\n",length); return0;}strdup函数名:strdup功能: 将串拷贝到新建的位置处用法: char *strdup(char *str);程序例:1 2 3 4 5 6 7 8 91011 #include<stdio.h>#include<string.h>#include<alloc.h>intmain(void){char*dup_str,*string="abcde";131415161718192021 dup_str=strdup(string); printf("%s\n",dup_str); free(dup_str);return0;}stricmp函数名:stricmp功能: 以大小写不敏感方式比较两个串用法: int stricmp(char *str1, char *str2);程序例:1 2 3 4 5 6 7 8 9101112131415 #include<string.h>#include<stdio.h>intmain(void){char*buf1="BBB",*buf2="bbb";intptr;ptr=stricmp(buf2,buf1);if(ptr>0)printf("buffer2isgreaterthanbuffer1\n"); if(ptr<0)printf("buffer2islessthanbuffer1\n");if(ptr==0)printf("buffer2equalsbuffer1\n");return0;}12 3 #include<errno.h> intmain(void)5 6 7 8 9 char*buffer;buffer=strerror(errno); printf("Error:%s\n",buffer); return0;}strcmpi函数名:strcmpi功能: 将一个串与另一个比较, 不管大小写用法: int strcmpi(char *str1, char *str2);程序例:1 2 3 4 5 6 7 8 9101112131415 #include<string.h>#include<stdio.h>intmain(void){char*buf1="BBB",*buf2="bbb";intptr;ptr=strcmpi(buf2,buf1);if(ptr>0)printf("buffer2isgreaterthanbuffer1\n"); if(ptr<0)printf("buffer2islessthanbuffer1\n");if(ptr==0)printf("buffer2equalsbuffer1\n");return0;}strncmp函数名:strncmp功能: 串比较用法: int strncmp(char *str1, char *str2, int maxlen);程序例:1 2 3 4 5 6 7 #include<string.h>#include<stdio.h>intmain(void){char*buf1="aaabbb",*buf2="bbbccc",*buf3="ccc"; intptr;8 910111213141516171819202122 ptr=strncmp(buf2,buf1,3);if(ptr>0)printf("buffer2isgreaterthanbuffer1\n"); elseprintf("buffer2islessthanbuffer1\n");ptr=strncmp(buf2,buf3,3);if(ptr>0)printf("buffer2isgreaterthanbuffer3\n"); elseprintf("buffer2islessthanbuffer3\n"); return0;}strncpy函数名:strncpy功能: 串拷贝用法: char *strncpy(char *destin, char *source, int maxlen);程序例:1 2 3 4 5 6 7 8 91011 #include<stdio.h>#include<string.h> intmain(void){charstring[10];char*str1="abcdefghi"; strncpy(string,str1,3); string[3]='\0';printf("%s\n",string); return0;}strnicmp函数名:strnicmp功能: 不注重大小写地比较两个串用法: int strnicmp(char *str1, char *str2, unsigned maxlen);程序例:1 2 #include<string.h> #include<stdio.h>3 4 5 6 7 8 9101112131415 intmain(void){char*buf1="BBBccc",*buf2="bbbccc"; intptr;ptr=strnicmp(buf2,buf1,3);if(ptr>0)printf("buffer2isgreaterthanbuffer1\n"); if(ptr<0)printf("buffer2islessthanbuffer1\n");if(ptr==0)printf("buffer2equalsbuffer1\n");return0;}strnset函数名:strnset功能: 将一个字符串前n个字符都设为指定字符用法: char *strnset(char *str, char ch, unsigned n);程序例:1 2 3 4 5 6 7 8 91011 #include<stdio.h>#include<string.h>intmain(void){char*string="abcdefghijklmnopqrstuvwxyz"; charletter='x';printf("stringbeforestrnset:%s\n",string); strnset(string,letter,13);printf("stringafterstrnset:%s\n",string); return0;}strpbrk函数名:strpbrk功能: 在串中查找给定字符集中的字符用法: char *strpbrk(char *str1, char *str2);程序例:1 2 3 4 #include<stdio.h> #include<string.h> intmain(void){5 6 7 8 91011121314 char*string1="abcdefghijklmnopqrstuvwxyz";char*string2="onm";char*ptr;ptr=strpbrk(string1,string2);if(ptr)printf("strpbrkfoundfirstcharacter:%c\n",*ptr); elseprintf("strpbrkdidn'tfindcharacterinset\n"); return0;}strrchr函数名:strrchr功能: 在串中查找指定字符的最后一个出现用法: char *strrchr(char *str, char c);程序例:1 2 3 4 5 6 7 8 91011121314 #include<string.h>#include<stdio.h>intmain(void){charstring[15];char*ptr,c='r';strcpy(string,"Thisisastring");ptr=strrchr(string,c);if(ptr)printf("Thecharacter%cisatposition:%d\n",c,ptr-string); elseprintf("Thecharacterwasnotfound\n");return0;}strrev函数名:strrev功能: 串倒转用法: char *strrev(char *str);程序例:1 2 3 4 #include<string.h> #include<stdio.h> intmain(void){5 6 7 8 9 10 char*forward="string";printf("Beforestrrev():%s\n",forward); strrev(forward);printf("Afterstrrev():%s\n",forward); return0;}strspn函数名:strspn功能: 在串中查找指定字符集的子集的第一次出现用法: int strspn(char *str1, char *str2);程序例:1 2 3 4 5 6 7 8 9101112 #include<stdio.h>#include<string.h>#include<alloc.h>intmain(void){char*string1="1234567890";char*string2="123DC8";intlength;length=strspn(string1,string2);printf("Characterwherestringsdifferisatposition%d\n",length); return0;}strstr函数名:strstr功能: 在串中查找指定字符串的第一次出现用法: char *strstr(char *str1, char *str2);程序例:1 2 3 4 5 6 7 8 9 #include<stdio.h>#include<string.h>intmain(void){char*str1="BorlandInternational",*str2="nation",*ptr; ptr=strstr(str1,str2);printf("Thesubstringis:%s\n",ptr);return0;}strtod函数名: strtod功能: 将字符串转换为double型值用法: double strtod(char *str, char **endptr);程序例:1 2 3 4 5 6 7 8 9101112 #include<stdio.h>#include<stdlib.h>intmain(void){charinput[80],*endptr;doublevalue;printf("Enterafloatingpointnumber:");gets(input);value=strtod(input,&endptr);printf("Thestringis%sthenumberis%lf\n",input,value); return0;}strtok函数名:strtok功能: 查找由在第二个串中指定的分界符分隔开的单词用法: char *strtok(char *str1, char *str2);程序例:1 2 3 4 5 6 7 8 91011121314151617 #include<string.h>#include<stdio.h>intmain(void){charinput[16]="abc,d";char*p;/*strtokplacesaNULLterminator infrontofthetoken,iffound*/p=strtok(input,",");if(p)printf("%s\n",p);/*AsecondcalltostrtokusingaNULL asthefirstparameterreturnsapointer tothecharacterfollowingthetoken*/18192021 p=strtok(NULL,",");if(p)printf("%s\n",p); return0;}strtol函数名:strtol功能: 将串转换为长整数用法: long strtol(char *str, char **endptr, int base);程序例:1 2 3 4 5 6 7 8 910111213 #include<stdlib.h>#include<stdio.h>intmain(void){char*string="87654321",*endptr; longlnumber;/*strtolconvertsstringtolonginteger*/lnumber=strtol(string,&endptr,10);printf("string=%slong=%ld\n",string,lnumber); return0;}strupr函数名:strupr功能: 将串中的小写字母转换为大写字母用法: char *strupr(char *str);程序例:1 2 3 4 5 6 7 8 91011 #include<stdio.h>#include<string.h>intmain(void){charstring[]="abcdefghijklmnopqrstuvwxyz",*ptr;//定义为数组才能修改/*convertsstringtouppercasecharacters*/ptr=strupr(string);printf("%s\n",ptr);return0;12 }swab函数名: swab功能: 交换字节用法: void swab (char *from, char *to, int nbytes);程序例:1 2 3 4 5 6 7 8 910111213#include<stdlib.h>#include<stdio.h>#include<string.h>charsource[15]="rFnakoBlrnad";chartarget[15];intmain(void){swab(source,target,strlen(source));printf("Thisistarget:%s\n",target);return0;}原型:extern char *strstr(char *haystack, char *needle);*所在头文件:#include <string.h>*功能:从字符串haystack中寻找needle第一次出现的位置(不比较结束符NULL)。