| 消息 | 觸發時機 | 典型用途 | 參數說明 |
|---|---|---|---|
LBN_SELCHANGE | 用戶**改變選擇項**(單擊、鍵盤 ↑↓、代碼 `SetCurSel`) | 即時預覽、聯動更新其他控件、啟用/禁用按鈕 | `wParam` = 控件 ID,`lParam` = 控件 HWND |
LBN_DBLCLK | 用戶**雙擊**某一項(或按 Enter/空格,視風格) | 打開詳情、編輯項目、確認選擇並關閉對話框 | 同左 |
// 對話框頭文件
afx_msg void OnLbnSelchangeListItems();
afx_msg void OnLbnDblclkListItems();
// 消息映射
ON_LBN_SELCHANGE(IDC_LIST_ITEMS, &CMyDlg::OnLbnSelchangeListItems)
ON_LBN_DBLCLK(IDC_LIST_ITEMS, &CMyDlg::OnLbnDblclkListItems)
// 實現
void CMyDlg::OnLbnSelchangeListItems()
{
int idx = m_list.GetCurSel();
if (idx != LB_ERR) {
CString text; m_list.GetText(idx, text);
m_preview.SetWindowText(text); // 即時預覽
m_btnEdit.EnableWindow(TRUE);
}
}
void CMyDlg::OnLbnDblclkListItems()
{
int idx = m_list.GetCurSel();
if (idx != LB_ERR) {
CEditDlg dlg;
dlg.m_str = m_list.GetText(idx);
if (dlg.DoModal() == IDOK) {
m_list.DeleteString(idx);
m_list.InsertString(idx, dlg.m_str); // 更新編輯後的文本
}
}
}
class CMyListBox : public CListBox
{
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
};
BEGIN_MESSAGE_MAP(CMyListBox, CListBox)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONDBLCLK()
END_MESSAGE_MAP()
void CMyListBox::OnLButtonDown(UINT nFlags, CPoint point)
{
// 單擊選中但不觸發 SELCHANGE 邏輯(如拖拽開始)
SetFocus();
int idx = ItemFromPoint(point, bOutside);
if (!bOutside) SetCurSel(idx);
CListBox::OnLButtonDown(nFlags, point);
}
void CMyListBox::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// 雙擊前強制選中該項
BOOL bOutside;
int idx = ItemFromPoint(point, bOutside);
if (!bOutside) SetCurSel(idx);
CListBox::OnLButtonDblClk(nFlags, point);
}
`LBN_SELCHANGE` = 選擇變化(高頻、輕量、即時反饋)**;**`LBN_DBLCLK` = 確認動作(低頻、重操作、彈窗/提交)**。正確區分兩者,能構建符合用戶直覺的交互體驗。