2012-05-24 55 views
0

页眉:OnSelectionChanged没有得到所谓的

#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) 
{ 
} 

当我添加一个新的项目,但OnSelectionChanged不会被调用多少我甚至尝试OnAfterAddItem被调用。

链接它槽消息映射既不dosnt工作:

IMPLEMENT_DYNAMIC(AlarmsList, CVSListBox) 

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

我创建使用创建函数AlarmsList对象。

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

回答

0

Didnt help:/。

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

重载dosnt工作:/,它确实为OnAfterAddItem强硬。 是的,我然后使用相同的参数作为虚函数。

0

一般情况下,我认为LVN_ITEMCHANGED通知发送到父窗口。将处理程序和消息映射条目放入作为列表框父级的对话框/窗口中。

+0

Didnt help:/。 尝试了父属性页面和属性页面对话框。 重载dosnt工作:/,它确实为OnAfterAddItem强硬。是的,我正在使用与虚函数相同的参数。 – David

+0

接下来的事情是使用Spy ++来验证控件确实发送了通知。之后,进入CWnd :: OnWndMsg或CWnd :: Notify,看看消息是如何传播/处理的。 –

+0

是的,它的确在发送一个LVN_ITEMCHANGED。我如何调试功能?查找所有对OnWndMsg的引用只会给我声明。 – David

0

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

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?