2011-09-01 14 views
7

मैं एक सी ++ एमएफसी संवाद आधारित अनुप्रयोग लिख रहा हूं और मेरे कार्यक्रम में कई स्लाइडर्स हैं। मैं चाहता हूं कि प्रोग्राम एक फंक्शन को कॉल करे, जिसके आधार पर उपयोगकर्ता द्वारा स्लाइडर को बदला जा रहा है। मैंने GetPos() का उपयोग करने की कोशिश की लेकिन अब तक बहुत सफलता नहीं मिली है। ऐसा करने का कोई आसान तरीका?घटना जब एक विशेष स्लाइडर बदल जाता है

संदेश नक्शा:

BEGIN_MESSAGE_MAP(CSerialPortDlg, CDialog) 
    ON_WM_SYSCOMMAND() 
    ON_WM_PAINT() 
    ON_WM_QUERYDRAGICON() 
    //}}AFX_MSG_MAP 
    //ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1) 
    ON_BN_CLICKED(IDC_READ_COMM, OnBnClickedReadComm) 
    ON_WM_CLOSE() 
    ON_BN_CLICKED(IDC_WRITE, OnBnClickedWrite) 
    //ON_CBN_SELCHANGE(IDC_SENSORS, OnCbnSelchangeSensors) 
    //ON_CBN_SELCHANGE(IDC_SENSOR_LIST, OnCbnSelchangeSensorList) 
    ON_BN_CLICKED(IDC_GO, OnGo) 
    ON_WM_TIMER() 
    ON_BN_CLICKED(IDC_KILL_TIMER, OnBnClickedKillTimer) 
    ON_BN_CLICKED(IDC_READ_TIMER, OnBnClickedReadTimer) 
    ON_BN_CLICKED(IDC_WRITE_COMM, OnBnClickedWriteComm) 
    ON_BN_CLICKED(IDC_TERMINATE, OnBnClickedTerminate) 
    ON_BN_CLICKED(IDC_RUN, OnBnClickedRun) 
    ON_CONTROL(NM_CLICK,IDC_BOOM_SLIDER, Write_Boom) 
    ON_CONTROL(NM_CLICK,IDC_PITCH_SLIDER, Write_Pitch) 
END_MESSAGE_MAP() 

...

उत्तर

16

स्लाइडर नियंत्रण WM_HSCROLL या WM_VSCROLL सूचनाएं स्क्रॉल किए जाने पर क्षैतिज या लंबवत होने पर विभिन्न विधियों को निर्दिष्ट करने का मामला है। उन्हें अपने संवाद में पकड़ें और वहां आप किस वांछित फ़ंक्शन को कॉल कर सकते हैं, इस पर निर्भर करता है कि किसने अधिसूचना भेजी थी।

BEGIN_MESSAGE_MAP(CMyDlg, CDialog) 
    //... 
    ON_WM_HSCROLL() 
    //... 
END_MESSAGE_MAP() 


////////////////////////// 
// nSBCode: The operation performed on the slider 
// nPos: New position of the slider 
// pScrollBar: The scrollbar (slider ctrl in this case) that sent the notification 

void CMyDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{ 
    CSliderCtrl* pSlider = reinterpret_cast<CSliderCtrl*>(pScrollBar); 

    // Check which slider sent the notification 
    if (pSlider == &c_Slider1) 
    { 
    } 
    else if (pSlider == &c_Slider2) 
    { 
    } 

    // Check what happened 
    switch(nSBCode) 
    { 
    case TB_LINEUP: 
    case TB_LINEDOWN: 
    case TB_PAGEUP: 
    case TB_PAGEDOWN: 
    case TB_THUMBPOSITION: 
    case TB_TOP: 
    case TB_BOTTOM: 
    case TB_THUMBTRACK: 
    case TB_ENDTRACK: 
    default: 
     break; 
    } 

//... 
} 
` 
+0

आपके कोड और उत्तर के लिए बहुत बहुत धन्यवाद। यह मेरे कोड में पूरी तरह से फिट बैठता है और आवश्यकतानुसार आउटपुट प्राप्त करता है। :) चीयर्स। – Neophile

+0

आपका स्वागत है। यह अजीब बात है कि यह कैसे लागू किया जाता है, लेकिन एक बार जब आप इसे जानते हैं, तो यह आसान है। – MikMik

+0

हां, यह बिल्कुल सही है। – Neophile

2

आप अलग अलग नियंत्रण के लिए अलग ON_CONTROL मैक्रो के लिए क्या है? क्योंकि यह केवल ON_CONTROL

+0

देखें हैलो, मैं इसे इस तरह कर रही है की कोशिश की, लेकिन वास्तव में बहुत मदद नहीं की। मैंने शुरुआत में ON_CONTROL बिट जोड़ा है। स्लाइडर कंट्रोल में इवेंट हैंडलर जोड़ने की कोशिश करते समय CUstomDraw, OutofMemory, रिलीज कैप्चर और थीमchanged है। सुनिश्चित नहीं है कि इनसे कुछ भी इस्तेमाल किया जा सकता है। – Neophile

+1

ON_CONTROL _bit_? मैं उसे नहीं जानता, मैं [मैक्रो] के बारे में बात कर रहा हूं (http://msdn.microsoft.com/en-us/library/7hkb8hew.aspx) – MSalters

+0

हां, मेरा मतलब थोड़ा सा नहीं था। दुर्भाग्य से, यह काम नहीं किया। – Neophile

3

मुझे लगता है, मुझे लगता है। जिसे आप स्लाइडर कहते हैं उसे आमतौर पर "स्क्रॉलबार" कहा जाता है। आप शायद WM_VSCROLL संदेश की तलाश में हैं। जैसा कि उल्लेख किया गया है, "lParam: यदि संदेश स्क्रॉल बार द्वारा भेजा जाता है, तो यह पैरामीटर स्क्रॉल बार नियंत्रण के लिए हैंडल है।"

भी CWnd::OnVScroll

+0

हां, आप बिल्कुल सही हैं। मैंने WM_VSCROLL फ़ंक्शन जोड़ा और प्रदान किए गए अन्य उत्तर के अनुसार इसे संपादित किया। लेकिन वास्तव में आपके इनपुट के लिए बहुत बहुत धन्यवाद। अब आकर्षक के रूप में काम करता है :) – Neophile

2
BEGIN_MESSAGE_MAP(CMyDlg, CDialog) 
//... 
    ON_WM_HSCROLL() 
//... 
END_MESSAGE_MAP() 


void CMyDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{ 
    CSliderCtrl *ACSliderCtrl = (CSliderCtrl *)pScrollBar; 
    int nID = ACSliderCtrl->GetDlgCtrlID(); 
    int NewPos = ((CSliderCtrl *)pScrollBar)->GetPos(); 
    CWnd *ACWnd = GetDlgItem(nID); 


    switch (nID) 
    { 
     default: 
      break; 

     case IDC_SLIDER1: 
      m_edit1.Format("%d", NewPos); 
      UpdateData(FALSE); 
      break; 
    } 

    CDialog::OnHScroll(nSBCode, nPos, pScrollBar); 
} 
संबंधित मुद्दे