window下的SCROLLbar的使用技巧
windows的組件中,可以說,滾動條是最難的。難就難在如何設(shè)置滾動信息上。
首先,在初始化的時候,需要設(shè)置SCROLLINFO結(jié)構(gòu),其中有nMin,nMax,和Page,Pos幾個信息。
nMin,nPos一般都設(shè)置為0.對于nMax和Page設(shè)置就有些技巧。關(guān)鍵是在對page的理解上。page其實就是可見部分的大小。比如,對于一個有滾動條的窗口,page的大小就是客戶區(qū)(對于垂直滾動條,就是窗口的高度,對于水平滾動條,就是窗口的寬度)。而nMax呢,則是全部要顯示的區(qū)域。比如對于一個顯示文章的程序,如果顯示一篇文章,需要1000像素的高度,而窗口只有300像素,那么就可以設(shè)置nMax=1000,nPage=300。實際上,我們在滾動條上看到的滑塊,就代表者一個頁,也就是當前我們看到的窗口。滑塊的位置對應的是nPos,大小對應的nPage。
滾動條必須自己處理滾動過程,而窗口的滾動位置、大小都可能變化,所以處理起來也比較麻煩,但是還是有很好的技巧的。
windows發(fā)送WM_HSCROLL或者WM_VSCROLL消息來讓程序處理滾動。我們可以利用GetScrollInfo獲取當前的Pos:即沒有發(fā)生滾動前的位置。根據(jù)滾動的動作:滾動一行、一頁或者拖動,我們就可以確定新的位置,用這個位置減去老的位置,就獲得偏移量,這個偏移量,就是給ScrollWindow函數(shù)調(diào)用的。
對于滾動行,用戶必須另外指定行的大小
還以上面的為例,簡單介紹一下垂直滾動的例子(偽代碼,不能編譯):
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; //設(shè)置新的值
?? SetScrollInfo(hwnd,SB_VRET,&si,FALSE);
如果窗口的大小發(fā)生了變化,SCROLLINFO可能需要調(diào)整。但是這時nPos的位置可能不是0。其實,Pos的值根本不用變化。因為我們使用的都是像素,無論窗口的大小如何變化,即:nPage如何變化,nMax是不變的:除非文章發(fā)生變化,所以nPos根本不需要變化。對于一些可變編輯的文章,文章的長度時時變化,也就是nMax在變化,那么我們只要保證nPos不會超出nMin~nMax就可以了。?
總結(jié)
以上是生活随笔為你收集整理的window下的SCROLLbar的使用技巧的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我看中国软件---问题篇
- 下一篇: 命主属性是水什么意思_涧下水命是什么水