关于CListCtrl::GetSubItemRect()的问题

今天扩展List控件,调用CListCtrl::GetSubItemRect()获取subItem==0项的rect时出了问题,我用TRACE打印数据发现left和right的数值是不正确的,似乎获取到的是整个list控件的大小,后来查了一下MSDN,里面写着:

iSubItem

The one-based index of the subitem.

无语死了。。。。。

重写CListCtrl::GetSubItemRect()算哒。。。。。

BOOL GetSubItemRect( int nItem, int nSubItem, int nArea, CRect& rect )
{
    ASSERT(nItem >= 0);
    ASSERT(nItem < GetItemCount());
    if ((nItem < 0) || nItem >= GetItemCount())
        return FALSE;
    ASSERT(nSubItem >= 0);
    ASSERT(nSubItem < GetHeaderCtrl()->GetItemCount());
    if ((nSubItem < 0) || nSubItem >= GetHeaderCtrl()->GetItemCount())
        return FALSE;

    BOOL bRC = CListCtrl::GetSubItemRect(nItem, nSubItem, nArea, rect);

    if (nSubItem == 0)
    {
        int offset = rect.left;

        CRect firstColumnRect;
        GetHeaderCtrl()->GetItemRect(0, &firstColumnRect);
        rect.left = firstColumnRect.left + offset;
        rect.right = firstColumnRect.right + offset;
    }

    return bRC;
}

-_-这下好了。

时间: 2024-11-04 15:28:32

关于CListCtrl::GetSubItemRect()的问题的相关文章

可编辑子项的CListCtrl类

一.说明 大家都知道在MFC中通过给CListCtrl设置LVS_EDITLABELS属性,并且在程序中响应控件的LVN_ENDLABELEDIT消息可以修改列表控件每一行的第一项,也就是主项(Item).代码如下: void CEditListCtrlSampleDlg::OnEndlabeleditList1(NMHDR* pNMHDR, LRESULT* pResult) { LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR; // TODO: A

MFC 列表控件CListCtrl加载类似QQ界面的头像与文字

本文主要讲述使用VS2012 MFC的CListCtrl(列表)控件加载类似于QQ界面的图片与文字数据.主要通过CListCtrl::InsertColumn.InsertItem.SetItemText向列表插入数据,CImageList插入BMP图片或ICON图标. 一.创建项目及界面 1.创建项目     创建项目名为"QQList"的基于MFC对话框的应用程序.资源视图中对话框IDD_QQLIST_DIALOG删除"TODE"和按钮,并添加List Cont

软件-CListCtrl 复选框 单行颜色绘制

问题描述 CListCtrl 复选框 单行颜色绘制 我想做一个CListCtrl Report风格扩展复选框的软件通过 选择复选框表示要测试的数据比如说分数高于60分的标注绿色低于60分的标注红色, 但是复选框和绘制颜色不兼容怎么处理?? 解决方案 复选框单独放在一列上,这一列不要绘制.或者连复选框一起重绘.

改变CListCtrl、CHeaderCtrl高度、字体、颜色和背景

一.实现过程 1.表头修改 新建一个MFC类CHeaderCtrlCl,其基类为CHeaderCtrl,响应OnPaint消息实现自绘,实现代码请看源代码(由于代码较占篇幅,所以就不贴上来了,抱歉),在头文件中定义函数 LRESULT OnLayout( WPARAM wParam, LPARAM lParam ),之后手动添加消息响应ON_MESSAGE(HDM_LAYOUT, OnLayout),在消息响应中改变高度,实现代码如下: LRESULT CHeaderCtrlCl::OnLayo

修改一个完全颜色的CListCtrl类

在使用CListCtrl控件的过程中,我们会发现使用及其不方便,特别是在使用"report"显示模式时, 想给指定条目添加背景颜色,CListCtrl控件所提供的设置颜色函数只能使得控件的界面变得好看一些,根本不能满足我们的要求,我们无法把特定的一项或几项添加上不同的颜色以示区别. 幸运的是很多VC的使用者在改造CListCtrl类,使之更加功能强大上做了很多工作,开发出了各种各样的继承类来实现这个功能,Sven Freitag 就是其中的一员.他开发出了CListCtrl的继承类CC

VC可设置单元格颜色的ClistCtrl类

一.说明: CListCtrl控件简单易用,美中不足的是不能设置单元格的颜色,作者试着扩展了CListCtrl类,提供了一个可设置单元格颜色的函数, SetItemColor(int nItem, int nSubItem, COLORREF clrText, COLORREF clrBkgnd). 本类参考自 vckbase "列表控件排序功能的实现"(作者/王骏 ) ,在使用本类前,请先参考该文. 示例程序运行效果如图一: 图一 示例程序运行效果图 二.原理 在ListCtrl绘制

导出CListCtrl控件到Excel文件

CListCtrl获得列的属性可以使用BOOL CListCtrl::GetColumn( int nCol, LVCOLUMN* pColumn ),nCol为需要获得获得属性值的列序号,pColumn 为 LVCOLUMN 结构体的指针.LVCOLUMN结构体中的 UINT mask 作为输入,决定返回哪些属性的值,如果 mask 的值包含 LVCF_TEXT ,则需要将字符串缓存的首地址指针置入结构体中的 LPTSTR pszText; 变量,缓存大小置入 int cchTextMax;

ADO操作access全过程和CListCtrl的用法

一个ADO和CList的示例程序: 使用ADO操作access数据库.增加,删除,修改,查询 CListCtrl左键取的所在行的数据,右键双击删除该行. 程序图例 本文配套源码

MFC父窗口控制子窗口CListCtrl控件刷新的问题

问题描述 MFC父窗口控制子窗口CListCtrl控件刷新的问题 目标:父窗口单击按钮,向子窗口发送一个消息:子窗口的消息处理函数中,调用列表显示函数来刷新列表数据. 我的代码: // 父窗口void CDlg4::OnButtonClick(){ CDlg43 *dlg = new CDlg43(); dlg->Create(IDD_DIALOG_43this); if (NULL == dlg) { AfxMessageBox(""failed""); d