如果修改CListCtrl的HeaderCtrl?

Flood1984 2007-01-30 05:02:23
我想修改ListCtrl中标题的大小和显示文字(需要自绘标题)。
我现在已经有了自绘的类CMyListCtrl和CMyHeaderCtrl。
怎样才能把CMyHeaderCtrl嵌入到CMyListCtrl中?
...全文
485 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Flood1984 2007-02-01
  • 打赏
  • 举报
回复
子类化成功了,可是HeaderCtrl不能接收到WM_DRAWITEM消息。
郁闷,算了,不研究了,直接PAINT。
Flood1984 2007-01-31
  • 打赏
  • 举报
回复
不是创建不成功,
ASSERT(m_hWnd == NULL);//这一句的意思应该是要保证n_hWnd为NULL。
所以不是没创建成功,恰恰相反,他就是要不存在才好。
问题出在哪儿?
SubclassWindow应该怎么用?这个问题只能用SubclassWindow来解决么?
crumpy 2007-01-31
  • 打赏
  • 举报
回复
这里也写错了^_^!, 应该是:

// this will have a valid HWND
TRACE("HEADER HWND = %08x\n", ::GetDlgItem(m_hWnd, 0));
mynamelj 2007-01-31
  • 打赏
  • 举报
回复
那就是你的m_headerCtrl控件创建不成功
crumpy 2007-01-31
  • 打赏
  • 举报
回复
最后一行写错了, 应该是

m_headerCtrl.SubclassWindow( GetHeaderCtrl()->m_hWnd );



m_headerCtrl.SubclassWindow( ::GetDlgItem(m_hWnd, 0) );

crumpy 2007-01-31
  • 打赏
  • 举报
回复
改成下面的样子试试:

void CMyListCtrl::PreSubclassWindow()
{
CListCtrl::PreSubclassWindow();

// this will force the HEADER CTRL to be created
InsertColumn(0, _T(""));
DeleteColumn(0);

// this will have a valid HWND
TRACE("HEADER HWND = %0x8\n", ::GetDlgItem(m_hWnd, 0));

m_headerCtrl.SubclassWindow(m_headerCtrl.m_hWnd);
}
Flood1984 2007-01-31
  • 打赏
  • 举报
回复
按照楼上的方法,结果有ASSERT错误。
跟踪得到是在调用SubclassWindow时,
SubclassWindow调用了Attach(HWND hWndNew),
Attach()中的ASSERT(m_hWnd == NULL);失败。
怎么解决?我的代码如下:
void CMyListCtrl::PreSubclassWindow()
{
CListCtrl::PreSubclassWindow();
CRect rc;
GetClientRect(&rc);
m_headerCtrl.Create(HDS_HORZ|HDS_BUTTONS|CCS_TOP,CRect(0,0,rc.right,m_headerHeight),this,1);
// GetHeaderCtrl()->UnsubclassWindow();
GetHeaderCtrl()->SubclassWindow(m_headerCtrl.m_hWnd);
}
mynamelj 2007-01-31
  • 打赏
  • 举报
回复
void CMyListCtrl::PreSubclassWindow()
{
//use our custom CHeaderCtrl as long as there
//is a headerctrl object to subclass
if(GetHeaderCtrl())
m_headerCtrl.SubclassWindow(GetHeaderCtrl()->m_hWnd);

CListCtrl::PreSubclassWindow();
}
mynamelj 2007-01-30
  • 打赏
  • 举报
回复
// Declare member
CMyHeaderCtrl m_headctrl;

// create...
m_headctrl.Create(....);
GetHeadCtrl()->SubclassWindow(&m_headctrl);
crumpy 2007-01-30
  • 打赏
  • 举报
回复
用CWnd::SubclassWindow()试试, 可能还要在Header Ctrl销毁前Unsubclass

得到CListCtrl的Header, 可以用(CHeaderCtrl*)CListCtrl::GetDlgItem(0)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧