我有以下代码在MFC MDI应用程序的文档窗口中创建列表视图:
int CChildFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIChildWnd::OnCreate(lpCreateStruct) == -1)
return -1;
CRect getWindowRect, windowRect;
this->GetWindowRect(&getWindowRect);
windowRect.left = 0;
windowRect.top = 0;
windowRect.right = getWindowRect.right;
windowRect.bottom = getWindowRect.bottom;
CListCtrl *CarsListView = new CListCtrl();
CarsListView->Create( WS_CHILD | WS_VISIBLE | LVS_REPORT, windowRect, this, 9001 );
CarsListView->InsertColumn(0, _T("Reg. no"), LVCFMT_LEFT, 500);
CarsListView->InsertColumn(1, _T("Status"), LVCFMT_RIGHT, 100);
CarsListView->InsertColumn(2, _T("Type"), LVCFMT_LEFT, 60);
CarsListView->ShowWindow(SW_SHOW);
return 0;
}
它正常工作,它创建控件并显示它。但我无法点击或悬停它。有人告诉我,我应该继承这个控件,但我真的不知道他的意思。我想我应该创建一个类CarsListView
并实现消息处理程序,但这看起来非常复杂。 (例如,我是否必须重新设计列标题上的悬停操作?)
我需要有关此主题的帮助。我怎样才能使它发挥作用?
答案 0 :(得分:4)
在OnCreate方法中,初始化局部变量CListCtrl * CarsListView。方法结束时,变量超出范围。控件本身在这种情况下可以工作,但是你的程序会有内存泄漏,因为你没有将指针保存在CarsListView的任何地方。我假设你永远不会删除它。
我建议您创建一个CChildFrame类的成员变量,而不是这样做(在h文件中):
class CChildFrame: public xxxxxx
{
protected:
CListCtrl CarsListView;
}
然后,您有两个选择:
使用DDE/DDX。您将需要DDX_Control函数来子类化列表控件。这是最简单的方法
按照您的方法。在OnCreate方法中调用Create()方法来创建CarsListView控件的窗口。您无需致电new CListCtrl()
说了这么多,我想你需要熟悉Class Wizard。通过帮助创建成员变量和实现DDE只需点击几下