visual c++ - CListCtrl चयन परिवर्तन का पता कैसे लगाएं?




visual-c++ mfc (3)

क्या हो रहा है इसके आधार पर कुछ अधिसूचनाएं हैं।

यदि आप कोई आइटम चुन रहे हैं और अभी तक कुछ भी नहीं चुना गया है, तो आपको एक LVIF_STATE परिवर्तन अधिसूचना मिलेगी: uNewState & LVIS_SELECTED। नया चयनित आइटम यहां मिलेगा:

pNMListView->iItem

यदि कोई नई ऑब्जेक्ट चुनने से पहले कोई आइटम चुना जाता है, तो आपको तीन राज्य परिवर्तन मिलेंगे:

सबसे पहले आपको सूचित किया जाएगा कि फोकस में पिछली वस्तु फोकस खो रही है:

pNMListView->uOldState & LVIS_FOCUSED

फिर आपको अधिसूचित किया जाएगा कि पुराना आइटम अचयनित किया जा रहा है:

pNMListView->uOldState & LVIS_SELECTED

अंत में, आपको नया आइटम चयन स्थिति मिल जाएगी:

pNMListView->uNewState & LVIS_SELECTED

(फिर से नए चुने हुए आइटम के लिए iItem देखें)

तो हम जिस गड़बड़ी में भाग गए थे वह यह है कि, क्योंकि वस्तु विच्छेदन के परिणाम दो अधिसूचनाओं में होते हैं, हम बहुत बार दोहराए जाते हैं, कभी-कभी हानिकारक, प्रसंस्करण करते हैं। हमने जो किया वह केवल दूसरे संदेश (pNMListView->uOldState & LVIS_SELECTED) लिए इस प्रसंस्करण को कर रहा था, और फोकस अधिसूचना के नुकसान के बाद उसी प्रसंस्करण को छोड़ रहा था।

मैं कुछ कोड निष्पादित करना चाहता हूं जब उपयोगकर्ता CListCtrl में एक पंक्ति का चयन करता है (रिपोर्ट दृश्य, मुझे अन्य देखने के तरीकों की परवाह नहीं है)।

मैं इस घटना को कैसे पकड़ूं? क्या कोई संदेश है जिसे मैं मैप कर सकता हूं या "ऑनसेलेक्शन चेंज" जैसी कोई विधि या ऐसा कुछ?


डीजेडॉट सही है।

मैं सिर्फ यह जोड़ना चाहता हूं कि कोई ऑनसेलेक्शन चेंज () नहीं है क्योंकि ListView बहु-चयन का समर्थन करता है (हालांकि इसे अक्षम किया जा सकता है)। इसलिए, एक एकल चयन सूचीदृश्य आपको दो घटनाएं भेजेगा: पुराना आइटम अचयनित और नया आइटम चुना गया।


मेरे विजुअल स्टूडियो 2010 पर, विज़ुअल एडिटर इस तरह डायलॉग हेडर फ़ाइल में कॉलबैक घोषित करता है:

afx_msg void OnLbnSelchangeListOnvif();

और स्रोत फ़ाइल में:

BEGIN_MESSAGE_MAP(CDialogOnvif, CDialog)
    ON_LBN_SELCHANGE(IDC_LIST_ONVIF, &CDialogOnvif::OnLbnSelchangeListOnvif)
END_MESSAGE_MAP()

void CDialogOnvif::OnLbnSelchangeListOnvif()
{
    // do stuff...
}