寫程式正好用到SLIDER控制項,隨把心得發表出來以供分享。
一、應用
CTestDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)<br />{<br />// TODO: Add your message handler code here and/or call default<br /> CSliderCtrl *pSlidCtrl=(CSliderCtrl*)GetDlgItem(IDC_SLIDER1);<br /> int m_nCur=pSlidCtrl->GetPos();<br /> CString str;<br /> str.Format("%d/n",m_nCur);<br /> TRACE(str);</p><p> CDialog::OnHScroll(nSBCode,nPos,pScrollBar);<br />}<br />
【MFC 中】關於對話方塊中的OnVScroll() 和 OnHScroll()函數
所以,要想對滑塊有效控制,就要對這兩個函數(改寫對話方塊的這兩個函數)進行控制。
如:
///////////////////////////////////////////////////////////////////////////////////////////////////<br />// 水平移動<br />///////////////////////////////////////////////////////////////////////////////////////////////////<br />void CTestDialog::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)<br />{<br /> // TODO: 在此添加訊息處理常式代碼和/或調用預設值<br /> //Slider<br /> CSliderCtrl* pSlider = (CSliderCtrl*)pScrollBar;<br /> CString strText;</p><p> int dValue[10] = {0};<br /> //多個SLIDER控制項控制<br /> switch( pSlider->GetDlgCtrlID() )<br /> {<br /> //Slider1<br /> case IDC_SLIDER1:<br /> strText.Format( _T("%d"), pSlider->GetPos() );<br /> SetDlgItemText( IDC_STATIC_SLIDER1, strText );<br /> break;<br /> //Slider2<br /> case IDC_SLIDER2:<br /> strText.Format( _T("%3.1f"), dValue[pSlider->GetPos()] );<br /> SetDlgItemText( IDC_STATIC_SLIDER2, strText );<br /> break;<br /> //dValue[6] = {1.5, 3.0, 4.5, 6.0, 7.5, 8.0};<br /> }<br /> CDialog::OnHScroll(nSBCode, nPos, pScrollBar);<br /> }</p><p>///////////////////////////////////////////////////////////////////////////////////////////////////<br />// 垂直滾動<br />///////////////////////////////////////////////////////////////////////////////////////////////////<br /> void CTestDialog::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)<br /> {<br /> // TODO: 在此添加訊息處理常式代碼和/或調用預設值<br /> if( nSBCode == SB_ENDSCROLL )<br /> {<br /> return;<br /> }<br /> //Spin Button<br /> if( pScrollBar->GetDlgCtrlID() == IDC_SPIN1 )<br /> {<br /> CString strValue;<br /> strValue.Format( _T("%3.1f"), (double)nPos / 10.0 );<br /> //((CSpinButtonCtrl*)pScrollBar)->GetBuddy()->SetWindowTextW( strValue );<br /> CEdit* pEdit =(CEdit*) ((CSpinButtonCtrl*)pScrollBar)->GetBuddy();<br /> pEdit->SetWindowTextW( strValue );<br /> }</p><p> CDialog::OnVScroll(nSBCode, nPos, pScrollBar);<br /> }<br />
二、滑塊通知訊息
Visual C++ 概念:添加功能滑塊通知訊息
滑塊控制項 (Slider Control) 通過向父視窗發送 WM_HSCROLL 或 WM_VSCROLL 訊息(取決於滑塊控制項 (Slider Control) 的方向),將使用者操作通知其父視窗。若要處理這些訊息,請將 WM_HSCROLL 和 WM_VSCROLL 訊息的處理常式添加到父視窗。將向 OnHScroll 和 OnVScroll 成員函數傳遞通知代碼、滑塊的位置和指向 CSliderCtrl 對象的指標。注意指標的類型為 CScrollBar *,即使它指向 CSliderCtrl 對象。若要操作滑塊控制項 (Slider Control),可能需要轉換該指標的類型。
滑塊控制項 (Slider Control) 不是使用捲軸通知代碼,而是發送不同的通知代碼集。只有當使用者使用鍵盤與滑塊控制項 (Slider Control) 互動時,滑塊控制項 (Slider Control) 才發送 TB_BOTTOM、TB_LINEDOWN、TB_LINEUP 和 TB_TOP 通知代碼。只有當使用者使用滑鼠時才發送 TB_THUMBPOSITION 和 TB_THUMBTRACK 通知訊息。在兩種情況下都發送 TB_ENDTRACK、TB_PAGEDOWN 和 TB_PAGEUP 通知代碼。
下表列出了滑塊控制項 (Slider Control) 通知訊息和導致發送通知的事件(虛鍵控代碼和滑鼠事件)。(有關標準虛鍵控代碼的列表,請參見 Winuser.h。)
| 通知訊息 |
導致發送通知的事件 |
| TB_BOTTOM |
VK_END |
| TB_ENDTRACK |
WM_KEYUP(使用者釋放了發送相關虛鍵控代碼的鍵) |
| TB_LINEDOWN |
VK_RIGHT 或 VK_DOWN |
| TB_LINEUP |
VK_LEFT 或 VK_UP |
| TB_PAGEDOWN |
VK_NEXT(使用者單擊了滑塊下面或右邊的通道) |
| TB_PAGEUP |
VK_PRIOR(使用者單擊了滑塊上面或左邊的通道) |
| TB_THUMBPOSITION |
WM_LBUTTONUP 在 TB_THUMBTRACK 通知訊息之後 |
| TB_THUMBTRACK |
滑塊移動(使用者拖動了滑塊) |
| TB_TOP |
VK_HOME |
範例代碼://控制垂直捲軸移動 HWND hWnd = GetDlgItem(IDC_SLIDER1)->GetSafeHwnd();
::SendMessage(hWnd,WM_SETFOCUS,0,0);
::SendMessage(hWnd,WM_KEYDOWN,VK_UP,1);
::SendMessage(hWnd,WM_VSCROLL,TB_LINEUP,0);