2010-05-20 147 views
1

哎,这里即时通讯创建窗口: _hWnd = CreateWindowEx( WS_EX_CLIENTEDGE,// dwExStyle参数 (LPCWSTR)_wndClass,// lpClassName L “”,// lpWindowName WS_CHILD | WS_HSCROLL | WS_VSCROLL, // dwStyle CW_USEDEFAULT,// X CW_USEDEFAULT,//ÿ 200,// nWidth 150,// nHeight参数 hWndParent,// hWndParent NULL,// HMENU 的hInstance,//的hInstance NULL // lpParam );C++滚动条窗口

我添加了滚动条(WS_HSCROLL | WS_VSCROLL),但我该如何控制它们?

回答

1

我认为你应该参考MSDN获取更多信息,但这里是我写一天的一小段代码(仅仅是为了你从某件事开始)。

通常,这个想法是关于处理WindowProcedure例程中的特定消息(WM_HSCROLL,WM_VSCROLL)。评估新卷轴位置(我的意思是WinAPI方式)的最简单方法是使用特定的SCROLLINFO结构。在下面的代码块中,使用了SCROLLINFO si

case WM_HSCROLL: 
    { 
     TEXTHANDLER * handler = ((TEXTHANDLER *)GetProp(hWnd, "TEXTHANDLER")); 

     // If user is trying to scroll outside 
     // of scroll range, we don't have to 
     // invalidate window 
     BOOL needInvalidation = TRUE; 

     if (handler->renderer->wordWrap) 
     { 
     return 0; 
     } 

     si.cbSize = sizeof(si); 
     si.fMask = SIF_ALL; 
     GetScrollInfo(hWnd, SB_HORZ, &si); 

     switch (LOWORD(wParam)) 
     { 
     case SB_LINELEFT: 
     si.nPos -= 1; 
     if (si.nPos < 0) 
     { 
      si.nPos = 0; 
      needInvalidation = FALSE; 
     } 
     break; 

     case SB_LINERIGHT: 
     si.nPos += 1; 
     if (si.nPos > si.nMax) 
     { 
      si.nPos = si.nMax; 
      needInvalidation = FALSE; 
     } 
     break; 

     case SB_THUMBTRACK: 
     si.nPos = si.nTrackPos; 
     break; 
     } 

     si.fMask = SIF_POS; 
     SetScrollInfo(hWnd, SB_HORZ, &si, TRUE); 

     // Set new text renderer parameters 
     handler->renderer->xPos = si.nPos; 

     if (needInvalidation) InvalidateRect(hWnd, NULL, FALSE); 
     return 0; 
    } 

    case WM_VSCROLL: 
    { 
     TEXTHANDLER * handler = ((TEXTHANDLER *)GetProp(hWnd, "TEXTHANDLER")); 

     BOOL needInvalidation = TRUE; 

     si.cbSize = sizeof(si); 
     si.fMask = SIF_ALL; 
     GetScrollInfo(hWnd, SB_VERT, &si); 

     switch (LOWORD(wParam)) 
     { 
     case SB_LINEUP: 
     si.nPos -= 1; 
     if (si.nPos < 0) 
     { 
      si.nPos = 0; 
      needInvalidation = FALSE; 
     } 
     break; 

     case SB_LINEDOWN: 
     si.nPos += 1; 
     if (si.nPos > si.nMax) 
     { 
      si.nPos = si.nMax; 
      needInvalidation = FALSE; 
     } 
     break; 

     case SB_PAGEUP: 
     si.nPos -= handler->renderer->cyCount; 
     if (si.nPos < 0) 
     { 
      si.nPos = 0; 
      needInvalidation = FALSE; 
     } 
     break; 

     case SB_PAGEDOWN: 
     si.nPos += handler->renderer->cyCount; 
     if (si.nPos > si.nMax) 
     { 
      si.nPos = si.nMax; 
      needInvalidation = FALSE; 
     } 
     break; 

     case SB_THUMBTRACK: 
     si.nPos = si.nTrackPos; 
     break; 
     } 

     si.fMask = SIF_POS; 
     SetScrollInfo(hWnd, SB_VERT, &si, TRUE); 

     // Set new text renderer parameters 
     handler->renderer->yPos = si.nPos; 

     if (needInvalidation) InvalidateRect(hWnd, NULL, FALSE); 
     return 0; 
    }