CListView

合集下载

微软基础类库(MFC)

微软基础类库(MFC)

M F CMFC(Microsoft Foundation Classes),是一个微软公司提供的类库(class libraries),以C++类的形式封装了Windows的API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。

其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。

① MFC简介:MFC,微软基础类(Microsoft Foundation Classes),同VCL类似,是一种应用程序框架,随微软Visual C++ 开发工具发布。

目前最新版本为10.0(截止2011年3月),并且发布了中文版。

该类库提供一组通用的可重用的类库供开发人员使用。

大部分类均从CObject 直接或间接派生,只有少部分类例外。

MFC 应用程序的总体结构通常由开发人员从MFC类派生的几个类和一个CWinApp类对象(应用程序对象)组成。

MFC 提供了MFC AppWizard 自动生成框架。

Windows 应用程序中,MFC 的主包含文件为"Afxwin.h"。

此外MFC的部分类为MFC/ATL 通用,可以在Win32 应用程序中单独包含并使用这些类。

由于它的易用性,初学者常误认为VC++开发必须使用MFC。

这种想法是错误的。

作为Application Framework,MFC的使用只能提高某些情况下的开发效率,只起到辅助作用,而不能替代整个Win32 程序设计。

② MFC特点:MFC实际上是微软提供的,用于在C++环境下编写应用程序的一个框架和引擎,VC++是Windows下开发人员使用的专业C++ SDK(SDK,Standard SoftWare Develop Kit,专业软件开发平台),MFC就是挂在它之上的一个辅助软件开发包,MFC作为与VC++血肉相连的部分(注意C++和VC++的区别:C++是一种程序设计语言,是一种大家都承认的软件编制的通用规范,而VC++只是一个编译器,或者说是一种编译器+源程序编辑器的IDE,WS,PlatForm,这跟Pascal 和Delphi的关系一个道理,Pascal是Delphi的语言基础,Delphi使用Pascal规范来进行Win下应用程序的开发和编译,却不同于Basic语言和VB的关系,Basic语言在VB开发出来被应用的年代已经成了Basic语言的新规范,VB新加的Basic语言要素,如面向对象程序设计的要素,是一种性质上的飞跃,使VB既是一个IDE,又成长成一个新的程序设计语言),MFC 同BC++集成的VCL一样是一个非外挂式的软件包,类库,只不过MFC类是微软为VC++专配的..MFC是Win API与C++的结合,API,即微软提供的Windows下应用程序的编程语言接口,是一种软件编程的规范,但不是一种程序开发语言本身,可以允许用户使用各种各样的第三方(如我是一方,微软是一方,Borland就是第三方)的编程语言来进行对Windows下应用程序的开发,使这些被开发出来的应用程序能在Windows下运行,比如VB,VC++,Java,Delhpi编程语言函数本质上全部源于API,因此用它们开发出来的应用程序都能工作在Windows的消息机制和绘图里,遵守Windows作为一个操作系统的内部实现,这其实也是一种必要,微软如果不提供API,这个世上对Windows编程的工作就不会存在,微软的产品就会迅速从时尚变成垃圾,上面说到MFC是微软对API函数的专用C++封装,这种结合一方面让用户使用微软的专业C++ SDK来进行Windows下应用程序的开发变得容易,因为MFC是对API的封装,微软做了大量的工作,隐藏了好多程序开发人员在Windows下用C++ & MFC编制软件时的大量内节,如应用程序实现消息的处理,设备环境绘图,这种结合是以方便为目的的,必定要付出一定代价(这是微软的一向作风),因此就造成了MFC对类封装中的一定程度的的冗余和迂回,但这是可以接受的..最后要明白MFC不只是一个功能单纯的界面开发系统,它提供的类绝大部分用来进行界面开发,关联一个窗口的动作,但它提供的类中有好多类不与一个窗口关联,即类的作用不是一个界面类,不实现对一个窗口对象的控制(如创建,销毁),而是一些在Windows(用MFC编写的程序绝大部分都在Windows中运行)中实现内部处理的类,如数据库的管理类等,学习中最应花费时间的是消息和设备环境,对C++和MFC的学习中最难的部分是指针,C++面向对象程序设计的其它部分,如数据类型,流程控制都不难,建议学习数据结构C++版。

CListCtrl与CListView相关代码

CListCtrl与CListView相关代码

选择项的问题双击响应函数里的参数有一个是NM_LI STV IEW *msd n查NML IST VIE W(把中间那个_去掉)能看到这个结构中有一个成员变量是iI tem0表示第一行,1表示第二行;还有一个iS ubI te m表示列,0表示双击在第一列C Li stC tr l大小图标转换先要添加控制按纽(大图标,小图标,列表,详细)查看源代码拷贝至剪贴板打印代码1.void OnBig()2.{LONG lStyle;3. lStyle = GetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE);//获取当前窗口句并4. lStyle&=~ LVS_TYPEMASK;//清除显示方式所在的比特为5. lStyle |= LVS_ICON;//设置显示方式6. SetWindowLong(m_listCtrl.m_hWnd, GWL_STYLE,lStyle);//设置窗口类型7.}8.在另外的三个消息处理函数中只需把这里的LVS_ICON改为LVS_SMALLICON,LVS_LIST(列表),LVS_REPORT(详细)即可。

以下代码演示如何获得所选项行数查看源代码拷贝至剪贴板打印代码1.// This code prints out the indices of selected items to debug win2.int i = GetNextItem( -1, LVNI_ALL | LVNI_SELECTED);3.while( i != -1 )4. {5. TRACE("%d\n", i );6. i = GetNextItem( i, LVNI_ALL | LVNI_SELECTED);7. }以下代码演示如何获得所选项列数查看源代码拷贝至剪贴板打印代码1.// HitTestEx - Determine the row index and column index for a point2.// Returns - the row index or -1 if point is not over a row3.// point - point to be tested.4.// col - to hold the column index5.int CMyListCtrl::HitTestEx(CPoint &point, int *col) const6.{7.int colnum = 0;8.int row = HitTest( point, NULL );9.10.if( col ) *col = 0;11.12.// Make sure that the ListView is in LVS_REPORT13.if( (GetWindowLong(m_hWnd, GWL_STYLE) & LVS_TYPEMASK) != LVS_REPORT )14.return row;15.16.// Get the top and bottom row visible17. row = GetTopIndex();18.int bottom = row + GetCountPerPage();19.if( bottom > GetItemCount() )20. bottom = GetItemCount();21.22.// Get the number of columns23. CHeaderCtrl* pHeader = (CHeaderCtrl*)GetDlgItem(0);24.int nColumnCount = pHeader->GetItemCount();25.26.// Loop through the visible rows27.for( ;row <=bottom;row++)28. {29.// Get bounding rect of item and check whether point falls in it30. CRect rect;31. GetItemRect( row, &rect, LVIR_BOUNDS );32.if( rect.PtInRect(point) )33. {34.// Now find the column35.for( colnum = 0; colnum < nColumnCount; colnum++ )36. {37.int colwidth = GetColumnWidth(colnum);38.if( point.x >= rect.left39. && point.x <= (rect.left +colwidth ) )40. {41.if( col ) *col = colnum;42.return row;43. }44. rect.left += colwidth;45. }46. }47. }48.return -1;49.}GetItemText获取相应项的内容。

用VC++6.0编写注册表管理程序

用VC++6.0编写注册表管理程序
CString cstrKeyRootName=strKey;
int i=cstrKeyRootName.Find("\\");
if(i!=-1)
cstrKeyRootName=cstrKeyRootName.Left(i);
if(cstrKeyRootName == _T("HKEY_CLASSES_ROOT"))
GetTreeCtrl().SetImageList(m_pImageList , TVSIL_NORMAL);
HTREEITEM hParent = GetTreeCtrl().InsertItem(MYCOMPUTER, ILI_MYCOMP, ILI_MYCOMP);
//显示树根,MYCOMPUTER宏定义为“我的电脑”
①、注册表数据的显示与操作;
②、注册表数据的导入与导出;
③注册表数据的查找与替换。以
下介绍在VC6中对注册表数据的显示与操作的实现。对于后二点今后将进行阐述。
程序运行界面如下:
在VC6中创建一单文档工程,可命名为RegExplorer,前5步可以按默认方式进行,在AppWizard对话框的Step6中,选取视图类的基类为ClistView。
左边树型CregLeftView类的设计:
1.和文档类进行通信的代码:
在类定义前加入class CRegExplorerDoc;并在类中实现public型的成员函数
CRegExplorerDoc* CRegLeftView::GetDocument()
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CRegExplorerDoc)));

MFC类库的基本类

MFC类库的基本类

MFC类库是一个层次结构,主要有CObject类、应用程序类、可视对象类、绘图和打印类、通用类、数据库类、Internet和网络类、OLE类。

(1)CObject类CObject类是MFC的抽象基类,MFC中的大多数类是从CObject类派生出来的。

它是MFC 中多数类和用户自定义的根类,该类为程序员提供了希望融入所编写程序的许多公共操作,包括对象的建立和删除、串行化支持、对象诊断输出、运行时信息以及集合类的兼容等。

CObject类的声明在Afx.h中。

(2)应用程序结构类该类主要用于构造框架应用程序的结构,提供了多数应用程序公用的功能.编写程序的任务是填充框架,添加应用程序专有的功能。

1.应用程序和线程支持类CWinThread类是所有线程的基类,窗口应用程序类CWinApp类就是从该类中派生来的。

每个应用程序有且只有一个应用程序对象,在运行程序中该对象和其他对象相互协调,该对象从CWinApp中派生出来。

该类封装了初始化、运行、终止应用程序的代码。

2.命令相关类CCmdTarget类是CObject的子类,它是MFC所有具有消息映射属性的基类。

消息映射规定了当一对象接收到消息命令时,应调用哪个函数对该消息进行处理。

程序员很少需要从CCmdTarget类中直接派生出新类,往往都是从它的子类中派生出新类。

如窗口类(CWnd)、应用程序类(CWinApp)、文档模板类(CDocTemplate)、视类(CView)及框架窗口类(CFrameWnd)等。

3.文档类文档对象由文档对象模板创建,用于管理应用程序的数据。

视图对象表示一个窗口的客户区,用于显示文档数据并允许读者与之交互。

有关文档/视结构的类如下:①CDocTemplate类:文档模板的基类。

文档模板用于协调文档、视图和框架窗口的创建。

②CSingleDocTemplate类:单文档界面(SDI)的文档模板。

③CMultiDocTemplate类:多文档界面(MDI)的文档模板。

静态分割窗口与多视图实例

静态分割窗口与多视图实例

静态分割窗口与多视图实例所谓多视,是指在同一个框架窗口下同时显示多个视图。

通过运用这种技术,可以在框架的有限的空间内同时提供给用户更大的信息量,并且使得用户界面更加的友好,增强了软件的可操作性。

窗口分割的基本概念按照分割的时机的不同,窗口分割可以分为两类:动态分割和静态分割。

动态分割是指用户可以动态的分割和合并窗口。

动态分割最多可以有2行2列个窗口,并且所有的窗格只能使用同一种视图类。

静态分割是指窗口在创建时,分割窗格窗口的窗格已经创建好了,且窗格的数量和顺序不会改变了,窗格为一个分隔条所分割,用户可以拖动分割条调整相应的窗格的大小。

静态分割窗口最多可以有16行16列的窗格,但是各个窗格可以使用不同的视图类。

无论创建那一种分割,都必须在创建时指定最大的行数和列数,这些值是有CSplitterWnd 对象进行管理。

对于静态分割,必须创建指定数目的所有窗格以填满行和列。

而对于动态分割,第一个窗格将在框架创建CSplitterWnd对象时自动创建。

窗口分割支持类CSplitterWndCSplitterWnd类主要为窗口的风格提供了封装,窗口被分厂各个窗格后,又该类的对象负责管理。

对于windows而言,CSplitterWnd是一个真正的窗口,它完全占据了框架窗口的用户区域,而视图则占据了分割窗口的床片区域。

CSplitterWnd窗口不参与命令传递机制。

使用时,CSplitterWnd对象通常为其父框架窗口CFrameWnd或CMDIChildWnd(MID应用中)对象的内嵌成员。

CSplitterWnd对象创建过程如下。

在父框架窗口中嵌入CSplitterWnd类的对象成员;重载父框架窗口的CFrameWnd::OnCreateClient成员函数;从上一步重载的函数内部调用Create创建动态分割窗口或者调用CreateStatic创建静态的分割窗口。

下面介绍CsplitterWnd类的几个常用的函数创建动态分割窗口函数Create该函数用于动态创建分割窗口,同时将该窗口与类CSplitterWnd相关联,其生声明如下:BOOL Create(CWnd* pParentWnd, int nMaxRows, int MaxCol, SIZE sizeMin, CcreateContext* pContext, DOWRD dwStyle = WS_CHILD |WS_VISIBLE | WS_HSCROLL | WSVSCROLL | SPLS_DYNAMIC_SPLIT,UINT nID=AFX_IDW_PANE_FIRST);各主要参数的含义如下:pParentWnd:分割窗口的父框架窗口的指针nMaxRows和你MaxCols:行与列的最大值,二者均不大于二sizeMin:指定窗格被显示时的最小值。

MFC的窗口分割实例以及CSplitterWnd类

MFC的窗口分割实例以及CSplitterWnd类
在 MFC 的框架下,文档对象(CDocument)有一个保存其所有视图的列表,并提供了 增加视图(AddView)与删除视图(RemoveView)函数,以及当文档内容改变时通知其所 有视图的方法(UpdateAllViews)。通过多文档框架的窗口复制机制和单文档框架的分割窗 口机制是实现单文档多视图的主要方法。
3 分割窗口ቤተ መጻሕፍቲ ባይዱ
如图 1,把窗口分成三个视图,左视图基于 CView 类,可用来作几何图形;右上视图基 于 CEditView 类,用于显示文本消息;右下视图基于 CFormView 类,在此视图中做一个文 本框及发送、清除按钮,发送按钮用来向右上视图传送消息。
图 1 设计样式 打开 Microsoft VC++ 6.0,通过 MFC AppWizard(exe)新建名为 SplitWnd 的单文档(SDI) 工程,新建工程时所有选项均按默认设定。 工程建好后,把工程中的 CSplitWndView 视图类作为左视图所对应的类(该类的实现 与本文重点无关,故不阐述,有兴趣读者可与作者联系),由于需要三个视图窗口对应三个
视图类,因此需要手动创建右上视图、右下视图对应的类,可以通过 MFC 向导向应用程序 添加两个 MFC 类(菜单“Insert | New Class>”),因为在右上视图用于显示文本,故其基类选 CEditView,类名为 CLeftTopView;另一个 MFC 类的基类选 CFormView 类,取类名为 CLeftBttmView,该类即对应右下视图(由于该类基于 CFormView 类,需要有对话框与之对 应,故应先在资源中新建对话框,对话框中的控件如图 1)。
void CLeftBttmView::OnSendMsg() { UpdateData();//更新控件变量数据,文本框对应的变量为 m_sText //通过 CMainFrame 类中的 m_wndSplitterRight 变量获得右上视图类指针 CMainFrame * pMainFrm = (CMainFrame *)AfxGetApp()->GetMainWnd(); CWnd * pWnd = pMainFrm->m_wndSplitterRight.GetPane(0, 0); CLeftTopView* pLeftTopView = DYNAMIC_DOWNCAST(CLeftTopView, pWnd); pLeftTopView ->GetMsg( m_sText + "\r\n" );//CLeftTopView 成员函数,接收数据 } 右上视图类 CLeftTopView 的成员函数 GetMsg 则需保存接收到的消息并显示,主要代 码如下: void CLeftTopView::GetMsg(CString sMsg) { m_sAllMsg += sMsg; // m_sAllMsg 为成员变量,记录所有消息 int nTextLen = GetWindowTextLength(); GetEditCtrl().SetSel(nTextLen, nTextLen); GetEditCtrl().ReplaceSel( sMsg );//显示新消息 } 有了上面两个函数就可以实现右上视图类 CLeftTopView 与右上视图类 CLeftBttmView 之间的简单通讯,类似地,可以实现所有视图之间任意的数据传递。

学生个人事务管理系统

学生个人事务管理系统

学生个人事务管理系统1设计目的VC++程序设计课程设计是计算机科学与技术专业的《VC++程序设计》课程的综合性实践环节。

VC++程序设计是一门实用性很强的学科,是进行软件开发的主要工具,只有进行实际操作,才能将理论知识和实际应用有机的结合起来,锻炼学生分析解决实际问题的能力,提高学生实际运用的能力,为学生毕业设计,日后工作中的软件开发打下良好的基础。

2功能描述学生个人事务管理系统是引用ADO对象操作技术以及运用这种技术操作数据库,系统以单文档结构为设计基础,在界面设计方面,采用多视图并提供快捷菜单操纵。

数据库采用Microsoft Access 2000。

其主要包括以下几个功能:⑴个人信息管理:包括基本信息及保密信息,可以进行查询。

⑵课程管理:对学生已修课程的信息管理,分为必修课和选修课。

⑶课表管理:对学生课程表的管理,分为总课表和日课表。

可对日课表进行查询。

⑷图书借阅管理:对借阅图书信息进行设置,分为图书馆书籍及其他书籍。

⑸好友信息管理:是一个简单的个人通信信息系统,分为同学和普通朋友俩类。

⑹娱乐信息管理:实现对娱乐信息的编辑和查询。

⑺网站信息管理:实现对网站分类。

⑻待办事务管理:实现记录学生短期内的计划及约定要做的事。

⑼添加与删除信息管理:通过快捷菜单命令实现对信息的添加与删除。

3方案论证 3.1总体设计 3.1.1功能框图学生个人事务管理总体功能框图如下:图1 总体功能框图3.2详细设计 3.2.1数据库设计数据库采用Microsoft Access 。

逻辑设计阶段的任务是把概念结构转换为选用DBMS 所支持的模式。

根据模块的设计以及规范化的设计要求。

系统的数据库设计如表1存放系统总事务信息,即个人信息、课程信息、课表查询、图书借阅、我的好友、我的音乐、我的酷网和提示备忘8项事务。

如表1所示。

学生个人事务管理系统个人信理课程 课表图书借阅 好友信息 娱乐信息 网站信息 待办事务添加与删除基本信息 保密信息必修课 选修课 总课表 日课表图书馆书籍其他书籍同学 朋友 编辑 查询 编辑 查询 编辑 查询 添加 删除表1总事务信息表字段名称数据类型字段大小标题必填字段索引是否主键affairname 文本10 事务名称是无否affairID 数字长整形事务编号是有(无重复)是tableNO 数字整形表号是有(无重复)否subaffair 文本20 子项名称是有(无重复)否explanation 文本50 说明否无否3.2.3程序界面设计3.2.3.1添加新类(1)主框架的设计:①添加左边显示事务项目的树视图类CLeftTreeView。

获得另一个应用程序窗口中的文本

获得另一个应用程序窗口中的文本
按照惯例,我写了一个小程序GWTTest作示范。GWTTest显示从GetWindowText 和 SendMessageTimeout(WM_GETTEXT) 获得的顶层窗口及其编辑框控制的文本。如图一所示:
图一GetWindowText 与 WM_GETTEXT的比较
GWTTest程序本身没有什么用处,它只是用来示范GetWindowText 和 WM_GETTEXT之间的差别。从程序的运行结果可以看出,两种操作都能返回顶层窗口的标题,但只有WM_GETTEXT才能对其它进程中的编辑框控制起作用。GWTTest是一个简单的CListView应用程序;获取文本的函数是CMyView::AddWindowInfo,代码如下:
//AddWindowInfo.cpp源代码
//////////////////
// 添加窗口信息, 顶层或者编辑框控制
void CMyView::AddWindowInfo(int iItem, HWND hwnd)
{
CListCtrl& lc = GetListCtrl();
CWnd* pWnd = CWnd::FromHandle(hwnd);
STRINGLEN,
(LPARAM)s.GetBuffer(STRINGLEN),
0,
1000,
&result);
lc.SetItemText(iItem,Subitem++,s);
s.ReleaseBuffer();
真正的问题是:为什么微软公司的那帮家伙不让GetWindowText函数做它该做的事情?也就是说,如果窗口在当前进程中,为什么GetWindowText 不做一次SendMessage(WM_GETTEXT),而窗口在另一个进程时,做一次SendMessageTimeout呢?很好的问题。只有Window 向导(Wizard)知道。我怀疑在从伪多任务到真正的多任务过渡的过程中,微软公司的那帮家伙在处理以前遗留下来的应用时有难言之隐......

MFC邮递表的中文翻译29

MFC邮递表的中文翻译29
CRect rcDialogWindow;
GetWindowRect (rcDialogWindow);
rcDialogWindow.bottom +=3D (9 * ControlHSpacing);
பைடு நூலகம் SetWindowPos (0,=20
0,
bmMask.CreateBitmap( bm.bmWidth,bm.bmHeight,1,1,NULL );
maskDC.CreateCompatibleDC( &memDC );
CBitmap* bmOld = maskDC.SelectObject( &bmMask );
CBrush brush( rgbNew );
this,=20
ID_OF_FIRST_EDIT_CONTROL + EditCtr); // EditCtr =increments for each control added
// Set the font for the control to Dialog's font
回到本期目录
显示顶级窗口
问:怎样才能在线程中实现对话框的顶层显示。
答:这个问题我也遇上过,不知为什么设置成WS_EX_TOPMOST并不能实现,可能我们还没有真正理解它该怎样使用。但我用另外的方法实现了:
SetWindowPos (&wndTopMost, 0, 0, 0, 0,SWP_NOMOVE | SWP_NOSIZE)。
2)取得鼠标的X/Y值,发送消息LB_ITEMFROMPOINT来得到鼠标所指项目的索引值,然后发送消息LB_GETITEMRECT来得到项目的范围就可以了。

VC一点通—实现文件夹的缩略图显示

VC一点通—实现文件夹的缩略图显示

VC一点通:实现文件夹的缩略图显示本示例演示了列表控件的虚列表和自画功能,也演示了一些系统外壳的函数和接口的使用方法。

单击这里下载本文的代码。

预备性阅读在阅读本文之前,建议先对列表视图控件和系统外壳有一个基本的了解。

建议阅读以下SDK文章ShellFAQList-ViewControlsOverviewUsingList-ViewControlsCustomizingaControl'sAppearanceUsingCustomDraw创建应用程序使用MFC应用程序向导创建一个SDI应用程序,在最后一步选择视图的基类为CListView。

创建完成之后,在资源中去掉保存、编辑和打印等功能的菜单和工具栏按钮(因为这些功能没有实现)。

虚列表的创建本文采用虚列表技术,使得显示信息是在第一次显示的时候才被获取。

为了创建虚列表,在创建之前需要指定列表的风格BOOLCPicViewView::PreCreateWindow(CREATESTRUCT&cs){cs.style&=~LVS_TYPEMASK;cs.style|=LVS_ICON|LVS_OWNERDATA;returnCListView::PreCreateWindow(cs);}同时,因为列表项的Overlay图标也是被动态获取的,所以需要设置动态Overlay图标voidCPicViewView::OnInitialUpdate(){CListView::OnInitialUpdate();GetListCtrl().SetCallbackMask(LVIS_OVERLAYMASK);}缓存显示信息在列表需要显示一个范围的项目之前,列表会发送LVN_ODCACHEHINT通知,应用程序可以捕获这个消息来缓存部分列表的显示信息,以提高性能。

voidCPicViewView::OnOdcachehint(NMHDR*pNMHDR,LRESULT*pResult){NMLVCACHEHINT*pCacheHint=(NMLVCACHEHINT*)pNMHDR;PrepCache(0,min(5,m_arpFolderItems.GetSize()));PrepCache(pCacheHint->iFrom,pCacheHint->iTo);PrepCache(max(0,m_arpFolderItems.GetSize()-5),m_arpFolderItems.GetSize());*pResult=0;}在列表需要显示一个项目之前,列表会发送LVN_GETDISPINFO通知,应用程序可以捕获这个消息来提供项目的显示信息。

VC++6.0定制窗口的方法+框架窗体、文档视图

VC++6.0定制窗口的方法+框架窗体、文档视图
BOOL xxView::PreCreateWindow(CREATESTRUCT&cs) {
//增加的语句 cs.lpszClass=AfxRegisterWndClass(cs-HREDRAW|CS-VREDRAW,0,(HBRUSH))::GetSto ckObject(WHITE-BRUSH),0); return CscrollView::PreCreateWindow(cs); } 其中,cs 的参数 pszClass 用于存放 Windows 窗口类名称。要想注册 Windows 窗口类,则 必须调用全局函数 AfxRegisterWndClass。该函数原型为: LPCTSTR AFXAPI AfxRegisterWndClass(UINTnClassStyle,HCURSOR hCursor=0,HBRUS H hbrBackground=0,HICON hIcon=0)
第7章 框架窗口、文档和视图
7.1 应用程序组成结构
1.单文档应用程序(Single Document Interface,SDI) 在单文档界面程序中,用户在同一时刻只能操一个文
档,如记事本程序。在这些应用程序中,打开文档时会自 动关闭当前打开的活动文档,若文档修改后尚未保存,会 提示是否保存所做的修改。因为一次只开一个窗口,因此 不像WORD那样需要一个窗口菜单。单文档应用程序一般 都提供一个“文件”菜单,在该菜单下有一组命令,用于新 建文档、打开已有文档、保存或另存为等。这类程序相对 比较简单,常见的应用程序有终端仿真程序和一些工具程 序。
(1)AssertValid 函数用来诊断CMainFrame对象的有效性。 (2)Dump 函数用来输出CMainFrame对象的状态信息。 (3)OnCreate 函数用来创建工具栏m_wndToolBar和状态

MFC---视图和窗口

MFC---视图和窗口

MFC---视图和窗⼝视类窗⼝是指程序运⾏后,显⽰信息的那⼀部分。

对应的类是CTestOneView (TestOne 表⽰项⽬名称)类,CTestOneView 类是派⽣于CView 类,⽽CView 类⼜派⽣于CWnd 类。

他们的继承关系可以通过查找类的定义来查看继承关系。

视图类CView ,拥有窗⼝的客户区域,负责显⽰⽂档数据,接受⽤户的输⼊,提供⽂档与⽤户的通信。

视类窗⼝只是主框架窗⼝中空⽩的部分。

主框架窗⼝是指程序运⾏后,程序的整个界⾯。

对应的类是CMainFrame ,CMainFrame 类派⽣于CFrameWnd 类,⽽CFrameWnd 类⼜⼜派⽣于CWnd 类。

主框架窗⼝就是整个应⽤程序外框所包括的部分,主框架窗⼝是视类窗⼝的⼀个⽗窗⼝。

⽂档类CDcoument ,负责维护应⽤程序所需要的数据,提供⼀系列可对这些数据进⾏操作的⽅法,并且能够为视图提供所需的数据。

新建⼀个MFC 单⽂档应⽤程序,项⽬名称为SDITest 。

从项⽬结构中可以看到SDITest 程序中还有⼀个CSDITestDoc 类,它派⽣于CDocument 类,CDocument 类的基类是CCmdTarget ,⽽CCmdTarget ⼜派⽣于CObject 类,从⽽可知这个CSDITestDoc 类不是⼀个窗⼝类,实际上是⼀个⽂档类。

MFC 提供的⽂档/视(Document/View )结构,能够把数据本⾝与它的显⽰分离开,其中⽂档是指CDocument 类,视类是指CView 类。

数据的存储和加载由⽂档类来完成,数据的显⽰和修改则由视类完成,从⽽把数据的管理和显⽰⽅法分离开来。

下⾯介绍⼀下MFC 单⽂档程序是如何将⽂档类对象、框架对象、视类对象组织在⼀起的。

在源⽂件SDITest.cpp 中找到CSDITestApp 类的InitInstance 函数定义,有下⾯这⼀段代码:从上⾯的代码段中可知,定义了⼀个单⽂档模板对象指针pDocTemplate ,这个对象把⽂档对象、框架对象、视类对象有机地组织在⼀起,形成了⼀个有机的整体,程序接着利⽤AddDocTemplate 函数把这个单⽂档模板添加到⽂档模板中,从⽽把这三个类组织为⼀个整体。

windows(2)

windows(2)

第1大题:单选题(重要题:共40题,每题1分,难中易比例2:4:4)1.在Windows编程约定中,软件开发包的英文缩写是______。

(易| 重要)A. APIB. SDIC. SDKD. MDI正确答案:C2.以下对应于unsigned long 的数据类型为:()(易| 重要)A. WORDB. DWORDC. INTD. BYTE正确答案:B3.如果要严格按照匈牙利命名法命名1个全局窗口句柄,以下变量命名正确的是()。

(中| 重要)A. g_hWndB. m_hWndC. g_pWndD. m_pWnd正确答案:A4.典型的Windows窗口程序的流程为:()(中| 重要)A. 注册窗口类->创建窗口->显示窗口->更新窗口->消息循环B. 创建窗口->注册窗口类->显示窗口->更新窗口->消息循环C. 创建窗口->注册窗口类->显示窗口->更新窗口->消息循环D. 注册窗口类->创建窗口->更新窗口->显示窗口->消息循环正确答案:A5.GDI环境中,窗口的坐标系是如何构成的?(易| 重要)A. 左上角为原点,x轴正方向为水平向右,y轴正方向为竖直朝上B. 中间为原点,x轴正方向为水平向右,y轴正方向为竖直朝上C. 左下角为原点,x轴正方向为水平向右,y轴正方向为竖直朝下D. 左上角为原点,x轴正方向为水平向右,y轴正方向为竖直向下正确答案:D6.Windows编程中,定时器消息是()(易| 重要)A. WM_TIMEB. WM_TIMERC. WM_ON_TIMED. WM_COMMAND正确答案:A7.设备环境DC的全称为:(易| 重要)A. Device ContentB. Device ContextsC. Device ConfigD. Device Conter正确答案:B8.进程最常见和最理想的结束方式为:()(中| 重要)A. 主线程的入口函数返回B. 进程中的一个线程调用ExitProcess函数C. 另一个进程中的线程调用TerminateProcess函数D. 进程中的所有线程自行终止运行正确答案:A9.线程正常结束的方式是:()(中| 重要)A. 线程函数返回B. 调用ExitThread函数C. TerminateThreadD. 包含线程的进程终止运行正确答案:A10.两个没有任何安全措施的线程同时对一个数作自增(++)运算,以下说法正确的是:()(难| 重要)A. 自增(++)是原子操作,不会出现错误B. 自增(++)是原子操作,但是两个加法先后顺序未知C. 自增(++)不是原子操作,最后结果是加2D. 自增(++)不是原子操作,最后结果不一定是2正确答案:D11.SetWaitableTimer的参数lPeriod如果为正值,单位是什么?(中| 重要)A. 分钟(m)B. 秒(s)C. 毫秒(ms)D. 纳秒(ns)正确答案:C12.在MFC编程中,如果要显示1个树型视图,那么适合选用的视图类是()。

SubclassWindow用在什么地方[

SubclassWindow用在什么地方[
2.得到句柄hOK=GetDlgItem(IDOK)-> m_hWnd
3.定义变量
CMyButton b;
b.SubclassWindow(hOK);
子类化就是改变一个已创建窗口的行为,即改变窗口函数,SubclassWindow是MFC对此目的进行的简化。
上述方法的好处在于:你可以用普通控件布置对话框。
有两个函数我始终不清楚他的用法
SubclassWindow和SubclassDlgItem
SubclassWindow是MFC对子类化的简化
例:实现一个拖动的button,并在对话框中方便使用,假设对话框中安置了一个普通按钮IDOK。
1.从CButton派生一个CMyButton,实现拖动功能
另外,UnsubclassWindow是必须的善后步骤。
SubclassDlgItem没注意过,但望文生意,应该类似,且在对话框中更方便。
有兴趣的朋友,可以多做些实验,把心得写在这里,大家都会受益。
这两个函数用在你要使用派生类的时候:
假设你有一个CMyButton类,是你写的CButton的派生类。
假设你有一个对话框:CMyDlg
那么你在MyDlg.h文件中为CMyDlg添加一个变量:CMyButton m_btnMine;
在CMyDlg::OnInitDialog函数中你这样:
m_btnMine.SubclassDlgItem( IDC_MY_BUTTON, this );
if (m_edit.GetSafeHwnd() != NULL)
m_edit.UnsubclassWindow();
if (m_listbox.GetSafeHwnd() != NULL)

7 MFC基础知识

7 MFC基础知识
MFC基础知识
MFC中的主要类目
CObject:大部分MFC类的基类.定义对象的创建,删除,串化 命令目标类
– CCmdTarget及其派生类 – 功能:实现对消息的分发处理
窗口支持类
– CWnd及其派生类 – 下一层:
框架窗口:管理视图和文档的窗口; 视图类:提供文档的各种显示和处理方式; 对话框类:作为自定义对话框的基础和提供各种公共对话框; 控件类:代表各类Window标准控件; 控制条类:代表工具栏,状态栏等窗口组件;
对象模型
文档/视图结构的创建过程
文档/视图结构中命令消息的传递
当用户选择了菜单项, 当用户选择了菜单项, 单击了快捷键或工具条 按钮, 按钮,系统就会发送 WM_COMMAND消息.框 消息. 消息 架窗口实际上是大多数 WM_COMMAND消息的接 消息的接 受者, 受者,但WM_COMMAND 消息还可以在视图, 消息还可以在视图,文 档,甚至应用程序类中 被处理. 被处理.

文档/视图结构
单文档应用程序 多文档应用程序
文档/视图 结构
目的:
– 将数据与数据的显示和处理分离; – 一种数据可以有多种显示方式;
实现方法:
– 数据:CDocument封装了数据的输入输出;
真正的数据应该在CDocument的派生类中以数据成员的方式表示;
– 视图:CView及其派生类封装了多种数据的常用显示方式.如:
编写单文档应用程序
1,使用AppWizard创建单文档工程 2,向导帮助建立资源,从CWinApp,CFrameWnd,CView, CDocument派生新的专用类.
– 其中可以选择视图的基类,如CEditView,CListView等.

MFC学习总结 (67个技巧) dlg 上建立View

MFC学习总结 (67个技巧) dlg 上建立View

MFC学习总结(67个技巧) dlg 上建立View1."属性页的添加:创建对话框的类,该类要从CpropertyPage继承;然后在要添加该对话框为属性页的类(头文件)里创建CpropertySheet类的一个对象m_tabsheet和新创建的对话框类的对象m_skatch;最后,在.cpp文件里的OnInitDialog()之类的函数里实现如下代码:m_tabsheet.Create(this, WS_CHILD | WS_VISIBLE, 0);"//使选项卡的按钮在下面"if(m_tabsheet.m_hWnd)"m_tabsheet.ShowWindow(SW_MAXIMIZE);//显示选项卡//加入标签,标签名由各个子对话框的标题栏决定"m_tabsheet.AddPage(&m_skatch);"//用Create来创建一个属性页"m_tabsheet.Create(this, WS_CHILD | WS_VISIBLE, WS_EX_CONTROLPARENT);"RECT rect;"m_tabsheet.GetWindowRect(&rect);"int width = rect.right - rect.left;"int height = rect.bottom - rect.top;""//调整属性页的大小和位置"m_tabsheet.SetWindowPos(NULL, 225, 225, width-82, height,SWP_NOACTIVATE);属性页的添加完成。

如果要添加多个属性页,则只需要增加多个对象,如下:m_tabsheet.AddPage(&m_skatch1);m_tabsheet.AddPage(&m_skatch2);. . . . . .2."List Control中标题栏(Column)的添加:创建一个List Control,其ID为IDC_LIST,在其Styles属性项下的View项里选择Report、Align 项里选择Top、Sort项里选择None.然后在该List所在对话框的类(头文件)里创建ClistCtrl的一个对象m_list然后在.cpp文件的OnInitDialog()之类的函数里实现如下代码:CString strname[3];strname[0]="Screen Name";strname[1]="Form ID";strname[2]="Category Path";for(int i=0;i<3;i++){m_List.InsertColumn(i,strname[i],LVCFMT_LEFT,130);}在这之前也要将List Control的ID与ClistCtrl的对象m_list在DoDataExchange(CDataExchange* pDX)函数里绑定,如下:DDX_Control(pDX, IDC_LIST, m_List);3."ToolBar和StatusBar中控件的添加:方法⑴.只能在ToolBar里创建控件:首先,在ToolBar中创建一个Button,其ID为ID_TOOL_COMBO(我们要将创建的控件放在该Button的位置上).其次,新创建一个类CMainToolBar,要从CToolBar继承(创建过程大概如下:选择工程/增加到工程/新的类;也可以选择工程的根,然后点击右键,选择新的类;或者CTL+W,选择增加类/新的类--- 然后在class type里选择Generic Class,在Name栏里输入新类的名字,Base class 里输入CToolBar),创建成功后在该类里创建要增加的控件的对象,如:CComboBox""m_wndMyCombo;CStatic""m_wndCategory, m_wndCategoryPath;CButton""m_wndOpenButton;Cedit"""m_wndEdit;然后在构造函数里初始化如:m_wndMyCombo.m_hWnd = NULL;m_wndCategory.m_hWnd = NULL;m_wndCategoryPath.m_hWnd = NULL;m_wndOpenButton.m_hWnd = NULL;m_wndEdit.m_hWnd = NULL;接着在CMainframe的头文件里创建CMainToolBar的一个对象m_wndToolBar,最后在.cpp 文件的OnCreate函数的最后实现如下:"int index = 0;"CRect rect;// 可定义在头文件当中"//ComboBox"{""//找到指定的工具项""while(m_wndToolBar.GetItemID(index)!=ID_TOOL_COMBO)"""index++;""//设置指定工具项的宽度并获取新的区域120是宽度""m_wndToolBar.SetButtonInfo(index, ID_TOOL_COMBO, TBBS_SEPARATOR, 120); ""m_wndToolBar.GetItemRect(index, &rect);""""//设置位置""rect.top+=1;""rect.bottom += 200;""""// 创建并显示控件""if(!m_wndToolBar.m_wndMyCombo.Create(WS_CHILD|WS_VISIBLE|CBS_AUTOHSCROLL|"""CBS_DROPDOWNLIST | CBS_HASSTRINGS , rect, &m_wndToolBar,ID_TOOL_COMBO))""{"""TRACE0("Failed to create combo-box\n");"""return FALSE;""m_wndToolBar.m_wndMyCombo.ShowWindow(SW_SHOW);""""//填充内容"""m_wndToolBar.m_wndMyCombo.AddString("25%");""m_wndToolBar.m_wndMyCombo.AddString("50%");""m_wndToolBar.m_wndMyCombo.AddString("75%");"""//选择默认项""m_wndToolBar.m_wndMyCombo.SetCurSel(0);""""//获取到内容并MSGBOX显示出来""CString strContent;""m_wndToolBar.m_wndMyCombo.GetWindowText(strContent);""index = 0;"}其他控件都类似创建(只需要注意一下各自的Create函数的参数即可)。

CListView用法

CListView用法

【转】CListView常用用法〔上〕2010-01-12 17:23一个程序从宏观上来说,不外乎就是输入->处理->输出,输入与输出对一个程序来说至关重要。

前段时间给可视化平台换脸的时候,平台的输出不仅包括直观的图像显示,用户还希望直观地得到每帧图像的一些相关的参数信息、统计信息等,这时候我就选择在CListView中滚动地显示相关信息,并将窗口进行切分,将CListView的窗口放在整个主窗口的最底端,在需要的时候显示,不需要的时候隐藏。

但是,我对CListView的用法不是很熟悉,在查MSDN和从网上查相关用法的时候,要不就是零星地介绍,要不就是只介绍CListCtrl的用法,这让我走了很多弯路,为此,我将从网上查到的用法,结合我的实际应用,简单介绍下CListView的使用,希望对像我一样对CListView不熟悉或刚接触MFC编程的人有所帮助,对一些编程老手、高手来说,这些自然不在话下。

CListView中内置了CListCtrl,所以对CListView的操作实际上就是对内置CListCtrl的操作。

下面就从新建一个CListView的子类开始,我从工程中新建了一个叫做CInfoView的类,基类选择CListView。

1、初始化CListView,设置风格,背景和字体颜色,初始化行列。

该项工作在OnInitialUpdate()中完成,如下所示。

void CInfoView::OnInitialUpdate(){CListView::OnInitialUpdate();// TODO: Add your specialized code here and/or call the base class CListCtrl& m_list = GetListCtrl();//得到内置的listctrl引用LONG lStyle;lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前窗口风格lStyle &= ~LVS_TYPEMASK; //清除显示方式位lStyle |= LVS_REPORT; //设置报表风格SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle); //设置窗口风格DWORD dwStyle = m_list.GetExtendedStyle();//选中某行使整行高亮〔只适用于报表风格的listctrl〕dwStyle |= LVS_EX_FULLROWSELECT;dwStyle |= LVS_EX_GRIDLINES;//网格线〔只适用与报表风格的listctrl〕m_list.SetExtendedStyle(dwStyle); //设置扩展风格m_list.SetBkColor(RGB(200, 200, 200)); //设置背景颜色m_list.SetTextBkColor(RGB(200, 200, 200)); //设置文本背景颜色m_list.SetTextColor(RGB(10, 10, 80)); //设置文本颜色//插入列的标题,为了简单起见,我只插入三列m_list.InsertColumn( 0, "图像帧号", LVCFMT_CENTER, 80 );m_list.InsertColumn( 1, "可见性判断", LVCFMT_CENTER, 110 );m_list.InsertColumn( 2, "置信度结果", LVCFMT_CENTER, 110 );}2、插入一行数据。

处理ListView双击事件的两种方法

处理ListView双击事件的两种方法

处理ListView双击事件的两种方法CListView中鼠标双击事件为NM_DBCLICK,生成的函数为:void CMyList::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult)处理方法有如下两种一、使用函数的参数双击处理函数的参数pNMHDR就带着点中项的序号:NMLISTVIEW* pNMListView = (NMLISTVIEW*)pNMHDR;int nItem = pNMListView->iItem;if ( ( nItem >= 0 ) && ( nItem < m_list.GetItemCount() ) ){// 双击点中处理}二、使用GetSelectionMark()函数long row;row = m_list.GetSelectionMark();if(row==-1) return;else{// 双击点中处理}简单问题:如何最大化、最小化picture控件及其上的位图简单问题:如何最大化、最小化picture控件及其上的位图对话框里有picture控件,控件上的位图是从文件读取的,响应双击事件后,如何使picture控件及上面的图片同时最大化呢?我试过下面这个方法, voidCMFCTestDlg::OnLButtonDblClk(UINT nFlags, CPoint point) { int w= ::GetSystemMetrics(SM_CXFULLSCREEN); int h= ::GetSystemMetrics(SM_CYFULLSCREEN); MoveWindow(0, 0, w, h); CStatic *ps = (CStatic *)GetDlgItem(IDC_IMAGE1); ps->MoveWindow(0, 0, w, h); CDialog::OnLButtonDblClk(nFlags, point); } 但只能使对话框及控件最大化,图片还是原来大小。

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

MFC 在(CListView)列表视图中添加右键菜单使用弹出式菜单(PopMenu)弹出式菜单(PopMenu)大家都熟悉,在WIN98的桌面上单击鼠标右键弹出的菜单就是弹出式菜单。

通常情况下,弹出式菜单在鼠标右键单击时弹出,当然,也可以根据需要随时弹出。

在VC++5的MFC中,管理菜单的类叫CMenu。

下面我向大家介绍建立一个弹出式菜单的基本方法。

一、在资源编辑器中建立一个菜单资源新建一个菜单资源,比如把菜单的ID号为IDC_POPMENU。

此菜单有一项两层,即有一个可弹出的菜单项,而此菜单项的弹出内容即为将要建立的弹出式菜单的内容。

至于每一个菜单项的消息映射,与一般的菜单相同。

二、使用CMenu类对象CMenu类的成员函数较多,但建立弹出式菜单只需用到其中几个成员函数。

1、LoadMenu函数功能:从应用程序的可执行文件中加载菜单资源原型:BOOL LoadMenu( UINT nIDResource );其中nIDResource是菜单资源的ID号,这里用的是刚建立的IDC_POPMENU。

2、GetSubMenu函数功能:此函数用于得到子菜单的指针。

原型:CMenu* GetSubMenu( int nPos ) const;nPos为层数,0为第一层子菜单……以此类推。

由于我们需要的是“可弹出项”的第一层子菜单,因此用GetSubMenu(0)来得到第一层子菜单的类指针。

3、TrackPopupMenu函数功能:在指定位置显示弹出菜单,并跟踪所选择的项原型:BOOL TrackPopupMenu( UINT nFlags,int x,int y,CWnd*pWnd,LPCRECT lpRect = NULL );其中:{nFlags为屏幕坐标属性和鼠标坐标属性屏幕坐标属性:TPM_CENTERALIGN 横向将菜单以x居中TPM_LEFTALIGN 横向将菜单以x左对齐TPM_RIGHTALIGN 横向将菜单以x右对齐鼠标按键属性(只在响应WM_CONTEXTMENU消息时有效):TPM_LEFTBUTTON 连续按鼠标右键不会连续弹出菜单,鼠标右键不可用于选定菜单项TPM_RIGHTBUTTON 连续按鼠标右键会连续弹出菜单,鼠标右键可用于选定菜单项x,y均为屏幕坐标lpRect 菜单所占的区域。

如果为NULL,当用户在菜单以外的区域按鼠标键时,菜单会消失}三、具体实现方法用ClassWizard中的“Add Windows Message Handler”功能,添加对NM_RCLICKT消息的响应函数,函数中代码如下,注释很详细,在vc6+win2000环境下调试成功,大家感兴趣的话自己试试吧:void CListctrlTestDlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult) {// TODO: Add your control notification handler code hereCListCtrl *CList =(CListCtrl *) GetDlgItem(IDC_LIST1); //获取当前列表控件的指针CMenu menu ,* pSubMenu; //定义下面要用到的cmenu对象menu.LoadMenu(IDR_POPMENU); //装载自定义的右键菜单pSubMenu = menu.GetSubMenu(0); //获取第一个弹出菜单,所以第一个菜单必须有子菜单CPoint oPoint; //定义一个用于确定光标位置的位置GetCursorPos( &oPoint); //获取当前光标的位置,以便使得菜单可以跟随光标int istat=CList->GetSelectionMark(); //用istat存放当前选定的是第几项CString pString =CList->GetItemText(istat,0); //获取当前项中的数据,0代表是第0列// pString="您选择的项是:"+pString ; //显示当前选择项// MessageBox(pString);//显示当前选中的路径pSubMenu->TrackPopupMenu (TPM_LEFTALIGN, oPoint.x, oPoint.y, this);//在指定位置显示弹出菜单*pResult = 0;}添加行列2009-04-13 10:09添加列:LVCOLUMN lvc;lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;lvc.fmt = LVCFMT_LEFT;lvc.cx = 48;lvc.iSubItem = 0;lvc.pszText = "序号";GetListCtrl().InsertColumn(lvc.iSubItem, &lvc);添加行:LVITEM lvi;lvi.mask=LVIF_TEXT;lvi.iItem=GetListCtrl().GetItemCount();lvi.iSubItem=0;lvi.pszText="lkdjfd";GetListCtrl().InsertItem(&lvi);lvi.iSubItem=1;lvi.pszText="sdfsdfsd";GetListCtrl().SetItem(&lvi);....【IT168 新手入门】使用弹出式菜单(PopMenu)弹出式菜单(PopMenu)大家都熟悉,在WIN98的桌面上单击鼠标右键弹出的菜单就是弹出式菜单。

通常情况下,弹出式菜单在鼠标右键单击时弹出,当然,也可以根据需要随时弹出。

在VC++5的MFC中,管理菜单的类叫CMenu。

下面我向大家介绍建立一个弹出式菜单的基本方法。

一、在资源编辑器中建立一个菜单资源新建一个菜单资源,比如把菜单的ID号为IDC_POPMENU。

此菜单有一项两层,即有一个可弹出的菜单项,而此菜单项的弹出内容即为将要建立的弹出式菜单的内容。

至于每一个菜单项的消息映射,与一般的菜单相同。

二、使用CMenu类对象CMenu类的成员函数较多,但建立弹出式菜单只需用到其中几个成员函数。

1、LoadMenu函数功能:从应用程序的可执行文件中加载菜单资源原型:BOOL LoadMenu( UINT nIDResource );其中nIDResource是菜单资源的ID号,这里用的是刚建立的IDC_POPMENU。

2、GetSubMenu函数功能:此函数用于得到子菜单的指针。

原型:CMenu* GetSubMenu( int nPos ) const;nPos为层数,0为第一层子菜单……以此类推。

由于我们需要的是“可弹出项”的第一层子菜单,因此用GetSubMenu(0)来得到第一层子菜单的类指针。

3、TrackPopupMenu函数功能:在指定位置显示弹出菜单,并跟踪所选择的项原型:BOOL TrackPopupMenu( UINT nFlags,int x,int y,CWnd* pWnd,LPCRECT lpRect = NULL );其中:nFlags为屏幕坐标属性和鼠标坐标属性屏幕坐标属性:TPM_CENTERALIGN 横向将菜单以x居中TPM_LEFTALIGN 横向将菜单以x左对齐TPM_RIGHTALIGN 横向将菜单以x右对齐鼠标按键属性(只在响应WM_CONTEXTMENU消息时有效):TPM_LEFTBUTTON 连续按? 右键不会连续弹出菜单,鼠标右键不可用于选定菜单项TPM_RIGHTBUTTON 连续按鼠标右键会连续弹出菜单,鼠标右键可用于选定菜单项x,y均为屏幕坐标lpRect 菜单所占的区域。

如果为NULL,当用户在菜单以外的区域按鼠标键时,菜单会消失.三、具体实现方法用ClassWizard中的“Add Windows Message Handler”功能添加对NM_RCLICKT消息的响应函数,函数中代码如下,注释很详细,在vc6+win2000环境下调试成功,大家感兴趣的话自己试试吧:void CListctrlTestDlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult){// TODO: Add your control notification handler code hereCListCtrl *CList =(CListCtrl *) GetDlgItem(IDC_LIST1); //获取当前列表控件的指针CMenu menu ,* pSubMenu; //定义下面要用到的cmenu对象menu.LoadMenu(IDR_POPMENU); //装载自定义的右键菜单pSubMenu = menu.GetSubMenu(0);//获取第一个弹出菜单,所以第一个菜单必须有子菜单CPoint oPoint;//定义一个用于确定光标位置的位置GetCursorPos( &oPoint);//获取当前光标的位置,以便使得菜单可以跟随光标int istat=CList->GetSelectionMark();//用istat存放当前选定的是第几项CString pString =CList->GetItemText(istat,0);//获取当前项中的数据,0代表是第0列// pString="您选择的项是:"+pString ;//显示当前选择项// MessageBox(pString);//显示当前选中的路径pSubMenu->TrackPopupMenu (TPM_LEFTALIGN, oPoint.x, oPoint.y, this); //在指定位置显示弹出菜单*pResult = 0;}CListView中对List Item的排序收藏CListView中对List Item的排序CListView类中包含了一个CListCtrl类的引用,并由这个CListCtrl 类实现了List View窗口,窗口中包含了由程序添加的List Item。

List Item则以LVITEM结构形式存在。

在一个ListView窗口中,当所有的Item以Report的形式出现时,应该允许用户单击列标题,然后以该列的顺序进行升序排序或反序排序List Item。

当用户单击列标题时,我们可在该动作的响应函数中调用CListCtrl 类的SortItems函数来实现排序。

相关文档
最新文档