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

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

于 2012-05-24T17:42:33.643 回答
0

没有帮助:/。

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

重载 dosnt 要么:/,它对于 OnAfterAddItem 很困难。是的,然后我使用与虚函数相同的参数。

于 2012-05-25T14:31:41.750 回答
0

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

于 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 回答