Должен ли я использовать SendDlgItemMessage или есть обертка для этого в WTL? - PullRequest
3 голосов
/ 04 февраля 2011

Я добавил элемент управления Listbox в ресурс диалога IDC_LIST1.Должен ли я взаимодействовать с этим элементом управления, используя SendDlgItemMessage(), или есть лучший способ с WTL?Вот мои обработчики событий.Ничего особенного пока нет!

LRESULT OnAddItem(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
    SendDlgItemMessage(IDC_LIST1, LB_INSERTSTRING, (WPARAM) 0, (LPARAM)_T("Hi"));
    return 0;
}

LRESULT OnRemoveItem(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
    // Get selected item
    int item = SendDlgItemMessage(IDC_LIST1, LB_GETCURSEL, (WPARAM) 0, (LPARAM) 0);
    // Remove the item at the index of the selected item
    SendDlgItemMessage(IDC_LIST1, LB_DELETESTRING, (WPARAM) 0, (LPARAM)item);
    return 0;
}

Ответы [ 2 ]

1 голос
/ 06 февраля 2011

WTL предложенный способ заключается в следующем:

class CMyDlg : public CDialogImpl<CMyDlg>
{
public:
    enum {IDD = IDD_MYDLG};
    CListBox m_lb1;
// ...
    BEGIN_MSG_MAP(CMyDlg)
        MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
        COMMAND_ID_HANDLER(ID_ADDITEM, OnAddItem)
        COMMAND_ID_HANDLER(ID_REMOVEITEM, OnRemoveItem)
        // ...
    END_MSG_MAP()
// ...
    LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
    {
        m_lb1.Attach(GetDlgItem(IDC_LIST1));
        // ...
    }
    LRESULT OnAddItem(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
    {
        return m_lb1.AddString(_T("Hi"));
    }
    LRESULT OnRemoveItem(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
    {
        return m_lb1.DeleteString(m_lb1.GetCurSel());
    }
// ...
};

Классы поддержки WTL для общих элементов управления и элементов управления Windows находятся в atlctrls.h , вы также можете взглянуть на WTL для программистов MFC, часть IV - Диалоги и элементы управления .

0 голосов
/ 04 февраля 2011

Вы можете использовать WTL :: CListBoxT в качестве оболочки вокруг списка Win32 ... для этого вам нужен HWND списка, который вы можете получить с помощью GetDlgItem.

CListBoxT предлагает методы InsertString и DeleteString.

...