5

Win32 でスクロールを実装する方法の明確でわかりやすい例を教えてもらえますか (または提供してもらえますか?)。明らかに、Google は多くのことを提示しますが、ほとんどの例は単純すぎるか複雑すぎるように思われ、正しい方法を示していると確信できません。私は現在のプロジェクトで LispWorks CAPI (クロスプラットフォームの Common Lisp GUI ライブラリ) を使用していますが、Windows ではスクロールに関するわかりにくいバグがあります。基本的に、Win32 API を介して直接いくつかのテストを行い、状況を明らかにできるかどうかを確認したいと考えています。

どうもありがとう、クリストファー

4

2 に答える 2

0

WM_VSCROLL/WM_HSCROLL イベントを処理する方法の例について話していると思います。その場合、最初のステップはそのイベントを処理することです。その呼び出しの HIWORD(wParam) 値を使用するのではなく、代わりに GetScrollInfo、GetScrollPos、および GetScrollRange 関数を使用してください。

以下は、MSDN によって抜粋されたサンプル コードです- Using Scroll Bars。xCurrentScroll は、たとえば GetScrollPos() を呼び出すことによって事前に決定されます。

int xDelta;     // xDelta = new_pos - current_pos  
int xNewPos;    // new position 
int yDelta = 0; 

switch (LOWORD(wParam)) { 
    // User clicked the scroll bar shaft left of the scroll box. 
    case SB_PAGEUP: 
        xNewPos = xCurrentScroll - 50; 
        break; 

    // User clicked the scroll bar shaft right of the scroll box. 
    case SB_PAGEDOWN: 
        xNewPos = xCurrentScroll + 50; 
        break; 

    // User clicked the left arrow. 
    case SB_LINEUP: 
        xNewPos = xCurrentScroll - 5; 
        break; 

    // User clicked the right arrow. 
    case SB_LINEDOWN: 
        xNewPos = xCurrentScroll + 5; 
        break; 

    // User dragged the scroll box. 
    case SB_THUMBPOSITION: 
        xNewPos = HIWORD(wParam); 
        break; 

    default: 
        xNewPos = xCurrentScroll; 
} 

[...]

// New position must be between 0 and the screen width. 
xNewPos = max(0, xNewPos); 
xNewPos = min(xMaxScroll, xNewPos); 

[...]

// Reset the scroll bar. 
si.cbSize = sizeof(si); 
si.fMask  = SIF_POS; 
si.nPos   = xCurrentScroll; 
SetScrollInfo(hwnd, SB_HORZ, &si, TRUE);
于 2011-01-17T12:03:20.543 に答える