Implemented horizontal scrolling. Horizontally scrolled drawing not yet implemented.
This commit is contained in:
parent
bc5955bc35
commit
3cb5017b35
|
@ -46,7 +46,7 @@ struct table {
|
|||
HIMAGELIST imagelist;
|
||||
int imagelistHeight;
|
||||
intptr_t width;
|
||||
intptr_t hpageSize;
|
||||
intptr_t hpagesize;
|
||||
intptr_t hpos;
|
||||
};
|
||||
|
||||
|
@ -94,6 +94,82 @@ static RECT realClientRect(struct table *t)
|
|||
return r;
|
||||
}
|
||||
|
||||
static void hscrollto(struct table *t, intptr_t newpos)
|
||||
{
|
||||
SCROLLINFO si;
|
||||
|
||||
if (newpos < 0)
|
||||
newpos = 0;
|
||||
if (newpos > (t->width - t->hpagesize))
|
||||
newpos = (t->width - t->hpagesize);
|
||||
|
||||
// negative because ScrollWindowEx() is "backwards"
|
||||
if (ScrollWindowEx(t->hwnd, -(newpos - t->hpos), 0,
|
||||
NULL, NULL, NULL, NULL,
|
||||
SW_ERASE | SW_INVALIDATE) == ERROR)
|
||||
abort();
|
||||
t->hpos = newpos;
|
||||
// TODO text in header controls doesn't redraw?
|
||||
|
||||
// TODO put this in a separate function? same for vscroll?
|
||||
ZeroMemory(&si, sizeof (SCROLLINFO));
|
||||
si.cbSize = sizeof (SCROLLINFO);
|
||||
si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE;
|
||||
si.nPage = t->hpagesize;
|
||||
si.nMin = 0;
|
||||
si.nMax = t->width - 1; // nMax is inclusive
|
||||
si.nPos = t->hpos;
|
||||
SetScrollInfo(t->hwnd, SB_HORZ, &si, TRUE);
|
||||
}
|
||||
|
||||
static void hscrollby(struct table *t, intptr_t n)
|
||||
{
|
||||
hscrollto(t, t->hpos + n);
|
||||
}
|
||||
|
||||
// unfortunately horizontal wheel scrolling was only added in Vista
|
||||
|
||||
static void hscroll(struct table *t, WPARAM wParam)
|
||||
{
|
||||
SCROLLINFO si;
|
||||
intptr_t newpos;
|
||||
|
||||
ZeroMemory(&si, sizeof (SCROLLINFO));
|
||||
si.cbSize = sizeof (SCROLLINFO);
|
||||
si.fMask = SIF_POS | SIF_TRACKPOS;
|
||||
if (GetScrollInfo(t->hwnd, SB_HORZ, &si) == 0)
|
||||
abort();
|
||||
|
||||
newpos = t->hpos;
|
||||
switch (LOWORD(wParam)) {
|
||||
case SB_LEFT:
|
||||
newpos = 0;
|
||||
break;
|
||||
case SB_RIGHT:
|
||||
newpos = t->width - t->hpagesize;
|
||||
break;
|
||||
case SB_LINELEFT:
|
||||
newpos--;
|
||||
break;
|
||||
case SB_LINERIGHT:
|
||||
newpos++;
|
||||
break;
|
||||
case SB_PAGELEFT:
|
||||
newpos -= t->hpagesize;
|
||||
break;
|
||||
case SB_PAGERIGHT:
|
||||
newpos += t->hpagesize;
|
||||
break;
|
||||
case SB_THUMBPOSITION:
|
||||
newpos = (intptr_t) (si.nPos);
|
||||
break;
|
||||
case SB_THUMBTRACK:
|
||||
newpos = (intptr_t) (si.nTrackPos);
|
||||
}
|
||||
|
||||
hscrollto(t, newpos);
|
||||
}
|
||||
|
||||
static void recomputeHScroll(struct table *t)
|
||||
{
|
||||
HDITEMW item;
|
||||
|
@ -114,12 +190,12 @@ static void recomputeHScroll(struct table *t)
|
|||
|
||||
if (GetClientRect(t->hwnd, &r) == 0)
|
||||
abort();
|
||||
t->hpageSize = r.right - r.left;
|
||||
t->hpagesize = r.right - r.left;
|
||||
|
||||
ZeroMemory(&si, sizeof (SCROLLINFO));
|
||||
si.cbSize = sizeof (SCROLLINFO);
|
||||
si.fMask = SIF_PAGE | SIF_RANGE;
|
||||
si.nPage = t->hpageSize;
|
||||
si.nPage = t->hpagesize;
|
||||
si.nMin = 0;
|
||||
si.nMax = t->width - 1; // - 1 because endpoints inclusive
|
||||
SetScrollInfo(t->hwnd, SB_HORZ, &si, TRUE);
|
||||
|
@ -533,6 +609,9 @@ if (ImageList_GetIconSize(t->imagelist, &unused, &(t->imagelistHeight)) == 0)abo
|
|||
case WM_MOUSEWHEEL:
|
||||
wheelscroll(t, wParam);
|
||||
return 0;
|
||||
case WM_HSCROLL:
|
||||
hscroll(t, wParam);
|
||||
return 0;
|
||||
case WM_SIZE:
|
||||
resize(t);
|
||||
return 0;
|
||||
|
|
Loading…
Reference in New Issue