MFC在VC里的用途

在VC++6.0中,用MFC向导创建一个单文档的工程后,它的窗口创建的代码在哪个文件里?
在VC++6.0中,用MFC向导创建一个单文档的工程后,它的窗口创建的代码在哪个文件里? 30
也就是说窗口的注册之类的代码在哪?还有,关于状态栏的代码在哪?还有个问题,就是按大小写转换键时,状态栏会出现“大写”,那响应“大小写转换键”的代码又在哪?我在所有文件里搜索“大写”这两个字,找到了唯一的一个定义的地方,把它删除后,按大小写转换键仍在状态栏出现“大写”,为什么?
窗口的注册类被MFC程序隐藏了,你在你的文件查找根本就查不到winmaim函数,但是会发现有一个_twinmain函数,其实就是winmain函数了,MFC把这些底层代码封装了。状态栏的代码在框架类里面,有cMainFrame这个头文件里面,会发现有这个代码,CStatusBar& m_wndStatusBar,&CToolBar&&& m_wndToolB前者就是状态栏对象,后者是工具栏对象,然后点开CMainFrame构造函数,有一个静态数组
static UINT indicators[] ={&ID_SEPARATOR,&ID_INDICATOR_CAPS,&ID_INDICATOR_NUM,&ID_INDICATOR_SCRL,};这些ID号就是你单文档程序里面对应的实例,大小写用ID_INDICATOR_CAPS,标示,打开你的Resource View,然后单击String Table,在单击字符串表,就可以发现上面这些id的资源标识了。
可以在你的CMainFrame的OnCreate函数下发现下面这段代码,
&if (!m_wndStatusBar.Create(this) ||&&!m_wndStatusBar.SetIndicators(indicators,&&& sizeof(indicators)/sizeof(UINT)))&{&&TRACE0("Failed to create status bar\n");&&return -1;&&&&& // fail to create&}
这个就是状态栏的创建了,当然 这里还有工具栏的创建。
其他回答 (1)
Microsoft Visual C++  
一、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类:   CWnd   CDocument   CView   CDC   CDialog   CWinApp   CGdiObject及子类   CString、CPoint、CRect、CSize等简单数据类型   CFile   以上提到的这些内容,是每个人都会用到的内容。    二.MFC简介  上述主要内容都是与实际操作关系非常密切的,在此不可能讲清楚;而且,这些在一般的书里都会讲到。我主要将最重要的MFC介绍一下。   MFC是对WindowsAPI的封装,大大简化了我们的工作;学VC主要就是要学MFC,大约有100多个类,但常用的也就二三十个。应该象背4级单词一样将这些常用类搞懂;当然不要死记,要通过看帮助、看例子、动手练习来学会它们;而且,并非每个类的内部的所有函数都要学会,要日积月累。如果真的想成为高手,做个笔记本把自己认为重要的类、函数记下来,随时学习,也是很好的突击方法。   下面介绍最重要的MFC。   CWnd:窗口,它是大多数“看得见的东西”的父类(Windows里几乎所有看得见的东西都是一个窗口,大窗口里有许多小窗口),比如视图CView、框架窗口CFrameWnd、工具条CToolBar、对话框CDialog、按钮CButton,一个例外是菜单(CMenu)不是从窗口派生的。该类很大,一开始也不必学,知道就行了。   CDocument文档,负责内存数据与磁盘的交互。最重要的是OnOpenDocument(读入),OnSaveDocument(写盘),Serialize(读写)   CView视图,负责内存数据与用户的交互。包括数据的显示、用户操作的响应(如菜单的选取、鼠标的响应)。最重要的是OnDraw(重画窗口),通常用CWnd::Invalidate()来启动它。另外,它通过消息映射表处理菜单、工具条、快捷键和其他用户消息。你自己的许多功能都要加在里面,你打交道最多的就是它。   CDC设备文本。无论是显示器还是打印机,都是画图给用户看。这图就抽象为CDC。CDC与其他GDI(图形设备接口)一起,完成文字和图形、图像的显示工作。把CDC想象成一张纸,每个窗口都有一个CDC相联系,负责画窗口。CDC有个常用子类CClientDC(窗口客户区),画图通常通过CClientDC完成。   CDialog对话框   CWinApp应用程序类。似于C中的main函数,是程序执行的入口和管理者,负责程序建立、消灭,主窗口和文档模板的建立。最常用函数InitInstance():初始化。   CGdiObject及子类,用于向设备文本画图。它们都需要在使用前选进DC。   CPen笔,画线   CBrush刷子,填充   CFont字体,控制文字输出的字体   CBitmap位图   CPalette调色板   CRgn区域,指定一块区域可以用于做特殊处理。   CFile文件。最重要的不外是Open(打开),Read(读入),Write(写)   CString字符串。封装了C中的字符数组,非常实用。   CPoint点,就是(x,y)对   CRect矩形,就是(left,top,right,bottom)   CSize大小,就是(cx,cy)对(宽、高)    三、用好MSDN和例子  作为提高,推荐看的例子有:   nHello最简单的程序框架   nScribble鼠标绘图。教程:编程基础,GDI   nDiblook图像处理最简单范例   nMFCIE因特网浏览器   nEnroll数据库   nDaoviewDao(数据访问对象)范例。树型和列视控件   nCubeOpenGL范例,画一个不断旋转的方块   nHierSvrOLE服务器   nOclientOLE包容器   nDrawcli鼠标绘图。也包括OLE。   nWordPad写字板。OLE    四.几点经验  A.为什么要用Windows而不是DOS编程   Windows编程并不比DOS编程难很多,只是在刚刚接触的时候感到头绪繁多,不知从何下手。实际上,如果你会C语言,你会发现Windows编程的难度并不比当年学C语言时大。DOS编程要想成为高手,也需要学习几百个函数(无论是TC、BC、MicrosoftC),并要深入了解汇编语言级的DOS功能调用。而现在在Windows下,付出相同的工作量,你却可以获得几倍的收益。如果你以前熟悉DOS编程,现在再搞Windows编程,只要两个星期肯定会感到巨大的优越性:在DOS下,每一件事都要自己干,而且还有64K内存、显示精度等的限制,实在是事倍功半了。   B.为什么要用VC而不是其他Windows编程语言   &大多数大型软件(包括Windows自己)都是用C、C++编的,所以可以利用的源代码特别多。例如Photoshop,就有VC的编程接口。的其他的语言都不如VC有历史优势。而且VC的开发工具特别多,从控件公司到硬件开发商,其产品很少敢不提供VC接口的。   &VC适合组织大工程(VB就不行)   &BorlandC++或C++Builder也很不错,并不比VC差。但BC的版本兼容性不好,从3.1到4.0就出现“代沟”,而且VC提供了极为丰富的文档和范例,VC的参考资料也远比BC多。并且VC与其他的VisualStudio成员可以协调工作,对软件工程有利。   C.开始不要学WinAPI编程,但以后最好学学WinAPI   特别要注意,开始不要买讲WindowsSDK编程的书。一个臭名昭著的例子就是“HelloWorld”。各种计算机语言在入门课中往往都给出一个例子,显示一行文字“HelloWorld”,无论是在Basic、C、Pascal,甚至汇编中,这个最简单的小程序都几行就可以写完。但在早期的Windows编程中,刚才讲到的“HelloWorld”这个有名的例子就要组织一个工程、写上几百行代码才能实现。这就吓跑了很多想学Windows编程的人。实际上,在Windows下显示“Helloworld”,最简单的方法只要5行就够了:   #include“windows.h”   voidWinMain()   {   MessageBox(NULL,”HelloWorld!”,”MyFirstWindowsApplication”,MB_OK);   }   当然这个程序只建立了一个最简单的对话框,但这已经够了。   如果你没有SDK编程的经验,学VC就是要利用MFC绕过Windows编程的许多细节。有好的工具为什么不用呢?现在你在VC写一个”HelloWorld”,只要写一行代码就可以了。   voidCYourView::OnDraw(CDC*pDC)   {   //…….其他的代码   pDC-&TextOut(100,100,”HelloWorld!”);   }   但MFC不是万能的,WinAPI和VC中有很多功能在MFC中并不能反映出来。在入门后,要想发挥VC的完全能力,WindowsAPI还是非常重要的。而且,这些API在其他Windows语言中也用得到。   学语言,与练武道理也差不多。VC、VB、Delphi、VFP,以及其他的Windows编程语言,都属于同一个门派:Windows门,虽然招式不同,但内功都是一样的,这就是WindowsAPI(应用编程接口),大概是两千个函数。任何武功,招式即使再复杂,通常也能在很短时间内记下来;但内功就不是一朝一夕的事。而且,各门派的内功不同,Unix、Linux门有Uinx的内功,Apple(苹果)门有Mac的内功,Java更是自成一派。我们这里说的学VC,只是学招式,学招式一个月差不多就够了,聪明的两个星期就可以掌握。光学招式,吓唬人是够了,但和高手一过招,非出丑不可。要想精通VC,必须熟悉WindowsAPI。   D.高级语言与自然语言   一门高级语言与一门自然语言是类似的。关键要素有三:   语法:了解C和C++基本语法,这是比较容易的。   修辞:编程的艺术和风格。通常,这是与软件工程联系起来的。算法上的小伎俩并非是关键的。严谨,严格按照规范去做,同时又能发挥出极大的创造性,才是语言学家的本色。   词汇:如何利用别人的工作?如何利用自己以前的工作?这是一个软件工程师成功的关键。如果词汇量不丰富,就写不出好文章,就会有想法表达不出。一个人的语法在上小学之前就基本上学成了,修辞水平也在年轻时就确定了,惟有词汇量需要根据需要不断学习、不断扩充。VC编程中,拥有大的词汇量就意味着要掌握较多的类、函数和其他编程组件。如:WindowsSDK,MFC,以及你所专攻的领域的现成的SDK,比如3D编程中的OpenGL,多媒体编程中的DirectX,图像处理中的Victor库。另外,ActiveX控件的掌握往往也是成败的关键。我们这几年的工作也总结成了一个类库,叫IPX(图像处理框架),大大简化了图像处理的工作;不过现在还有很多细节问题要解决,如果有同学感兴趣可以参与这方面的工作。   学习VC,千万不要用我们在学校里学英语的方法,而要用小孩学说话的方法。所谓学英语的方法,就是我们在本科时学C语言的那种模式:详细搞懂每一个细节,背大量的规则,很少上机实践,没有实际问题供解决,最后由考试来断定学习成果。这种模式的后果大家都清楚:我们学了十几年英语,可有不少人还只会四五千个单词,写百把字的文章,不会说,不能听;尤其要命的是,看不懂VC的帮助文档。我们要象婴儿一样,在使用中学会语法、修辞和词汇;一开始肯定只能编出最糟糕的,就好像小孩开始只会说:“爸爸坐车车”;但“爸爸”“车车”这些词对小孩是最需要的,学习的效率反而最高。学VC的时候,应从我的需要出发,先做一个最简单的东西,然后一点一点复杂起来,象滚雪球一样。   学习VC尤其要和别人交流,你苦苦思考不明白的,也许别人早就解决了。一定要善于学习:从书店找出有用的书;向身边的高手学习;寻找可以利用的源代码、类库、组件、控件、库;如果能上互连网,那就更加能解决问题了。
相关知识等待您来回答
编程领域专家
& &SOGOU - 京ICP证050897号 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
VC++中MFC生成单文档程序详细过程
下载积分:50
内容提示:VC++中MFC生成单文档程序详细过程
文档格式:PDF|
浏览次数:245|
上传日期: 17:45:24|
文档星级:
该用户还上传了这些文档
VC++中MFC生成单文档程序详细过程
官方公共微信共有 1342 人关注过本帖
标题:VC6.0中使用MFC编写的一个简单的标签控件程序在别人电脑上不能正常运行
等 级:新手上路
结帖率:50%
&&已结贴√
&&问题点数:20&&回复次数:3&&&
VC6.0中使用MFC编写的一个简单的标签控件程序在别人电脑上不能正常运行
使用MFC编写了一个简单的多选项卡程序,在自己电脑上都可以正常运行,但是到了把可执行程序考给别人在其它电脑上就不能够正常运行
可执行程序发布的是release版的,在别人电脑上运行的时候切换选项卡的时候长期卡中的内容不显示,如果给别人debug版的话,在别人电脑上运行的时候出现&winocc.cpp line:279&&winocc.cpp line:301&断言错误,找不到原因,不知道哪位也遇到这种问题,帮忙看看呃
搜索更多相关主题的帖子:
来 自:何方
等 级:版主
威 望:148
帖 子:6522
专家分:40087
&&得分:10&
如果是MFC的,会依赖很多库,默认是动态使用mfc库的,在设置中的“mfc使用”设置成 静态使用mfc,并且release 编译就行了
“如果给别人debug版的话,在别人电脑上运行的时候出现&winocc.cpp line:279&”
对于这个,会不会你呢的代码存在bug;
我的博客:
http://blog.sina. com. cn/yuccn
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
&&得分:10&
要么是BUG 要么是库的版本不对
等 级:新手上路
自己解决了,是别人电脑上没有注册MSCOMM32.OCX这个控件,注册完了就OK了
版权所有,并保留所有权利。
Powered by , Processed in 0.020679 second(s), 9 queries.
Copyright&, BCCN.NET, All Rights Reservedlaokaddk 的BLOG
用户名:laokaddk
文章数:983
评论数:94
访问量:1809599
注册日期:
阅读量:2569
51CTO推荐博文
(一)树控制的主要功能
树控制和视(Tree Control&View)主要用来显示具有一定层次结构的数据项,如资源管理器中的磁盘目录等,以供用户在其中进行各种选择。树控制中的每个数据项包括数据项名称的文本字符串和用于表示该数据项的图像,每个数据项下面均可包含各种子项,整个结构就象目录树一样。对于包含各种子项的数据项,可通过鼠标双击来展开或合拢,这可以通过控制树的不同风格来实现树控制的不同显示形态。这些风格主要包括:
TVS_HASLINES表示用连线来连接父项和它下面的各个子项,这可以使树的显示层次结构更加清晰,但在无父项的各子项之间并没有连线;
TVS_LINESATROOT表示在无父项的各子项即根下面的各子项之间存在连线;
TVS_HASBUTTONS表示在带有子项的父项前面增加一个带&+&或&-&的按钮,这使得用户也可以通过单击这个小按钮来实现子项的展开和合拢,当存在子项时,按钮的初始状态为&+&,当子项被展开时,按小按钮由&+&变为&-&号,当子项合拢时,小按钮由&-&变为&+&号,这一风格同样对于根项无效,如果需要可通过组合TVS_LINESATROOT风格来实现;
TVS_EDITLABELS表示允许让用户单击具有输入焦点的数据项来修改其名称。
对于树控制,MFC中也以两种形式来封装,即树控制(CTREECTRL)和树视(CTREEVIEW),来满足用户的不同需求,对于一般要求的用户如在对话框中应用,使用树控制比较方便,而对于具有较高要求的用户,在使用树视时还具有视窗口的各种方便特性,可以更好地满足文档/视结构的要求。当在窗口中使用树视时,树视会占满两个窗口的客户区域并自动随窗口的框架结构的调整而调整,并能够很好地处理诸如菜单、加速键和工具条中的各种命令消息。在使用树视时只要利用其成员函数CtreeView取得其一个引用,就可以象树控制一样方便地应用:CtreeCtrl &treeCtrl = GetTreeCtrl()。
(二)树控制的对象结构
1、树控制的建立方法
CtreeCtrl&treeCtrl 建立树控制对象结构
Create 建立树控制并绑定对象
树控制CTreeCtrl::Create的调用格式如下:
BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
其中参数dwStyle用来确定树控制的类型;rect用来确定树控制的大小和位置;pParentWnd用来确定树控制的父窗口,通用是一个对话框并且不能为NULL;nID用来确定树控制的标识。树控制的风格可以是下列值的组合:
TVS_HASLINES 表示树控制在各子项之间存在连线;
TVS_LINESATROOT 表示树控制在根项之间存在连线;
TVS_HASBUTTONS 表示树控制视在父项左侧存在展开合拢控制按钮;
TVS_EDITLABELS 表示可以控制鼠标单击修改树项的名称;
TVS_SHOWSELALWAYS 表示选中项即使在窗口失去输入焦点时仍然保持选中状态;
TVS_DISABLEDRAGDROP表示禁止树控制发送TVN_BEGINDRAG消息
2、树控制的属性类
树控制属性类包括取得树控制中项数GetCount、取得树控制中项相对于父项的偏移值GetIndent、取得树控制图像列表控制句柄GetImageList、设置树控制图像列表控制句柄SetImageList、取得匹配下一个树项GetNextItem、判断给定树项是否包含子项ItemHasChildren、取得树项子项GetChildItem、取得下一个同属树项GetNextSiblingItem、取得前一个同属树项GetPrevSiblingItem、取得父树项GetParentItem、取得第一个可视树项GetFirstVisibleItem、取得下一个可视树项GetNextVisible Item、取得前一个可视的树项GetPrevVisibleItem、取得被选中的树项GetSelectedItem、取得根树项GetRootItem、取得树项的属性GetItem、设置树项的属性SetItem、取得树项的状态GetItemState、设置树项的状态SetItemState、取得与树项关联图像GetItemImage、设置与树项关联图像SetItemImage、取得树项文本GetItemText、设置树项文本SetItemText和取得树项编辑控制句柄GetEditControl等。
3、树控制的操作方法
树控制的操作方法包括插入一个树项InsertItem、删除一个树项DeleteItem、删除所有树项DeleteAllItems、展开或合拢树项的子项Expand、选中特定树项SelectItem、选择一个树项作为第一个可视树项SelectSetFirstVisible、编辑一个可视的树项EditLabel和排序给定父树项的子树项SortChildren等。
(三)树控制的数据结构
在使用树控制时需要了解两个个非常重要的数据结构TV_ITEM和TV_INSERTSTRUCT,前一个数据结构是用来表示树控制的树项信息,后一个数据结构是用来定义将树项增加到数据控制中所需要的数据内容。另外,还需要NM_TREEVIEW、TV_DISPINFO和TV_HITTESTINFO三个数据结构,这几个数据结构的定义方法如下:
①基本数据项结构
typedef struct _TV_ITEM {
UINT //结构成员有效性屏蔽位
HTREEITEM hI //数据项控制句柄
UINT //数据项状态
UINT stateM //状态有效性屏蔽位
LPSTR pszT //数据项名称字符串
int cchTextM //数据项名称的最大长度
int iI //数据项图标索引号
int iSelectedI//选中数据项图标索引号
int cC //子项标识
LPARAM lP //程序定义的32位数据
} TV_ITEM, FAR *LPTV_ITEM;
②插入树项结构
typedef struct _TV_INSER TSTRUCT {
HTREEITEM hP //父项控制句柄
HTREEITEM hInsertA //插入树项的位置
TV_ITEM //数据项的结构
} TV_INSERTSTRUCT, FAR *LPTV_INSERTSTRUCT;
其中插入的位置如果是TVI_FIRST 或TVI_LAST ,则分别插入到树控制的最前面或最后面,如果是TVI_SORT ,则插入的树项自动插入到合适的位置。
③树控制通知消息结构
typedef struct _NM_TREEVIEW {
NMHDR //通知消息句柄
UINT //通知消息标志
TV_ITEM itemO //原来的数据结构
TV_ITEM itemN //新的数据结构
POINT ptD //拖动指针
} NM_TREEVIEW;
④取得或设置数据结构
typedef struct _TV_DISPINFO { tvdi
NMHDR //通知消息控制句柄
TV_ITEM //数据项结构
} TV_DISPINFO;
⑤指针测试数据结构
typedef struct _TVHITTESTINFO { tvhtst
POINT //客户区域屏幕坐标指针
UINT //存放测试结果的变量
HTREEITEM hI //测试的数据项结构
} TV_HITTESTINFO, FAR *LPTV_HITTESTINFO;
其中flags测试结果可以是如下值:
TVHT_ABOVE 在客户区域上面
TVHT_BELOW 在客户区域下面
TVHT_NOWHERE 在客户区域中并在最后一项下面
TVHT_ONITEM 在与树项关联的位图或标签内
TVHT_ONITEMBUTTON 在与树项关联的按钮上
TVHT_ONITEMICON 在与树项关联的位图上
TVHT_ONITEMINDENT 在与树项关联的联线上
TVHT_ONITEMLABEL 在与树项关联的标签上
TVHT_ONITEMRIGHT 在树项的右侧区域中
TVHT_ONITEMSTATEICON 在用户定义的状态图标上
TVHT_TOLEFT 在客户区域的左侧
TVHT_TORIGHT 在客户区域的右侧
(四)树控制的应用技巧示例
这里仍以基于对话框演示实例来具体介绍树控制及其和图像列表相结构的应用技巧:
通过&FILE-&NEW-&PROJECTS-&MFC AppWizard(EXE)&建立名为VCTREE的工程,在建立过程中选择基于对话框(Dialog based)的应用;将对话框中的默认控件删除,并将所有对话框属性中的Language域设置为Chinese(P.R.C.),以使应用程序支持中文;建立两个图标IDI_PM和IDI_CJ,用来表示图标的选中和非选中状态,对于每个图标都应建立32X32和16X16两种大小,以保证程序的需要;在对话框窗口中添加树控制对象(TREE CONTROL),并设置五个按钮&增加|删除|查看|排序|关闭&,其对应标识分别如下:
控制名称 标题名称 标识符号
树控制 IDC_TREECTRL
按钮 增 加 IDC_ADD
删 除 IDC_DEL
查 看 IDC_VIEW
排 序 IDC_SORT
关 闭 IDOK
5、选中树控制控件,选择&VIEW-&ClassWizard-&Memory Variables。 骺刂IDC_TREECTRL 引入成员变量,其变量类型为:
变量名 种类 变量类型
m_TreeCtrl Control CTreeCtrl
同时利用&MESSAGES MAP&为各命令按钮增加控制功能函数。
6、然后在代码文件VCTREEDlg.CPP中分别加入如下控制代码:
(1)在文件开始处增加图像列表定义
CImageList Cil1,Cil2;//大小图标像列表
(2)在初始化文件开始处增加代码
BOOL CVCTREEDlg::OnInitDialog()
{ CDialog::OnInitDialog();
......//原来其它代码
// TODO: Add extra initialization here
// 此处开始增加代码
CVCTREEApp *pApp=(CVCTREEApp *)AfxGetApp();//创建图象列表
Cil1.Create(16,16,ILC_COLOR,2,2);
Cil1.Add(pApp-&LoadIcon(IDI_PM));
Cil1.Add(pApp-&LoadIcon(IDI_CJ));
m_TreeCtrl.SetImageList(&Cil1,TVSIL_NORMAL); //设置图象列表
DWORD dwStyles=GetWindowLong(m_TreeCtrl.m_hWnd,GWL_STYLE);//获取树控制原风格
dwStyles|=TVS_EDITLABELS|TVS_HASBUTTONS|TVS_HASLINES|TVS_LINESATROOT;
SetWindowLong(m_TreeCtrl.m_hWnd,GWL_STYLE,dwStyles);//设置风格
char * CJ[4]={&玉溪卷烟厂&,&云南卷烟厂&,&沈阳卷烟厂&,&成都卷烟厂&};//根数据名称
char * PM[4][5]={
{&红梅一&,&红梅二&,&红梅三&,&红梅四&,&红梅五&},//产品数据项
{&白梅一&,&白梅二&,&白梅三&,&白梅四&,&白梅五&},
{&绿梅一&,&绿梅二&,&绿梅三&,&绿梅四&,&绿梅五&},
{&青梅一&,&青梅二&,&青梅三&,&青梅四&,&青梅五&}};
HTREEITEM hRoot,hC//树控制项目句柄
TV_INSERTSTRUCT TCI//插入数据项数据结构
TCItem.hParent=TVI_ROOT;//增加根项
TCItem.hInsertAfter=TVI_LAST;//在最后项之后
TCItem.item.mask=TVIF_TEXT|TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE;//设屏蔽
TCItem.item.pszText=&数据选择&;
TCItem.item.lParam=0;//序号
TCItem.item.iImage=0;//正常图标
TCItem.item.iSelectedImage=1;//选中时图标
hRoot=m_TreeCtrl.InsertItem(&TCItem);//返回根项句柄
for(i=0;i&4;i++){//增加各厂家
TCItem.hParent=hR
TCItem.item.pszText=CJ[i];
TCItem.item.lParam=(i+1)*10;//子项序号
hCur=m_TreeCtrl.InsertItem(&TCItem);
for(j=0;j&5;j++){//增加各产品
TCItem.hParent=hC
TCItem.item.pszText=PM[i][j];
TCItem.item.lParam=(i+1)*10+(j+1);//子项序号
m_TreeCtrl.InsertItem(&TCItem);
m_TreeCtrl.Expand(hCur,TVE_EXPAND);//展开树
m_TreeCtrl.Expand(hRoot,TVE_EXPAND);//展开上一级树
return TRUE; // return TRUE unless you set the focus to a control
(3)增加树项功能的实现
在增加树项功能时,除了需要定义和设置插入树项的数据结构之外,还需要注意的是新增树项的名称初始时均为&新增数据&,增加后允许用户给数据项设置自定义名称。在编程时应特别注意m_TreeCtrl.EditLabel(hInsert);后面不能跟任何其它程序命令,否则这条编辑指令无效。
void CVCTREEDlg::OnAdd()
{ //增加子项功能函数
HTREEITEM hSel=m_TreeCtrl.GetSelectedItem();//取得选择项句柄
if(hSel==NULL)//无任何选项则返回
static int nAddNo=100;//编号大于100为新增数据
TV_INSERTSTRUCT TCI//定义插入项数据结构
TCItem.hParent=hS //设置父项句柄
TCItem.hInsertAfter=TVI_LAST;//在最后增加
TCItem.item.mask=TVIF_TEXT|TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE;//设屏蔽
TCItem.item.pszText=&新增数据&;
TCItem.item.lParam=nAddNo++;//索引号增加
TCItem.item.iImage=0;//正常图标
TCItem.item.iSelectedImage=1;//选中时图标
HTREEITEM hInsert=m_TreeCtrl.InsertItem(&TCItem);//增加
m_TreeCtrl.Expand(hSel,TVE_EXPAND);
m_TreeCtrl.EditLabel(hInsert);//修改增加的数据
(4)删除树项功能的实现
在实现删除功能时,应对存在子项的树项进行提示,以警告用户是否连同其子项一起删除。
void CVCTREEDlg::OnDel()
{ //删除子项功能函数
HTREEITEM hSel=m_TreeCtrl.GetSelectedItem();//取得选项句柄;
if(hSel==NULL)//无任何选项则返回
if(m_TreeCtrl.ItemHasChildren(hSel))//判断是否有子项
if(MessageBox(&厂家下存在品名,一同删除?&,&警告&,MB_YESNO)==IDNO)
m_TreeCtrl.DeleteItem(hSel);
(5)排序功能的实现
排序功能是对所选中的树项的所有子项按字符中顺序进行排序,如果想要按照其它规则进行排序,应利用SortChildrenItemBC()函数进行自行开发排序程序,这个自行开发的函数与列表控制中实现的函数基本相同,可兴趣的读可以试验。
void CVCTREEDlg::OnSort()
{ //排序子项功能函数
HTREEITEM hSel=m_TreeCtrl.GetSelectedItem();//取得选项句柄;
if(hSel==NULL)//无任何选项则返回
m_TreeCtrl.SortChildren(hSel);
(6)查看功能的实现
查看功能用来查看选中树项的有关信息,函数中中显示了树项的文本名称和标识号,可以将这两个信息作为查找关键字,来查看其它更详细的信息。
void CVCTREEDlg::OnView()
{ //查看选中项功能函数
HTREEITEM hSel=m_TreeCtrl.GetSelectedItem();//取得选项句柄;
if(hSel==NULL)//无任何选项则返回
CString cText=m_TreeCtrl.GetItemText(hSel);//取得数据项名
LONG IDs=m_TreeCtrl.GetItemData(hSel);//取得数据项序号
char temp[100];
wsprintf(temp,&厂家:%s 编号:%05d&,cText,IDs);
MessageBox(temp,&选择信息&);
(7)修改功能的实现
如果不进行其它处理,当修改树项的文本名称后,就会发现其未被修改,这是因为程序中没有对修改结果进行保存处理,这就要利用TV_DISPINFO结构和SetItemText函数对TVN_ENDLABELEDIT进行处理,这样就可以正确地实现修改功能。
void CVCTREEDlg::OnEndlabeleditTree(NMHDR* pNMHDR, LRESULT* pResult)
{ TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
// TODO: Add your control notification handler code here
if(pTVDispInfo-&item.pszText==0)//用户取消修改操作
m_TreeCtrl.SetItemText(pTVDispInfo-&item.hItem,
pTVDispInfo-&item.pszText);//设置新数据
*pResult = 0;
7、树视的演练技巧
树视的应用技巧在使用树视时,其方法与树控制基本相同,只不过树视是在窗口中来实现的而树控制是在对话框中实现,树视的各种功能是通过菜单来实现的而树控制是通过按钮等方式来实现的,树控制需要在对话框中创建树控制控件而树视直接占据整个窗口,在设计过程中只要将按钮和树控制设计过程变为菜单设计,并注意在功能函数是在类向导中是通过菜单命令来操作,同时在每个功能函数前面增加取得列表视引用的命令(CTreeCtrl& TreeCtrl = GetTreeCtrl()),而其余数据结构和代码均不需要修改,实现起来比较容易。
了这篇文章
类别:┆阅读(0)┆评论(0)

我要回帖

更多关于 vc mfc教程 的文章

 

随机推荐