如下图:
我想实现的是,使用下面函数
void CListBoxEx::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if( bCalcValidRects )
{
lpncsp[0].rgrc->top += 24;
} CListBox::OnNcCalcSize(bCalcValidRects, lpncsp);
}
使ListCtrl和ListBox的头部空出来一部分,我好在这个空出来的这部分里写上需要的说明文字,但是出现 图中所示的问题,ListBox和ListCtrl中的内容均是到099结束,从图中可以发现ListBox的数据显示完全了,而ListCtrl的内容显示不完全,只显示到097,098都还没显示完,下面就没显示了,我估计是使用了OnNcCalcSize的处理后导致ListCtrl的内容绘制时没有计算我增加的24这个高度引起的,请大家帮我想想怎么解决这个问题。
我想实现的是,使用下面函数
void CListBoxEx::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if( bCalcValidRects )
{
lpncsp[0].rgrc->top += 24;
} CListBox::OnNcCalcSize(bCalcValidRects, lpncsp);
}
使ListCtrl和ListBox的头部空出来一部分,我好在这个空出来的这部分里写上需要的说明文字,但是出现 图中所示的问题,ListBox和ListCtrl中的内容均是到099结束,从图中可以发现ListBox的数据显示完全了,而ListCtrl的内容显示不完全,只显示到097,098都还没显示完,下面就没显示了,我估计是使用了OnNcCalcSize的处理后导致ListCtrl的内容绘制时没有计算我增加的24这个高度引起的,请大家帮我想想怎么解决这个问题。
解决方案 »
- VC与Excel混合编程,怎么样去年掉次要网格线?
- 大家讨论下:重载CEdit,实现3D圆角多功能文本框(其中大部分功能我已经完成)
- 用对话框通过按钮的形式弹出另一个对话框,第二个对话框上要显示一个图片,那个图片显示代码要填在什么位置啊?
- 希望哪位能帮帮忙,为什么重复弹起验证框?
- 关于CListCtrl::GetItemText问题
- 在VC中用chtmlview实现了一个浏览器,怎样取得里面那个IE控件的高度
- 问一个关于CTreeCtrl的问题
- 急!怎样在文档/视图、对话框中镶入显示EXCEL或WORD文档,并且如何控制?
- 如何获得菜单名称或者菜单ID
- 怎样把LPCTSTR的数据转换成CString的数据啊?!
- window消息循环的作用是什么?
- 关于多线程的问题
CListCtrl::EnsureVisible
OnInitdialog()中代码如下: for( int i = 0; i < 100; i++ )
{
CString str;
str.Format( _T("%03d 中华人民共和国"),i );
m_ListCtrl.InsertItem( i,str );
m_ListCtrl.SetItemText( i,1,_T("中华人民共和国") );
}
我直接搞个SetTimer( 1,1000,NULL );
在定时器中 m_ListCtrl.EnsureVisible( 98,TRUE );
m_ListCtrl.EnsureVisible( 99,TRUE );
99依然不可见,EnsureVisible所做的操作是:如果nItem在0 , 1 这样的头几个的项目上,最后98 ,99 项目不可见时,他自动把滚动条向下滚,让98 99 可见, 但在这里仍然解决不了这个问题。
VS2008的代码 可以试一下的,就知道了。
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if( bCalcValidRects )
{
lpncsp[0].rgrc->top += 24;
} CListBox::OnNcCalcSize(bCalcValidRects, lpncsp);
}里除了上面的设置数值之外,是不是还有什么可以设置的地方,来解决这个问题,我查了MSDN等,也试过很多种,始终解决不了。
晕,这样还是解决不了问题啊。右边的ListCtrl还是没有解决的。我要菜单的美化类里看到他们有这样的处理:
//这里他用自己方法重载的OnNcCalcsize函数,没有了第一个参数。
void CMenuWndHook::OnNcCalcsize(NCCALCSIZE_PARAMS* lpncsp)
{
lpncsp->rgrc[0].right -= 4;
lpncsp->rgrc[0].bottom -= 4;
}然后在void CMenuWndHook::OnWindowPosChanging(WINDOWPOS *pWindowPos)
{
pWindowPos->cx += 4;
pWindowPos->cy += 4;
}他这样可以解决菜单的增大非客户区面积,同时客户区面积也不受影响,就是客户区也能完全显示。
我把这个方法用在ListCtrl里,发现对于ListCtrl还是不行。
void CListBoxEx::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
lpncsp[0].rgrc->top += 24;
CListBox::OnNcCalcSize(bCalcValidRects, lpncsp);
}
lpncsp[0].rgrc->top += 24;还是lpncsp->rgrc[0].top += 24;你是不是还将lpncsp->rgrc[0]的bottom也减小了某个数值?
同用的,刚试过,你这里写的是CListBox的类的代码,实际是CListBox类用我说的这种方法处理没有任何问题,只是CListCtrl用同样的方法处理时才会出问题的。
你这么一说我才发现我上面写的代码中的确有这个问题,实际上应该是lpncsp->rgrc[0].top += 24;这样才对的,lpncsp[0].rgrc->top += 24;这种写法应该是错误的,可是不知道为什么居然编译也没有问题,效果和前面的一样。lpncsp->rgrc[0]的bottom值减少不减少都解决不了问题,我试过了。很奇怪,我在怀疑MFC内部的CListCtrl处理机制可能和标准控件有差别导致这个现象的。
typedef struct tagNCCALCSIZE_PARAMS {
RECT rgrc[3];
PWINDOWPOS lppos;
} NCCALCSIZE_PARAMS;rgrc是结构体的第一个成员变量,lpncsp[0]和lpncsp->rgrc[0]的内存地址是一样的.就像在数据中,Buf[0]和Buf的内存地址是一样的.所以并没有错,如果lppos定义在rgrc的上面就错了
lpncsp[0].rgrc->bottom+=30;
的确画到外面了,你仔细看看就知道了,而且在你的电脑上和我的电脑上有区别,我的电脑上下面出来了很高的一段,就是说画在外面画了很高的一段。不仅水平滚动条有问题,垂直滚动条也被盖住了一部分。我就是奇怪为什么ListBox控件用同样的操作方式就没有问题,而ListCtrl就不行。肯定是ListCtrl在绘制客户区的内容时区域判断和别的不一样,微软这点真是不好。