window下的SCROLLbar的提示

來源:互聯網
上載者:User

windows的組件中,可以說,捲軸是最難的。難就難在如何設定滾動資訊上。

首先,在初始化的時候,需要設定SCROLLINFO結構,其中有nMin,nMax,和Page,Pos幾個資訊。

nMin,nPos一般都設定為0.對於nMax和Page設定就有些技巧。關鍵是在對page的理解上。page其實就是可見部分的大小。比如,對於一個有捲軸的視窗,page的大小就是客戶區(對於垂直捲軸,就是視窗的高度,對於水平捲軸,就是視窗的寬度)。而nMax呢,則是全部要顯示的地區。比如對於一個顯示文章的程式,如果顯示一篇文章,需要1000像素的高度,而視窗只有300像素,那麼就可以設定nMax=1000,nPage=300。實際上,我們在捲軸上看到的滑塊,就代表者一個頁,也就是當前我們看到的視窗。滑塊的位置對應的是nPos,大小對應的nPage。

捲軸必須自己處理滾動過程,而視窗的滾動位置、大小都可能變化,所以處理起來也比較麻煩,但是還是有很好的技巧的。

windows發送WM_HSCROLL或者WM_VSCROLL訊息來讓程式處理滾動。我們可以利用GetScrollInfo擷取當前的Pos:即沒有發生滾動前的位置。根據滾動的動作:滾動一行、一頁或者拖動,我們就可以確定新的位置,用這個位置減去老的位置,就獲得位移量,這個位移量,就是給ScrollWindow函數調用的。

對於滾動行,使用者必須另外指定行的大小

還以上面的為例,簡單介紹一下垂直滾動的例子(虛擬碼,不能編譯):

int line=10; //自己定義的行的大小,可以是任何合理的值或者公式
case WM_HSCROLL: 
   SCROLLINFO si;
   si.fMask = SIF_ALL:
   si.cbSize = sizeof(si); 
   GetSCrollInfo(hwnd,SB_VRET,&si); //獲得捲軸的資訊
   int nPos=si.nPos;   
   switch(LOWORD(wParam))  //wParam的低字是捲軸的動作
    {
         case SB_LINEUP:
               nPos -= line;
               break;
         case SB_LINEDOWN:
              nPos += line;
              break;
         case SB_PAGEUP:
             nPos -= si.nPage;
             break;
        case SB_PAGEDOWN:
             nPos += si.nPage;
            break;
        case SB_THUMBPOSITION:
            nPos = HIWORD(wParam); //wParam的高位是使用者拖動的地址
           break;
     }
     //防止越界
    if(nPos>si.nMax) nPos = si.nMax;
    if(nPos<si.nMin) nPos = si.nMin;
   //滾動視窗
   ScrollWindow(hWnd,0,si.nPos-nPos,NULL,NULL); //如果是向下滾動,則位移量為負值,向上滾動,則是正值
   si.nPos = nPos; //設定新的值
   SetScrollInfo(hwnd,SB_VRET,&si,FALSE);

如果視窗的大小發生了變化,SCROLLINFO可能需要調整。但是這時nPos的位置可能不是0。其實,Pos的值根本不用變化。因為我們使用的都是像素,無論視窗的大小如何變化,即:nPage如何變化,nMax是不變的:除非文章發生變化,所以nPos根本不需要變化。對於一些可變編輯的文章,文章的長度時時變化,也就是nMax在變化,那麼我們只要保證nPos不會超出nMin~nMax就可以了。 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.