3

というダイアログ リソースに 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;
}
4

2 に答える 2

1

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());
    }
// ...
};

一般的なコントロールと Windows コントロールの WTL サポート クラスはatlctrls.hにあります。MFC プログラマ向けの WTL、パート IV - ダイアログとコントロールも参照してください。

于 2011-02-06T08:25:53.957 に答える
0

WTL::CListBoxT を Win32 リストボックスのラッパーとして使用できます。このためには、GetDlgItem を使用して取得できるリストボックスの HWND が必要です。

CListBoxT は、InsertString および DeleteString メソッドを提供します。

于 2011-02-04T03:36:39.950 に答える