为MFC文档视图子类化列表视图

时间:2013-10-02 18:59:18

标签: c++ mfc

我有以下代码在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并实现消息处理程序,但这看起来非常复杂。 (例如,我是否必须重新设计列标题上的悬停操作?)

我需要有关此主题的帮助。我怎样才能使它发挥作用?

1 个答案:

答案 0 :(得分:4)

在OnCreate方法中,初始化局部变量CListCtrl * CarsListView。方法结束时,变量超出范围。控件本身在这种情况下可以工作,但是你的程序会有内存泄漏,因为你没有将指针保存在CarsListView的任何地方。我假设你永远不会删除它。

我建议您创建一个CChildFrame类的成员变量,而不是这样做(在h文件中):

class CChildFrame: public xxxxxx
{
protected:
  CListCtrl CarsListView;
}

然后,您有两个选择:

  1. 使用DDE/DDX。您将需要DDX_Control函数来子类化列表控件。这是最简单的方法

  2. 按照您的方法。在OnCreate方法中调用Create()方法来创建CarsListView控件的窗口。您无需致电new CListCtrl()

  3. 说了这么多,我想你需要熟悉Class Wizard。通过帮助创建成员变量和实现DDE只需点击几下