2013-04-19 9 views
0

Я хочу создать приятный пользовательский интерфейс для моего проекта. Я создаю окно, затем создаю дочернее окно, которое является основным окном для функций интерфейса. Итак ... У меня эти два окна, в дочернем окне я хочу добавить полосу прокрутки. Я создал класс Scrollbar:Обработка прокрутки WinApi

class Scrollbar 
{ 
public: 
    HINSTANCE hInstance; 
    HWND hwnd; 
    SCROLLINFO si; 
    Scrollbar(HWND Scroll_hwnd, HINSTANCE hInstance, HWND hwnd, SCROLLINFO si, RECT Child_rect, int iHThumb); 
    SCROLLINFO Initialise(SCROLLINFO si, RECT rect); 
    ~Scrollbar(); 
}; 

в конструкторе я имею basicaly иметь функцию CreateWindow:

Scroll_hwnd = CreateWindow(
L"SCROLLBAR", 
(LPCWSTR)NULL, 
WS_CHILD | WS_VISIBLE | SBS_HORZ | SBS_BOTTOMALIGN, 
Child_rect.left,Child_rect.top,Child_rect.right-iHThumb,Child_rect.bottom, 
hwnd, 
NULL, 
hInstance, 
NULL); 

SetScrollRange(Scroll_hwnd, SB_CTL, 0, 10, FALSE); 

Так свитка будет создаваться, но теперь я хочу, чтобы справиться с этим как-то так я сделать что-то вроде это в моем детском окне CALLBACK FUNC:

case WM_HSCROLL: 
    { 

    GetScrollInfo(hwnd, SB_VERT, &si); 

    int position = si.nPos; 

    switch(LOWORD(wParam)) 
    { 

    case SB_LINELEFT: 
     if(position > 0) 
     { 
      position--; 
     } 
     break; 
    case SB_LINERIGHT: 
     if(position < 10) 
     { 
      position++; 
     } 
     break; 
    ZeroMemory(& si, sizeof(si)); 
    si.cbSize = sizeof(SCROLLINFO); 
    si.fMask = SIF_POS; 
    si.nPos = position; 

    SetScrollInfo(hwnd, SB_VERT, & si, TRUE); 
} 

Незнайка, но по-моему там все нормально ... переменная позиция получает приращение только штраф, но свиток еще в Начальная позиция. Любая идея, что не так? Кроме того, когда я пытаюсь сделать что-то вроде этого:

Scrollbar *s1; 
s1 = &scroll; 

(...)

GetScrollInfo(hwnd, SB_VERT, s1->si); 

Я получаю сообщение об ошибке преобразования (SCROLLINFO TO LPSCROLLINFO)

Любая идея, как это исправить ?

ответ

1

Вы создали горизонтальную полосу прокрутки, но вы получаете/устанавливаете значения вертикальной полосы прокрутки в своем обратном вызове. Изменить SB_VERT на SB_HORZ.

Что касается ошибки компилятора, вы действительно передаете SCROLLINFO, где ожидается SCROLLINFO*.

Изменить это:

GetScrollInfo(hwnd, SB_VERT, s1->si); 

Для этого:

GetScrollInfo(hwnd, SB_HORZ, &(s1->si)); 

Или это:

GetScrollInfo(hwnd, SB_HORZ, &(scroll.si)); 
+0

Благодаря человеку! Это помогло! :) Я потерял 2 часа, искал ошибку и менял свой код, и ответ был настолько прост. Черт:/Еще раз, спасибо! – L3M0L

Смежные вопросы