多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
第十章 界面装饰 第一节 列表项图标设置 第二节 列表标头图标设置 第三节 列表项排序 第四节 窗口颜色控制 第五节 自绘按钮 第六节 自绘组合控件 第七节 自绘列表控件 第八节 WM_DRAWITEM和WM_MEASUREITEM消息 第九节 相关类库介绍表 (CImageList类、CBitmapButton类和CComboBoxEx类等) * * * * * ## 提纲一 一、在MSDN的索引页面键入“SetImageList”后回车,显示有七个类支持该函数. a)对应的控件包括:列表控件、树形控件和标签控件等。 b)这些控件的特点是内部都包含多个控件项,因此SetImageList函数主要用于控件项的图标设置。 二、使用图像列表类设置列表控件项图标的步骤如下: a)调用CImageList::Create函数建立图像列表; b)调用CImageList::Add函数向图像列表里加入多个图标,之后SetImageList到具体控件中去; c)调用CListCtrl::InsertItem函数在列表控件内新插入列表项时,在第3个参数指定图标索引; d)对于已经插入的列表项的图标更改要调用CListCtrl::SetItem函数,通过LVITEM 结构体的iImage成员指定图标。 三、使用图像列表类设置列表控件的标头图标步骤如下: a)调用CImageList::Create函数建立图像列表; b)调用CImageList::Add函数向图像列表里加入多个图标,之后SetImageList到具体控件中去; c)对于已经插入的列表标头的图标更改要调用CListCtrl::SetItem函数: 通过HDITEM结构体的mask设置HDI_IMAGE|HDI_FORMAT开关,iImage成员指定图像列表内的图标索引, frm子开关可以显示和删除图标或文字。 四、CListCtrl::SetItem的多种功能使用:(反之GetItem函数也一样能代替以下所有函数的反函数) a)通过LVITEM结构体的mask成员指定LVIF_TEXT,代替CListCtrl::SetItemText函数设置列表项文字; b)通过LVITEM结构体的mask成员指定LVIF_IMAGE,用于设置列表项的图标; c)通过LVITEM结构体的mask成员指定LVIF_PARAM,代替CListCtrl::SetItemData函数设置列表项附带数据; d)通过LVITEM结构体的mask成员指定LVIF_STATE,代替CListCtrl::SetItemState函数设置列表项附带数据; * * * * * ## 提纲二 一、CListCtrl::SetItem的多种功能使用:(反之GetItem函数也一样能代替以下所有函数的反函数) a)通过LVITEM结构体的mask成员指定LVIF_TEXT,代替CListCtrl::SetItemText函数设置列表项文字; b)通过LVITEM结构体的mask成员指定LVIF_IMAGE,用于设置列表项的图标; c)通过LVITEM结构体的mask成员指定LVIF_PARAM,代替CListCtrl::SetItemData函数设置列表项附带数据; d)通过LVITEM结构体的mask成员指定LVIF_STATE,代替CListCtrl::SetItemState函数设置列表项附带数据; 二、CListCtrl::SortItems及排序规则函数的详细使用方法,可以参见MSDN中的函数说明。 a)回调函数必须是C格式全局函数或者静态的类成员函数; b)这类函数中都没有this指针,因此也就不能在回调函数中调用类的成员变量和成员函数; c)SortItems函数的第二个参数,是用于传递给回调函数的第三个参数的; d)可以参数传递方式将一个类对象的地址以32位变量的方式传入到回调函数中, 这样才能间接地访问到类对象的成员。 三、父窗口和控件子窗口的颜色控制,主要有以下几种方法: a)调用CWinApp:: SetDialogBkColor函数,设置对话框背景颜色和静态文本颜色; b)WM_ERASEBKGND的消息映射函数颜色控制的对象,只包括父窗口自身的背景和文字颜色; c)WM_CTLCOLOR的消息映射函数颜色控制的对象,不但包括父窗口自身的背景和文字颜色, 而且还包括静态文本控件、编辑控件以及组合控件等。 * * * * * ## 提纲二 一、自绘控件:显示内容交给开发者来管理,其他鼠标和键盘操作仍由系统管理。 a)建立控件类的派生类; b)重写DrawItem自绘虚函数; c)将一个对应类型控件的风格中加入OwnerDraw属性; d)一定要用派生类为具有该属性的控件定义关联变量; e)(含有)多项控件自绘还可以重写MeasureItem函数对每个控件项管理。 例如:组合控件包括三种自绘类型(Owner draw): No:不自绘,由系统提供列表文字的显示 Fixed:每个列表项的高度是固定的 Variable:每项的高度不固定,由MeasureItem函数设定 二、WM_DRAWITEM消息: a)WM_DRAWITEM消息,一般用于在父窗口中建立消息映射函数; b)如果父窗口内有一个或多个具有自绘属性的控件,对所有具有自绘属性的的子窗口进行更新; (在WM_PAINT消息映射函数执行后,就立即执行WM_DRAWITEM的消息映射函数OnDrawItem) c)在消息映射函数OnDrawItem中,执行基类函数CWnd::OnDrawItem将回调路由, 进入每个自绘子窗口关联的派生类的虚函数DrawItem中。 三、WM_MEASUREITEM消息: a)WM_MEASUREITEM消息也同样一般在父窗口中建立消息映射函数; b)在一些具有自绘属性的列表类控件添加列表项时,产生WM_MEASUREITEM消息回调。 c)在消息映射函数OnMeasureItem中,执行基类函数CWnd::OnMeasureItem将回调路由, 进入每个自绘子窗口关联的派生类的虚函数MeasureItem中。 * * * * * ## 提纲三 一、WM_DRAWITEM消息: a)WM_DRAWITEM消息,一般用于在父窗口中建立消息映射函数; b)如果父窗口内有一个或多个具有自绘属性的控件,对所有具有自绘属性的的子窗口进行更新; (在WM_PAINT消息映射函数执行后,就立即执行WM_DRAWITEM的消息映射函数OnDrawItem) c)在消息映射函数OnDrawItem中,执行基类函数CWnd::OnDrawItem将回调路由, 进入每个自绘子窗口关联的派生类的虚函数DrawItem中。 二、WM_MEASUREITEM消息: a)WM_MEASUREITEM消息也同样一般在父窗口中建立消息映射函数; b)在一些具有自绘属性的列表类控件添加列表项时,产生WM_MEASUREITEM消息回调。 c)在消息映射函数OnMeasureItem中,执行基类函数CWnd::OnMeasureItem将回调路由, 进入每个自绘子窗口关联的派生类的虚函数MeasureItem中。 三、内存泄漏:在堆内动态开辟的空间(new),在使用完毕后未释放(delete), 结果导致一直占据该内存单元。直到程序结束。MFC软件工程在调试结束后会自动显示内存泄漏的次数和位置。 (按F4快捷键遍历)