OnSelectionChanged没有被调用

时间:2012-05-24 15:38:04

标签: c++ mfc

部首:

#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 NEVER会调用我甚至尝试多少。

通过消息地图将其链接起来既不能正常工作:

IMPLEMENT_DYNAMIC(AlarmsList, CVSListBox)

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

我使用create function创建AlarmsList对象。

源代码和项目:http://www.filedropper.com/clockmaster

4 个答案:

答案 0 :(得分:0)

通常,我认为LVN_ITEMCHANGED通知被发送到父窗口。将处理程序和消息映射条目放在对话框/窗口中,该对话框/窗口是列表框的父对象。

答案 1 :(得分:0)

没有帮助:/。

尝试了父属性页面和该属性页面对话框。

重载dosnt工作:/,它对OnAfterAddItem很难。 是的,我接着使用与虚函数相同的参数。

答案 2 :(得分:0)

您可以尝试覆盖CVSListBoxBase类中的函数。在此类中,OnSelectionChanged函数的签名不需要参数。 您可以在afxvslistbox.h中找到CVSListBoxBase类的声明。

答案 3 :(得分: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() 
{
}

如果您希望从对话框中获得自己的控制进程消息,则可能需要对其进行子类化。请参阅此相关问题What's the correct way to create a subclass of a MFC control?