一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Windows API學(xué)習(xí)之滾動條系列函數(shù)

 quasiceo 2013-11-12
分類: Visual C++ 2011-02-17 18:17 3781人閱讀 評論(6) 收藏 舉報(bào)

作者:朱金燦
來源:http://blog.csdn.net/clever101


      Windows API中滾動條相關(guān)函數(shù)有兩個:
int SetScrollInfo(
HWND hwnd,
int fnBar,
LPSCROLLINFO lpsi,
BOOL fRedraw
);

BOOL GetScrollInfo(
HWND hwnd,
int fnBar,
LPSCROLLINFO lpsi
);


見名知意,SetScrollInfo就是用來設(shè)置窗口的滾動信息,GetScrollInfo就是用來獲取窗口的滾動信息。SetScrollInfo的參數(shù)含義如下:
參數(shù) 意義
hwnd
滾動條控件的句柄或帶有標(biāo)準(zhǔn)滾動欄的窗口的句柄
fnBar
用于指定哪一種滾動條,只能是下面的值之一:
SB_CTL :滾動條控件
SB_HORZ:水平滾動條
SB_VERT:垂直滾動條
lpsi
滾動條信息結(jié)構(gòu)體指針。下面作進(jìn)一步詳細(xì)介紹。
fRedraw 值為TRUE表示要Windows重新繪制計(jì)算了新信息后的滾動條,F(xiàn)ALSE表示不繪制。

GetScrollInfo的參數(shù)含義如下:

參數(shù) 意義
hwnd
滾動條控件的句柄或帶有標(biāo)準(zhǔn)滾動欄的窗口的句柄
fnBar
用于指定哪一種滾動條,只能是下面的值之一:
SB_CTL :滾動條控件
SB_HORZ:水平滾動條
SB_VERT:垂直滾動條
lpsi
滾動條信息結(jié)構(gòu)體指針。下面作進(jìn)一步詳細(xì)介紹。

值得注意的是在調(diào)用GetScrollInfo函數(shù)時要獲取相關(guān)滾動信息,需要指定SCROLLINFO結(jié)構(gòu)體中的fMask成員的值。fMask取下面的值的組合值:
值 意義
SIF_PAGE 獲取SCROLLINFO中的nPage成員的值(即一頁的大小)。
SIF_POS 獲取SCROLLINFO中的nPos成員的值。
SIF_RANGE
獲取SCROLLINFO中的nPos成員的nMin 和 nMax的值。
SIF_TRACKPOS
獲取SCROLLINFO中的nTrackPos成員的值。
nTrackPos
SIF_RANGE、SIF_POS、SIF_PAGE和SIF_TRACKPOS的組合。

使用例程(據(jù)petzod的《windows程序設(shè)計(jì)》第四章,僅列出主要代碼片段,具體請下載源碼):


  1. case WM_SIZE:  
  2.     {  
  3.         // save the width and height of window when changed the size of window  
  4.         cxClient = LOWORD(lp); // the width  
  5.         cyClient = HIWORD(lp); // the height  
  6.            // set vertical scroll bar range and page size  
  7.         si.cbSize = sizeof(SCROLLBARINFO);  
  8.         si.fMask = SIF_RANGE|SIF_PAGE;  
  9.            si.nMin = 0;  
  10.            si.nMax = NUMLINES - 1;  
  11.         si.nPage = cyClient/cyChar;  
  12.            SetScrollInfo(hWnd,SB_VERT,&si,TRUE);  
  13.            // set horizontal scroll bar and page size  
  14.         si.cbSize = sizeof(SCROLLBARINFO);  
  15.         si.fMask = SIF_RANGE|SIF_PAGE;  
  16.         si.nMin = 0;  
  17.         si.nMax = 2 + nMaxWidth/cxChar;  
  18.         si.nPage = cxClient/cxChar;  
  19.         SetScrollInfo(hWnd,SB_HORZ,&si,TRUE);  
  20.         return 0;  
  21.     }  
  22. case WM_VSCROLL:  
  23.     {  
  24. // get all vertical scroll bar information  
  25. si.cbSize = sizeof(SCROLLINFO);  
  26. si.fMask = SIF_ALL;  
  27. ::GetScrollInfo(hWnd,SB_VERT,&si);  
  28.    // save the position for comparison later on  
  29. nVertPos = si.nPos;  
  30.     switch (LOWORD(wp))  
  31.            {  
  32.         case SB_LINEUP:  
  33.             {  
  34.                 si.nPos -=1;// the height decrease 1 unit  
  35.                 break;  
  36.             }  
  37.         case SB_LINEDOWN:  
  38.             {  
  39.                 si.nPos +=1;// the height increase 1 unit  
  40.                 break;  
  41.             }  
  42.         case SB_PAGEUP:  
  43.             {  
  44.                    // back to prev page, the cyClient/cyChar is the number of row in one page  
  45.                 si.nPos -= cyClient/cyChar;   
  46.                 break;  
  47.             }  
  48.         case SB_PAGEDOWN:  
  49.             {  
  50.                 // back to next page  
  51.                 si.nPos += cyClient/cyChar;  
  52.                 break;  
  53.             }  
  54.         case SB_THUMBPOSITION:  
  55.             {  
  56.                 si.nPos = HIWORD(wp);  
  57.                 break;  
  58.             }  
  59.         default:  
  60.             break;  
  61.            }  
  62.            // set the position and then retrieve it.Due to adjustments  
  63.         // by Windows it may not be the same as the value set.  
  64.         si.fMask = SIF_POS;  
  65.         SetScrollInfo(hWnd,SB_VERT,&si,TRUE);  
  66.         GetScrollInfo(hWnd,SB_VERT,&si);  
  67.         //if the position has changed,scroll the window update it  
  68.         if (si.nPos!=nVertPos)  
  69.         {  
  70.             ::ScrollWindow(hWnd,0,cyChar*(nVertPos-si.nPos),NULL,NULL);  
  71.             ::UpdateWindow(hWnd);  
  72.         }  
  73.         return 0;  
  74.     }  
  75. case WM_HSCROLL:  
  76.     {  
  77.         // get all the vertical scroll bar information  
  78.         si.cbSize = sizeof(si);  
  79.         si.fMask = SIF_ALL;  
  80.         // save the position for comparison later on  
  81.         ::GetScrollInfo(hWnd,SB_HORZ,&si);  
  82.         nHorzPos = si.nPos;  
  83.         switch (LOWORD(wp))  
  84.         {  
  85.         case SB_LINELEFT:  
  86.             {  
  87.                 si.nPos -=1;  
  88.                 break;  
  89.             }  
  90.         case SB_LINERIGHT:  
  91.             {  
  92.                 si.nPos +=1;  
  93.                 break;  
  94.             }  
  95.         case SB_PAGELEFT:  
  96.             {  
  97.                 si.nPos -= si.nPage;  
  98.                 break;  
  99.             }  
  100.         case SB_PAGERIGHT:  
  101.             {  
  102.                 si.nPos += si.nPage;  
  103.                 break;  
  104.             }  
  105.         case SB_THUMBPOSITION:  
  106.             {  
  107.                 si.nPos = si.nTrackPos;  
  108.                 break;  
  109.             }  
  110.         default:  
  111.                break;  
  112.         }  
  113.         // set the position and then retrieve it.due to adjustments  
  114.         // by windows it may not be the same as the value set  
  115.         si.fMask = SIF_POS;  
  116.         ::SetScrollInfo(hWnd,SB_HORZ,&si,TRUE);  
  117.         ::GetScrollInfo(hWnd,SB_HORZ,&si);  
  118.         // if the postion has changed ,scroll the window  
  119.         if (si.nPos!=nHorzPos)  
  120.         {  
  121.             ::ScrollWindow(hWnd,cxChar*(nHorzPos-si.nPos),0,NULL,NULL);  
  122.         }  
  123.         return 0;  
  124.     }  
  125. case WM_PAINT:  
  126.     {  
  127.         hdc = ::BeginPaint(hWnd,&ps);  
  128.            // get vertical scroll bar position  
  129.         si.cbSize = sizeof(si);  
  130.            si.fMask = SIF_POS;  
  131.         ::GetScrollInfo(hWnd,SB_VERT,&si);  
  132.         nVertPos = si.nPos;  
  133.         // get horizontal scroll bar position  
  134.            GetScrollInfo(hWnd,SB_HORZ,&si);  
  135.            nHorzPos = si.nPos;  
  136.         // find painting limits   
  137.            int nPaintBeg = max(0,nVertPos+ps.rcPaint.top/cyChar); // the begin row  
  138.            int nPaintEnd = min(NUMLINES-1,nVertPos+ps.rcPaint.bottom/cyChar); // the end row  
  139.         for (int i =nPaintBeg;i<=nPaintEnd;i++)  
  140.         {  
  141.                // calculate the y position of draw region, when y position less 0,skip  
  142.             int x = cxChar*(1-nHorzPos);   
  143.             int y = cyChar*(i-nVertPos);  
  144.             ::TextOut(hdc,x,y,sysmetrics[i].szLabel,lstrlen(sysmetrics[i].szLabel));  
  145.             ::TextOut(hdc,x+22*cxCaps,y,sysmetrics[i].szDesc,lstrlen(sysmetrics[i].szDesc));  
  146.             ::SetTextAlign(hdc,TA_RIGHT|TA_TOP);  
  147.             ::TextOut(hdc,x+22*cxCaps+40*cxChar,y,szBuffer,wsprintf(szBuffer,_T("%5d"),::GetSystemMetrics(sysmetrics[i].Index)));  
  148.             ::SetTextAlign(hdc,TA_LEFT|TA_TOP);  
  149.         }  
  150.         ::EndPaint(hWnd,&ps);  
  151.         return 0;  
  152.     }  


    相關(guān)源碼下載:


Windows API學(xué)習(xí)之滾動條系列函數(shù)演示程序

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    久热这里只有精品九九| 欧美日韩一级黄片免费观看| 麻豆最新出品国产精品| 日韩在线精品视频观看| 真实国产乱子伦对白视频不卡| 日本亚洲欧美男人的天堂| 国产又大又黄又粗又免费| 国产综合欧美日韩在线精品| 欧美做爰猛烈叫床大尺度| 国产老熟女乱子人伦视频| 国产午夜精品亚洲精品国产| 国产精品久久久久久久久久久痴汉| 亚洲黑人精品一区二区欧美| 高跟丝袜av在线一区二区三区| 国产精品一区二区日韩新区| 久久久免费精品人妻一区二区三区| 黄色片国产一区二区三区| 中文字幕一区二区久久综合| 亚洲最新中文字幕一区| 欧美日本精品视频在线观看| 草草夜色精品国产噜噜竹菊| 91精品视频全国免费| 久久永久免费一区二区| 欧美日韩国产成人高潮| 国产视频在线一区二区| 国产又粗又长又大的视频| 老司机精品福利视频在线播放 | 午夜资源在线观看免费高清| 国产一区在线免费国产一区| 国产又大又硬又粗又黄| 久久精品国产在热久久| 在线观看免费视频你懂的| 少妇被粗大进猛进出处故事| 激情亚洲一区国产精品久久| 中文字幕中文字幕在线十八区| av在线免费观看一区二区三区| 亚洲内射人妻一区二区| 国产日韩综合一区在线观看| 少妇一区二区三区精品| 精品人妻一区二区三区四在线| 亚洲丁香婷婷久久一区|