关于滚动条我用以下语句创建的滚动条为什么看得见,却不能滑动?
在CMainFrame::OnCreate()
CRect r;
GetClientRect(&r);
CRect rt(0,0,r.Width(),15);
rt.OffsetRect(0,r.Height()-35);
m_ScrollBar.Create(WS_CHILD|WS_VISIBLE|SBS_HORZ,
rt,
this,
AFX_IDW_SIZE_BOX);
m_ScrollBar.SetScrollRange(10,100,TRUE);***********************************************
在非CScrollView中怎样使用滚动条,比如在CView CListView中。
也就是说怎样设置固定视图区域。
比如(10000,10000)这样大的区域.

解决方案 »

  1.   

    void CActiveListView::OnInitialUpdate() 
    {
    CSize sizeTotal(2000,30000);
    CSize sizePage(sizeTotal.cx/200,sizeTotal.cy/300);
    CSize sizeLine(sizeTotal.cx/3000,sizeTotal.cy/3000);
    SetScrollSizes(MM_TEXT,sizeTotal,sizePage,sizeLine);
    GetParentFrame()->RecalcLayout();
    ResizeParentToFit();//¶¯Ì¬ÏÔʾ¹ö¶¯Ìõ
    }
      

  2.   

    你用上面的方法是可以生成一个滚动条,但是它还是死的,
    如果你改变Frame的大小你还会发现,滚动条就在原地不动,
    这是因为你只用Create()创建了一个滚动条但并没对它的“滚动”
    做出任何的反应。所以你应该用它的成员控制和响应它的“滚动”。
    具体的查看MSDN。上面是如何设置滚动页面的固定大小。
      

  3.   

    上面这位老兄用到的函数SetScrollSizes()是CScrollView类的!
    http://www.codeguru.com/controls/scrollbar_handling.shtml
      

  4.   

    在程式内使用卷动列时,程式写作者与Windows共同负责维护卷动列以及更新卷动方块的位置。下面是Windows对卷动列的处理:
    处理所有卷动列滑鼠事件;
    当使用者在卷动列内单击滑鼠时,提供一种「反相显示」的闪烁;
    当使用者在卷动列内拖动卷动方块时,移动卷动方块;
    为包含卷动列视窗的视窗讯息处理程式发送卷动列讯息.
      
    以下是程式写作者应该完成的工作:
    初始化卷动列的范围和位置;
    处理视窗讯息处理程式的卷动列讯息;
    更新卷动列内卷动方块的位置;
    更改显示区域的内容以回应对卷动列的更改.“卷动”就是“滚动”。
      

  5.   

    #include <windows.h>
    #include "sysmets.h"LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
          PSTR szCmdLine, int iCmdShow)
    {
    static TCHAR szAppName[] = TEXT ("SysMets2") ;
    HWND hwnd ;
    MSG  msg ;
    WNDCLASS wndclass ;
    wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
    wndclass.lpfnWndProc = WndProc ;
    wndclass.cbClsExtra  = 0 ;
    wndclass.cbWndExtra  = 0 ;
    wndclass.hInstance      = hInstance ;
    wndclass.hIcon          = LoadIcon (NULL, IDI_APPLICATION) ;
    wndclass.hCursor      = LoadCursor (NULL, IDC_ARROW) ;
    wndclass.hbrBackground  = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
    wndclass.lpszMenuName   = NULL ;
    wndclass.lpszClassName  = szAppName ; if (!RegisterClass (&wndclass))  
         {
    MessageBox (NULL, TEXT ("This program requires Windows NT!"), 
            szAppName, MB_ICONERROR) ;
     return 0 ;
         } hwnd = CreateWindow (szAppName, TEXT ("Get System Metrics No. 2"),
    WS_OVERLAPPEDWINDOW | WS_VSCROLL,
    CW_USEDEFAULT, CW_USEDEFAULT,
    CW_USEDEFAULT, CW_USEDEFAULT,
    NULL, NULL, hInstance, NULL) ;
    ShowWindow (hwnd, iCmdShow) ;
    UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0))
         {
         TranslateMessage (&msg) ;
         DispatchMessage (&msg) ;
         }
    return msg.wParam ;
    }
      

  6.   

    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    static int  cxChar, cxCaps, cyChar, cyClient, iVscrollPos ;
    HDC         hdc ;
    int         i, y ;
    PAINTSTRUCT ps ;
    TCHAR       szBuffer[10] ;
    TEXTMETRIC  tm ;
    switch (message)
         {
    case WM_CREATE:
    hdc = GetDC (hwnd) ;
    GetTextMetrics (hdc, &tm) ;
    cxChar = tm.tmAveCharWidth ;
    cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ;
    cyChar = tm.tmHeight + tm.tmExternalLeading ; ReleaseDC (hwnd, hdc) ;
    SetScrollRange (hwnd, SB_VERT, 0, NUMLINES - 1, FALSE) ;
    SetScrollPos   (hwnd, SB_VERT, iVscrollPos, TRUE) ;
    return 0 ; case WM_SIZE:
    cyClient = HIWORD (lParam) ;
    return 0 ; case WM_VSCROLL:
    switch (LOWORD (wParam))
              {
    case SB_LINEUP:
       iVscrollPos -= 1 ;
    break ;
         
    case SB_LINEDOWN:
    iVscrollPos += 1 ;
    break ; case SB_PAGEUP:
    iVscrollPos -= cyClient / cyChar ;
    break ;
         
    case SB_PAGEDOWN:
    iVscrollPos += cyClient / cyChar ;
    break ;
         
    case SB_THUMBPOSITION:
    iVscrollPos = HIWORD (wParam) ;
    break ;
         
    default :
    break ;
              } iVscrollPos = max (0, min (iVscrollPos, NUMLINES - 1)) ;
    if (iVscrollPos != GetScrollPos (hwnd, SB_VERT))
              {
    SetScrollPos (hwnd, SB_VERT, iVscrollPos, TRUE) ;
    InvalidateRect (hwnd, NULL, TRUE) ;
              }
    return 0 ;
    case WM_PAINT:
    hdc = BeginPaint (hwnd, &ps) ;
    for (i = 0 ; i < NUMLINES ; i++)
    {
    y = cyChar * (i - iVscrollPos) ;
    TextOut (hdc, 0, y,
    sysmetrics[i].szLabel,
    lstrlen (sysmetrics[i].szLabel)) ;
         
    TextOut (hdc, 22 * cxCaps, y,
    sysmetrics[i].szDesc,
    lstrlen (sysmetrics[i].szDesc)) ;
         
    SetTextAlign (hdc, TA_RIGHT | TA_TOP) ;
    TextOut (hdc, 22 * cxCaps + 40 * cxChar, y, szBuffer,
    wsprintf (szBuffer, TEXT ("%5d"),
    GetSystemMetrics (sysmetrics[i].iIndex))) ;
    SetTextAlign (hdc, TA_LEFT | TA_TOP) ;
              }
    EndPaint (hwnd, &ps) ;
    return 0 ; case WM_DESTROY:
    PostQuitMessage (0) ;
    return 0 ;
         }
    return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
      

  7.   

    我是用MFC的滚动条创建时怎么使之总是处在窗口的下面和右面。我用了
    CSize sz=GetWindowExt();
    GetClientRect(&rt);但结果sz=(0,0);
    rt=(0,0,0,0);我在CMyListView::OnCreate
    和CMainFrame::OnCreate
    都试过,
    但结果都是这样。//*************  我的根本问题是  ***************
    有什么好方法解决吗?在非CScrollView中怎样使用滚动条,比如在CView CListView中。
    也就是说怎样设置固定视图区域。
    比如(10000,10000)这样大的区域.
      

  8.   

    是啊在CListView中就是不知道怎样设置滚动范围呀,
    我设置了,没用。CListView是有滚动条的,就是它的性能和资源管理器一样。
    图标拖回来,滚动条就没有了。是不是该修改OnHScroll和OnVScroll但我又不知道怎样修改。我试了很多方法都不成功,
      

  9.   

    设置滚动条用SetScrollInfo函数,通常在OnSize函数中设置.
    控制滚动条则在OnHScroll和OnVScroll.