2015-09-18 18 views
0

基本上我在自定義窗口中有一個滾動條,我們可以添加按鈕,文本框等等的其他控件,現在這裏是我創建的滾動條的問題,好吧它滾動但問題是最大的滾動應該被指定,然後阻止它滾動更多,但可以有儘可能多的控制作爲用戶想要的,這對我來說它不會被知道,我的意思是喜歡當您使用WM_VSCROLL或HSCROLL指定它時,將問題說成更像是一個文本框的內置滾動條,然後讓用戶能夠像在文本框中鍵入一樣滾動,這正是我想要的。 這裏是代碼到目前爲止我已經能夠經歷: -如何在vC++中製作可滾動窗口win32

代碼滾動條: -

case WM_LBUTTONDOWN: 
    { 
      SCROLLINFO si = { 0 }; 
      si.cbSize = sizeof(SCROLLINFO); 
      si.fMask = SIF_POS; 
      si.nPos = 0; 
      si.nTrackPos = 0; 
      GetScrollInfo(hwnd, SB_VERT, &si); 
      break; 
    } 
    case WM_VSCROLL: 
    { 
      auto action = LOWORD(wParam); 
      HWND hScroll = (HWND)lParam; 
      int pos = -1; 
      if (action == SB_THUMBPOSITION || action == SB_THUMBTRACK) { 
        pos = HIWORD(wParam); 
      } else if (action == SB_LINEDOWN) { 
        pos = g_scrollY + 50; 
      } else if (action == SB_LINEUP) { 
        pos = g_scrollY - 50; 
      } else if (action == SB_PAGEUP) { 
        GetClientRect(hwnd, &r); 
        pos = g_scrollY - r.bottom; 
      } else if (action == SB_PAGEDOWN){ 
        GetClientRect(hwnd, &r); 
        pos = g_scrollY + r.bottom; 
      } 
      if (pos == -1) 
        break; 
      SCROLLINFO si = { 0 }; 
      si.cbSize = sizeof(SCROLLINFO); 
      si.fMask = SIF_POS; 
      si.nPos = pos; 
      si.nTrackPos = 0; 
      SetScrollInfo(hwnd, SB_VERT, &si, true); 

      GetScrollInfo(hwnd, SB_VERT, &si); 
      pos = si.nPos; 
      POINT pt; 
      pt.x = 0; 
      pt.y = pos - g_scrollY; 
      auto hdc = GetDC(hwnd); 
      LPtoDP(hdc, &pt, 1); 
      ReleaseDC(hwnd, hdc); 
      ScrollWindow(hwnd, 0, -pt.y, NULL, NULL); 
      g_scrollY = pos; 
      return 0; 
    } 
case WM_SIZE: 
    { 
      RECT rc = { 0 }; 
      GetClientRect(hwnd, &rc); 
      SCROLLINFO si = { 0 }; 
      si.cbSize = sizeof(SCROLLINFO); 
      si.fMask = SIF_ALL; 
      si.nMin = 0; 
      si.nMax = MAX_RANGE; 
      if(si.nPos > 100) 
       si.nMax = 5000; 
      if(SB_THUMBPOSITION == 100){ 

       si.nMax = MAX_RANGE;} 
      si.nPage = (rc.bottom - rc.top); 
      si.nPos = 0; 
      si.nTrackPos = 0; 
      SetScrollInfo(hwnd, SB_VERT, &si, true); 
      break; 
    } 

,你可以看到si.nMax價值是要行的最高金額能夠滾動,但我希望它和控件一樣多。

+0

您可能要考慮使用像wxWidgets,Qt等GUI框架。 –

+0

@ThomasMatthews:wxWidgets可能幾乎不可用。另一方面,Qt太破碎了,你不可能想要推薦它。即使MFC生產出更好的圖形用戶界面,這也說了很多。除此之外,問題是關於Windows API編程,而可滾動窗口當然不是尋找框架的理由。 – IInspectable

+2

如果要求提供框架建議是SO的話題,那麼建議他們也應該如此。 –

回答

0

您必須知道窗口中有多少個控件,因此您可以將SCROLLINFO結構中的nMax成員設置爲所需的任何值,並在添加新控件時調用SetScrollInfo()。

+0

好吧,你將如何弄清楚,用戶必須在該自定義窗口的靜態控件中顯示多少圖片。 –

+0

@alasenburgers:通過應用數學。 – IInspectable

+0

我在數學上真的很糟糕,但我認爲我還有另一個想法,我的意思就像你可以告訴我擴大si.nMax的價值,就像用戶滾動以結束si.nMax的價值應該延伸或 –