0

ヘッダ:

#pragma once

class AlarmsList : public CVSListBox
{
    DECLARE_DYNAMIC(AlarmsList)

public:
    AlarmsList();
    virtual ~AlarmsList();
    void OnAfterAddItem(int index);
    void OnSelectionChanged(NMHDR *pNMHDR, LRESULT *pResult);

protected:
    DECLARE_MESSAGE_MAP()
public:
    afx_msg void OnDtnDatetimechangeDatetimepicker1(NMHDR *pNMHDR, LRESULT *pResult);
};


void AlarmsList::OnAfterAddItem(int index)
{
    GetParent()->GetDlgItem(IDC_TIMEPICK)->EnableWindow(true);
    LOGIC->addAlarm();
    LOGIC->changeSelection(index);
}

void AlarmsList::OnSelectionChanged(NMHDR *pNMHDR, LRESULT *pResult)
{
}

新しいアイテムを追加すると OnAfterAddItem が呼び出されますが、OnSelectionChanged は決して呼び出されません。

メッセージマップを介してリンクしても機能しません:

IMPLEMENT_DYNAMIC(AlarmsList, CVSListBox)

BEGIN_MESSAGE_MAP(AlarmsList, CVSListBox)
    ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST, OnSelectionChanged)
END_MESSAGE_MAP()

create 関数を使用して AlarmsList オブジェクトを作成します。

ソースコードとプロジェクト: http://www.filedropper.com/clockmaster

4

4 に答える 4

0

役に立ちませんでした:/。

親プロパティ ページとそのプロパティ ページ ダイアログの両方を試しました。

オーバーロードも機能しません:/、OnAfterAddItem の場合は困難です。はい、仮想関数と同じパラメーターを使用しています。

于 2012-05-25T14:31:41.750 に答える
0

通常、LVN_ITEMCHANGED 通知は親ウィンドウに送信されると思います。ハンドラーとメッセージ マップ エントリを、リスト ボックスの親であるダイアログ/ウィンドウに配置します。

于 2012-05-24T17:42:33.643 に答える
0

CVSListBoxBase クラスの関数をオーバーライドしてみることができます。このクラスでは、OnSelectionChanged 関数の署名に引数は必要ありません。CVSListBoxBase クラスの宣言は、afxvslistbox.h にあります。

于 2013-05-31T06:20:41.920 に答える
0

リストボックスを使用する私自身のMFCコードのいくつかを見て、次のように動作します。

CMyListBox : public CListBox
{
}

class CMyDialog : public CDialog
{
// Construction
public:
    CMyDialog(CFeatureDoc* pFeatureDoc,BOOL SheetLayout = FALSE,CWnd* pParent = NULL);   // standard constructor
    //{{AFX_DATA(CMyDialog)
    enum { IDD = IDD_MY_DIALOG };
    CMyListBox  m_MyListBox;
    //}}AFX_DATA


// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CMyDialog)
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    //}}AFX_VIRTUAL

// Implementation
protected:

    // Generated message map functions
    //{{AFX_MSG(CMyDialog)
    afx_msg void OnSelChangeListBox();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
};

void CMyDialog::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CMyDialog)
    DDX_Control(pDX, IDC_MY_LIST_BOX, m_MyListBox);
    //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
    //{{AFX_MSG_MAP(CMyDialog)
    ON_LBN_SELCHANGE(IDC_MY_LIST_BOX, OnSelChangeListBox)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyDialog message handlers


void CMyDialog::OnSelChangeListBox() 
{
}

ダイアログからの独自のコントロール プロセス メッセージが必要な場合は、それをサブクラス化することができます。この関連する質問を参照してくださいMFC コントロールのサブクラスを作成する正しい方法は何ですか?

于 2013-05-31T07:08:11.627 に答える