0

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

我需要有关此主题的帮助。我怎样才能让它工作?

4

1 回答 1

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()

说了这么多,我认为您需要熟悉Class Wizard。在它的帮助下创建成员变量和实现 DDE 只需点击几下

于 2013-10-03T02:04:43.400 回答