如何将CMFCListCtrl与CListView一起使用?

如何将CMFCListCtrl与CListView一起使用?,mfc,mfc-feature-pack,Mfc,Mfc Feature Pack,我想在CListView类中使用新的CMFCListCtrl特性,当然,还有其中新的CMFCHeaderCtrl。不幸的是,您不能使用Attach或Subclass窗口,因为SysListView32窗口已与CListView对象关联 我是否必须重写CListView的oncmdmdmsg并将所有消息路由到我自己的CMFCListCtrl实例?这行得通吗?或者有更简单/更干净的解决方案吗?我会从CFormView继承,让CMFCListCtrl占据表单视图的完整对话框。我会从CFormView继

我想在CListView类中使用新的CMFCListCtrl特性,当然,还有其中新的CMFCHeaderCtrl。不幸的是,您不能使用Attach或Subclass窗口,因为SysListView32窗口已与CListView对象关联


我是否必须重写CListView的oncmdmdmsg并将所有消息路由到我自己的CMFCListCtrl实例?这行得通吗?或者有更简单/更干净的解决方案吗?

我会从CFormView继承,让CMFCListCtrl占据表单视图的完整对话框。

我会从CFormView继承,让CMFCListCtrl占据表单视图的完整对话框。

CListView没有很多功能。正如您在上面的评论中所说,只需从CView派生您自己的视图类,处理WM_SIZE以调整CMFCListCtrl的大小,就可以了。

CListView没有很多功能。正如您在上面的评论中所说,只需从CView派生您自己的视图类,处理WM_SIZE以调整CMFCListCtrl的大小,就可以了。

如果您希望从CMFCHeaderCtrl派生您自己的CMFCHeaderCtrl f.e.m_myHeaderCtrl,则必须在您自己的CMFCListCtrl中重写这三个函数

CMFCHeaderCtrl& CMyMFCListCtrl::GetHeaderCtrl() 
{ 
   return m_myHeaderCtrl; 
}

void CMyMFCListCtrl::InitHeader()
{
   // Initialize header control:
   m_myHeaderCtrl.SubclassDlgItem(0, this);
}


void CMyMFCListCtrl::OnSize(UINT nType, int cx, int cy)
{
   CListCtrl::OnSize(nType, cx, cy);
   if (myHeaderCtrl.GetSafeHwnd() != NULL)
   {
      myHeaderCtrl.RedrawWindow();
   }
}
现在您在自己的myHeaderCtrl中有了完整的响应,定义了更多的函数 f、 e.标题中的多行:

OnDrawItem(CDC* pDC, int iItem, CRect rect, BOOL bIsPressed, BOOL bIsHighlighted);
或者通过以下方式定义自己的布局:

afx_msg LRESULT OnHeaderLayout(WPARAM wp, LPARAM lp);  

MFC代码中有示例。

如果您希望自己的CMFCHeaderCtrl f.e.m_myHeaderCtrl从CMFCHeaderCtrl派生,则必须在自己的CMFCListCtrl中重写这三个函数

CMFCHeaderCtrl& CMyMFCListCtrl::GetHeaderCtrl() 
{ 
   return m_myHeaderCtrl; 
}

void CMyMFCListCtrl::InitHeader()
{
   // Initialize header control:
   m_myHeaderCtrl.SubclassDlgItem(0, this);
}


void CMyMFCListCtrl::OnSize(UINT nType, int cx, int cy)
{
   CListCtrl::OnSize(nType, cx, cy);
   if (myHeaderCtrl.GetSafeHwnd() != NULL)
   {
      myHeaderCtrl.RedrawWindow();
   }
}
现在您在自己的myHeaderCtrl中有了完整的响应,定义了更多的函数 f、 e.标题中的多行:

OnDrawItem(CDC* pDC, int iItem, CRect rect, BOOL bIsPressed, BOOL bIsHighlighted);
或者通过以下方式定义自己的布局:

afx_msg LRESULT OnHeaderLayout(WPARAM wp, LPARAM lp);  

MFC代码中有一些例子。

表单对话框中有一些额外的内容,处理大小更改以保持列表占据整个对话框。在OnCreate中创建CView子类并创建CMyListCtrl可能同样好。在我接受答案之前,我必须看看我能把它改造得多好。谢谢因为我只需要一个控件,所以我从CView而不是CFormView派生出来,但原理是一样的。表单对话框中有一点额外的内容,可以处理大小更改,以保持列表占据整个对话框。在OnCreate中创建CView子类并创建CMyListCtrl可能同样好。在我接受答案之前,我必须看看我能把它改造得多好。谢谢因为我只需要一个控件,所以我从CView派生而不是从CFormView派生,但原理是一样的。最简单的解决方案是从CView派生视图,然后在OnCreate中创建自己的控件。处理CView派生窗口的WM_大小,并将控件调整到客户端区域。最简单的解决方案是从CView派生视图,然后在OnCreate中创建自己的控件。处理CView派生窗口的WM_大小,并将控件调整到客户端区域。