1. 程式人生 > >MFC介面程式設計基礎(14):滾動條

MFC介面程式設計基礎(14):滾動條

上一篇:MFC介面程式設計基礎(13):列表框和組合框 下一篇:MFC介面程式設計基礎(15):程式舉例+遮蔽或接收鍵盤事件

滾動條是 CScrollBar 類的物件,是 Windows 應用程式中一個很重要的控制元件,通常附在對話方塊上用來協助觀察資料或確定位置,也可以用來作為資料輸入的工具。滾動條有水平和垂直兩種。
在這裡插入圖片描述

【例】

建立一個水平滾動條,最小值為 0 ,最大值為 100 ,單擊滾動條兩端箭頭時滑塊移動的增量值為 2 ,單擊滾動條中的空白處(滑塊與兩端箭頭之間的區域)時滑塊移動的增量值為 10 。另有一個只讀的編輯框,顯示了滑塊當前位置所代表的值。
假定工程名為 TEST 。

  • 介面設計
    首先建立一個對話方塊應用程式框架,然後放置水平滾動條、編輯框,按表連線變數,編輯框設定為只讀。
    在這裡插入圖片描述

  • 初始化
    滾動條的初始化就是設定最小值,最大值,以及初始時滑塊所代表的值。滾動條初始化在對話方塊的初始化函式中完成,涉及兩個函式:

  • 設定最大值和最小值
    函式原型:

void SetScrollRange(int nMinPos , int nMaxPos , BOOL bRedraw = TRUE);

引數說明:
①:nMinPos 表示最小值
②:nMinPos 表示最大值 。
③:當 bRedraw 為 TRUE 時重畫滾動條。

  • 設定滑塊的位置
    格式:
int SetScrollPos( int nPos , BOOL bRedraw = TRUE );

引數說明 :
①:nPos 表示滑塊的位置。
②:當 bRedraw 為 TRUE 時重畫滾動條。
滾動條初始化程式碼如下:

BOOL CTESTDlg::OnInitDialog() 
{ 
  ┆ 
 // TODO: Add extra initialization here 
 m_s.SetScrollRange(0,100); 
 m_s.SetScrollPos(50); 
 m_e=50; // 初始時,編輯框顯示 50 。 
 UpdateData(FALSE); // 更新編輯框顯示的內容。 
  ┆ 
};  
  • 編寫訊息處理函式
    當用戶在滾動條上進行操作時,滾動條接收不到任何訊息。但是對話方塊卻能接收到 WM_HSCROLL (水平滾動條)或 WM_VSCROLL (垂直滾動條)訊息,也就是說,程式對滾動條的操作只能在 OnHScroll() 或 OnVScroll() 中編寫程式碼。
    滾動條處理 WM_Hscroll 訊息的函式為:
void CTESTDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{ 
   // TODO: Add your message handler code here and/or call default 
    CDialog::OnHScroll(nSBCode, nPos, pScrollBar); 
} 

在對話方塊的屬性面板中查詢WM_HSCROLL命令,並新增響應函式
在這裡插入圖片描述
做如圖選擇,點選“”就把OnHScroll函式新增進去。
響應函式引數說明 :
① pScrollBar 指向使用者正在進行操作的滾動條。
② nPos 表示滑塊當前的位置。
③ nSBCode 指示使用者正在進行的操作,其取值及其意義見表。
在這裡插入圖片描述
程式程式碼:

…………………………………………………………
void CTestDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{	// TODO: Add your message handler code here and/or call default
	if (pScrollBar==&m_s) 
	{ 
		int iNowPos; 
      switch(nSBCode) 
	  { 
		case SB_THUMBTRACK: // 拖動滾動滑塊時 
             m_s.SetScrollPos(nPos); 
             m_e=nPos; 
              break; 
	   case SB_LINELEFT : // 單擊滾動條向左的箭頭 
		    iNowPos=m_s.GetScrollPos(); // 獲取滑塊當前位置所代表的值 
		    iNowPos=iNowPos-2; 
		    if(iNowPos<0) 
			   iNowPos=0; 
			m_s.SetScrollPos(iNowPos); 
			m_e=iNowPos; 
			break; 
		case SB_LINERIGHT : // 單擊滾動條向右的箭頭 
			iNowPos=m_s.GetScrollPos(); // 獲取滑塊當前位置所代表的值 
			iNowPos=iNowPos+2; 
			if(iNowPos>100) 
				iNowPos=100; 
			m_s.SetScrollPos(iNowPos); 
			m_e=iNowPos; 
			break; 
		case SB_PAGELEFT : // 單擊滾動條左邊的箭頭與滑塊之間的區域 
			iNowPos=m_s.GetScrollPos(); // 獲取滑塊當前位置所代表的值 
			iNowPos=iNowPos-10; 
			if(iNowPos<0) 
				iNowPos=0;
			m_s.SetScrollPos(iNowPos); 
			m_e=iNowPos; 
			break; 
		case SB_PAGERIGHT : // 單擊滾動條右邊的箭頭與滑塊之間的區域 
			iNowPos=m_s.GetScrollPos(); // 獲取滑塊當前位置所代表的值 
			iNowPos=iNowPos+10; 
			if(iNowPos>100) 
				iNowPos=100; 
			m_s.SetScrollPos(iNowPos); 
			m_e=iNowPos; 
			break; 
		 } 
	}
	UpdateData(FALSE); 
	CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
 }
…………………………………………………………

說明:

  • 由於對話方塊上可能有多個滾動條,因此函式首先需要根據指標 pScrollBar 確定事件發生在哪一個滾動條上,方法是使用表示式 pScrollBar==&m_s。因為, pScrollBar 指向發生事件的滾動條,所以這個表示式為真時,意味著使用者對滾動條 m_s 進行了操作。
  • 使用者對滾動條的操作有 5 種,因此函式中必須以這 5 種情況分別進行處理。
上一篇:MFC介面程式設計基礎(13):列表框和組合框 下一篇:MFC介面程式設計基礎(15):程式舉例+遮蔽或接收鍵盤事件