在SDK中如何控制滾動條

2022-08-27 16:03:07 字數 3394 閱讀 8645

**********===《windows 程式設計 第五版》讀書筆記 ||  第四章 輸出文字 **********===

總算領略到sdk的複雜性了,所謂複雜性,即在乙個程式中,大大小小的事情都得程式編寫者親力親為,windows幫的忙很少,我在想,要是使用文字框之類的元件也得一句一句的寫滾動條控制**,那不累死!

一、滾動條細節問題

滾動條這玩意兒眾所周知了,乙個滾動條由三個部分組成:向上(左)移動按鈕、捲動方塊和向下(右)移動按鈕,剛看到書上說這個「捲動方塊」時還差點兒沒明白過來。

滾動條上常用的有五種操作:

1.點選向上(左)移動按鈕,向上(左)移動一行

2.點選向下(右)移動按鈕,向下(右)移動一行

3.點選捲動方塊上方空白處,向上翻一頁

4.點選捲動方塊下方空白處,向下翻一頁

5.拖動捲動方塊

滾動條分水平滾動條和垂直滾動條,在windows中就對應wm_hscroll和wm_vscroll兩種訊息,其中wm_hscroll是供左右移動的訊息,wm_vscroll是供上下移動的訊息。也就是說,響應滾動條的五種操作都是在這兩個訊息下執行的,比如當使用者對垂直滾動條進行操作時,就會給windows發出乙個wm_vscroll訊息,至於對這個垂直滾動條具體執行的是什麼操作,是向上移動一行還是向下移動一行,這就要引出乙個「通知碼」的概念。

這個「通知碼」是怎麼來的呢?當傳送wm_vscroll或wm_hscroll訊息時,會附帶有wparam和lparam引數。其中lparam的作用沒太弄明白,至於wparam引數,其分為乙個低位字和高位字,我對這兩個概念的認識也比較模糊。其中低字組是乙個數值,而這個數值就是「通知碼」。

「通知碼」是以sb(scroll bar)開頭的識別符號定義(全是大寫名稱),這些識別符號比較好理解,比如sb_up向上移動一行,sb_down是向下移動一行。那現在如果我要寫響應將滾動條向下移動一行的**,該如何寫呢?看看下面的**:

case

wm_vscroll: 

//響應垂直滾動條操作的訊息

switch

(loword(wparam))

頭痛呀,本來有著很清晰的思路,但現在無緣無故多了個loword,書中的前面幾章也沒講這東西,只說了這是乙個巨集,在用getsystemmetrics獲取窗體顯示區域大小時,到是用過loword巨集,除此之外還有乙個hiword巨集。

case

wm_size: 

x = loword(lparam); 

y = hiword(lparam);

上面這段**就是用來獲取窗體顯示區域的寬度和高度,不過使用的引數是lparam。看來要想明明白白的繼續滾動條其它的知識點,還得先弄清楚這兩個巨集,另外還有lparam和wparam這兩個引數,也是很常見的引數,得弄清楚。

先了解一下lparam和wparam兩個引數,lparam是乙個uint資料型別(unsigned int),wparam是乙個long資料型別。在這兩個引數中分別包含乙個16位低位字和乙個16位高位字。通過sizeof計算出,乙個uint型別占用4個位元組,乙個long也是占用4個位元組,因為1個位元組等於8位元,那4個位元組的資料型別就是32位元,由此可知uint和long是32位資料型別。我的基礎知識不牢,又不得不惡補了一下。知道了lparam和wparam是32位資料型別,再來說說16位低位字和16位高位字。

其中loword是獲取乙個16位低位字,hiword是獲取乙個16位高位字,我估摸著就是將乙個32位的資料型別分解成兩個16位資料型別。

通過wparam的低位字和高位字就能獲取滾動條的「通知碼」和捲動方塊位置。

wparam低位值                       wparam高位值

sb_thumbtrack            捲動方塊時的目前位置

sb_thumbposition       使用者釋放滑鼠鍵後捲動方塊的最終位置

其它的捲動列操作                忽略

這樣一來就明白了上面switch語句的作用。

二、控制滾動條操作方法一

setscrollrange (hwnd, ibar, imin, imax, bredraw) ; //設定滾動條捲動方塊滾動範圍

setscrollpos (hwnd, ibar, ipos, bredraw) ; //設定捲動方塊的位置

bool getscrollrange(hwnd hwnd, int nbar, lpint lpminpos, lpint lpmaxpos); //獲取滾動條捲動廣場滾動範圍

int getscrollpos(hwnd hwnd, int nbar); //獲取捲動方塊的位置

下面給個簡單的示例**:

intivscrollpos; 

//滾動條捲動方塊位置

setscrollrange (hwnd, sb_vert, 0, 20, false) ; 

//滾動條最大範圍為20

setscrollpos   (hwnd, sb_vert, ivscrollpos, true) ; 

//初始化滾動條位置

case

wm_vscroll: 

//垂直滾動條操作訊息

switch

(loword (wparam))  

//wparam 16位低位值,即「通知碼」

上面的**只是修改了ivscrollpos的值,要想讓滾動條發生視覺改變,還得使用setscrollpos來重新定位捲動方塊的位置。

//用min和max巨集來調控ivscrollpos,確保ivscrollpos的值在setscrollrange設定的範圍之內

ivscrollpos = max (0, min (ivscrollpos, numlines - 1)) ; 

if(ivscrollpos != getscrollpos (hwnd, sb_vert)) 

//如果捲動方塊有變動

好了,這第一種控制滾動條的方法就這麼著了,其實就用到了setscrollpos和setscrollrange兩個函式,相對比較簡單。書中說這是一種很古老的方法了,在win32 api中新提供了兩個操作滾動條的函式:setscrollinfo和getscrollinfo函式。這兩個函式可以完成上面幾個函式的功能,而且還多了兩個特性:

第乙個特性

可以修改捲動方塊大小,主要是修改捲動方塊的高度。

第二個特性

可以接受32位引數。在前面的方法中,是在乙個32位資料型別中提取乙個16位低位字和乙個16位高位字來獲取滾動條的各種資訊,比如捲動方塊位置,通知碼等,而使用win32 api中這兩個新的函式可以直接接受32位的引數。

三、控制滾動條方法二

……

以下約有二千字左右的內容,因部落格儲存文章失敗,導致內容丟失,也懶得再打了。以後需要用到這方面的應用時再補上

……

控制 滾動條

怎麼給其它program傳送message 主要是想控制其它program的水平滾動條 但是其它program的滾動條視窗控制代碼未知.謝謝 findwindow sendmessage findwindow sendmessage 這樣try.用sendmessage給視窗發wm hscrollm...

python橫向滾動條 控制滾動條

調過js指令碼控制 python 1.coding utf 8 2.from selenium import webdriver 3.import time 5.driver webdriver.firefox 6.driver.get 7.搜尋 8.driver.find element by i...

滑鼠控制滾動條滾動

當在做帶 的專案時候會發現有乙個問題,那就是如果列數過多的話閱讀起來很不方便,通常列數多到超過視窗,我們會設定橫向滾動條來隱藏多餘的列數,如下圖 但這隨著行數的增加就又出現乙個問題那就是要控制橫向滾動條就得將頁面移動到最底才能看到滾動條,這讓我們的需要不斷地移動頁面來達到控制滾動條的效果 為了解決這...