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;
}

次に、次の 2 つのオプションがあります。

  1. DDE/DDXを使用します。リスト コントロールをサブクラス化するには、 DDX_Control関数が必要です。これはこれを行う最も簡単な方法です

  2. あなたの方法に従ってください。OnCreate メソッドで Create() メソッドを呼び出して、CarsListView コントロールのウィンドウを作成します。電話する必要はありませんnew CListCtrl()

そうは言っても、 Class Wizardに慣れる必要があると思います。メンバー変数の作成と DDE の実装の助けを借りて、数回クリックするだけです

于 2013-10-03T02:04:43.400 に答える