2010-05-16 243 views
3

回來後,我有自己的H和V滾動的窗口。我在處理事件是這樣的:滾動條移動WM_VSCROLL

case WM_VSCROLL: 

     SetScrollPos(hWnd, SB_VERT, (int)HIWORD(wParam), TRUE); 

     break; 

我要的是滾動條的位置停留,一旦我釋放我的鼠標,但它在做什麼只是回去後頂部。我究竟做錯了什麼?

由於

回答

10

WM_VSCROLL消息的wParam參數是SB_TOPSB_BOTTOMSB_PAGEUPSB_PAGEDOWNSB_LINEUPSB_LINEDOWNSB_THUMBPOSITION,或SB_THUMBTRACK,其中所述名稱應該解釋自己。

  • SB_TOPSB_BOTTOM意味着滾動窗口是分別去的頂部或底部。可以通過右鍵單擊垂直滾動條並選擇「頂部」和「底部」來發送這些消息。 (例如,查看Windows記事本,Win XP +。)

  • SB_PAGEUPSB_PAGEDOWN表示頁面(屏幕)向上或向下。這些如果滾動條上單擊somwhere旁邊的拇指或向上或向下箭頭髮送,或者如果您使用滾動條的右鍵菜單。

  • SB_LINEUPSB_LINEDOWN是在用戶單擊滾動條上的向上和向下按鈕或選擇適當的右鍵菜單命令時發送的。

  • SB_THUMBTRACK當用戶通過拖動滾動條的拇指進行滾動時,會連續發送。

  • SB_THUMBPOSITION在用戶釋放拇指時發送。

有關更多信息,請參閱MSDN文章WM_VSCROLL

因此,當您收到WM_VSCROLL消息時,您首先需要執行滾動操作。例如,如果您正在編寫文本編輯器,則需要重新繪製文本,但在窗口頂部使用不同的行。然後,您需要將滾動條更新到新位置,最好通過SetScrollInfo更新,但您也可以使用舊的SetScrollPos函數。

+0

謝謝,我仍然有點新的WinAPI – jmasterx 2010-05-16 14:37:38

+2

請參閱http://msdn.microsoft.com/en-us/library/bb787531(VS.85).aspx如何處理'WM_VSCROLL'消息的示例。 – 2010-05-16 14:40:59

0

在case部分中,系統正在處理WM_VSCROLL消息。它將在您的SetScrollPos後運行默認的窗口過程。在默認窗口過程中,系統本身將設置滾動條的拇指位置。因此,儘管SetScrollPos會產生效果,但系統之後系統會改變拇指位置。我想你應該在調用默認的窗口過程之後執行你的SetScrollPos,也就是在返回這個函數之後,然後你可以SetScrollPos。