要隐藏ClistCtrl中的某一列,怎么做

 我来答
miniappYoh44tFFDbwZi
2016-01-03 · 请开发者输入账号签名
miniappYoh44tFFDbwZi
采纳数:14074 获赞数:18289

向TA提问 私信TA
展开全部
要隐藏ClistCtrl中的某一列,怎么做。需要的时候再把它显示出来,不把列的宽度设置为0
要隐藏ClistCtrl中的某一列
海姹网(网址:http://www.seacha.com),标签:要隐藏ClistCtrl中的某一列,怎么做, 隐藏,某一列
==这个宽度肯定是要设置为0的,更关键的是要取消对列头拖拉的事件响应
派生CHeaderCtrl子类,响应OnChildNotify。过滤掉TRACK事件。例子如下:
//锁定第一列
BOOL CSortHeaderCtrl::OnChildNotify(UINT msg, WPARAM wp, LPARAM lp, LRESULT* pRes)
{
NMHDR& nmh = *(NMHDR*)lp;
海姹网(网址:http://www.seacha.com),标签:要隐藏ClistCtrl中的某一列,怎么做, 隐藏,某一列
if (nmh.code == HDN_BEGINTRACKA || nmh.code == HDN_BEGINTRACKW
||nmh.code == HDN_DIVIDERDBLCLICKA ||nmh.code == HDN_DIVIDERDBLCLICKW)
{
CRect rc;
GetItemRect(0,rc);
海姹网(网址:http://www.seacha.com),标签:要隐藏ClistCtrl中的某一列,怎么做, 隐藏,某一列
CPoint pt;
GetCursorPos(&pt);
ScreenToClient(&pt);
if(pt.x < rc.Width() + 5)
return *pRes=TRUE; // eat message to disallow sizing
海姹网(网址:http://www.seacha.com),标签:要隐藏ClistCtrl中的某一列,怎么做, 隐藏,某一列
}
// otherwise, pass to header control for default processing
return CHeaderCtrl::OnChildNotify(msg, wp, lp, pRes);

}
OnChildNotify的定义:
海姹网(网址:http://www.seacha.com),标签:要隐藏ClistCtrl中的某一列,怎么做, 隐藏,某一列
virtual BOOL OnChildNotify(UINT msg, WPARAM wp, LPARAM lp, LRESULT* pRes);
自己重载 一个 ,所有的显示出来的内容 用一个 LIST 保存,隐藏的用 另外一个 LIST 保存。。。。。。。。。。。。。。。。。。。。。每次根据 保存显示的 LIST 添加数据
剩下的不用说了吧 ,呵呵, LIST 为 容器
海姹网(网址:http://www.seacha.com),标签:要隐藏ClistCtrl中的某一列,怎么做, 隐藏,某一列
HDN_BEGINTRACK
void CMyHeader::OnBeginTrack(NMHDR* pNMHDR, LRESULT *pResult)
{
NMHEADER *pnmhd = (NMHEADER*)pNMHDR;
if( 如果这个项不允许被拖动:(pnmhd->iItem))
{
*pResult = 1;
海姹网(网址:http://www.seacha.com),标签:要隐藏ClistCtrl中的某一列,怎么做, 隐藏,某一列
}
else
{
*pResult = 0;
}
}
海姹网(网址:http://www.seacha.com),标签:要隐藏ClistCtrl中的某一列,怎么做, 隐藏,某一列
现在我在BOOL CSortHeaderCtrl::OnChildNotify(UINT msg, WPARAM wp, LPARAM lp, LRESULT* pRes)
里面GetParent()->SendMessage(WM_NOTIFY, 0, lParam);这样了一下,
就是变成CListCtrl也收到HDN_TRACK这个消息了(不加CListCtrl收不到)
这样可行吗,还是我再自定义个消息,WM_NOTIFY可能会造成混乱?
-------------------------------------------------------------------
海姹网(网址:http://www.seacha.com),标签:要隐藏ClistCtrl中的某一列,怎么做, 隐藏,某一列
用把列宽设置为0的方法,有个问题就是在界面上用鼠标拖动表头改变列的宽度时,这个列又显示出来了,要做到完全的隐藏就做一个CHeaderCtrl的派生类,设定隐藏列变量,处理HDN_BEGINTRACK和HDN_ITEMCHANGING通知,发现当前列为隐藏列则不进行默认处理。
或者直接用两个CListctrl控件,一个多1列,一个少1列,分别隐藏显示他们。这样最简单,效果也不错的。呵呵!
海姹网(网址:http://www.seacha.com),标签:要隐藏ClistCtrl中的某一列,怎么做, 隐藏,某一列
http://www.zahui.com/html/1/3774.htm
ListCtrl中HeaderCtrl的失效问题
曾经做过让某列HeaderCtrl失效的功能,主要是想保持HeaderCtrl宽度不变,方法是重载ListCtrl的虚函数OnNotify,在这个函数中判断某个列的索引iSubItem,如果是要失效的HeaderCtrl则设置*iResult = TRUE表示消息不再往下处理,同时return,代码如下:
海姹网(网址:http://www.seacha.com),标签:要隐藏ClistCtrl中的某一列,怎么做, 隐藏,某一列
BOOL CStyleList::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
// TODO: Add your specialized code here and/or call the base class
NMHEADER* pNMHeader = (NMHEADER*)lParam;
if (pNMHeader->iItem == 0)
{
*pResult = TRUE;
return TRUE;
}

return CListCtrl::OnNotify(wParam, lParam, pResult);
}
其结果是,被失效的HeaderCtrl向ListCtrl发送的所有通知消息都不被处理,导致对HeaderCtrl的拉动、拖拽等功能将全部失效。
现在,我要做一个很简单的功能:在这个失效HeaderCtrl上设置一个位图图标,由于这个HeaderCtrl的通知消息全部都不被ListCtrl处理,设置位图的操作因此也失效了,是需要改进代码的时候了:
BOOL StyleList::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
// TODO: Add your specialized code here and/or call the base class
NMHEADER* pNMHeader = (NMHEADER*)lParam;
if (pNMHeader->iItem == 0 && ((pNMHeader->hdr.code == HDN_BEGINTRACKW) | (pNMHeader->hdr.code == HDN_DIVIDERDBLCLICKW)))
{
*pResult = TRUE;
return TRUE;
}

return CListCtrl::OnNotify(wParam, lParam, pResult);
}
保持HeaderCtrl宽度不变,当然是不能随意左右拉动HeaderCtrl。除此之外,我注意到当在两个HeaderCtrl之间双击也会造成HeaderCtrl的宽度变化,因此,需要屏蔽这两个通知消息码:
HDN_BEGINTRACKW : 当开始调整HeaderCtrl宽度时
HDN_DIVIDERDBLCLICKW:当在两个HeaderCtrl之间双击改变HeaderCtrl宽度时
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式