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;
|
HIMAGELIST imagelist;
|
||||||
int imagelistHeight;
|
int imagelistHeight;
|
||||||
intptr_t width;
|
intptr_t width;
|
||||||
intptr_t hpageSize;
|
intptr_t hpagesize;
|
||||||
intptr_t hpos;
|
intptr_t hpos;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -94,6 +94,82 @@ static RECT realClientRect(struct table *t)
|
||||||
return r;
|
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)
|
static void recomputeHScroll(struct table *t)
|
||||||
{
|
{
|
||||||
HDITEMW item;
|
HDITEMW item;
|
||||||
|
@ -114,12 +190,12 @@ static void recomputeHScroll(struct table *t)
|
||||||
|
|
||||||
if (GetClientRect(t->hwnd, &r) == 0)
|
if (GetClientRect(t->hwnd, &r) == 0)
|
||||||
abort();
|
abort();
|
||||||
t->hpageSize = r.right - r.left;
|
t->hpagesize = r.right - r.left;
|
||||||
|
|
||||||
ZeroMemory(&si, sizeof (SCROLLINFO));
|
ZeroMemory(&si, sizeof (SCROLLINFO));
|
||||||
si.cbSize = sizeof (SCROLLINFO);
|
si.cbSize = sizeof (SCROLLINFO);
|
||||||
si.fMask = SIF_PAGE | SIF_RANGE;
|
si.fMask = SIF_PAGE | SIF_RANGE;
|
||||||
si.nPage = t->hpageSize;
|
si.nPage = t->hpagesize;
|
||||||
si.nMin = 0;
|
si.nMin = 0;
|
||||||
si.nMax = t->width - 1; // - 1 because endpoints inclusive
|
si.nMax = t->width - 1; // - 1 because endpoints inclusive
|
||||||
SetScrollInfo(t->hwnd, SB_HORZ, &si, TRUE);
|
SetScrollInfo(t->hwnd, SB_HORZ, &si, TRUE);
|
||||||
|
@ -533,6 +609,9 @@ if (ImageList_GetIconSize(t->imagelist, &unused, &(t->imagelistHeight)) == 0)abo
|
||||||
case WM_MOUSEWHEEL:
|
case WM_MOUSEWHEEL:
|
||||||
wheelscroll(t, wParam);
|
wheelscroll(t, wParam);
|
||||||
return 0;
|
return 0;
|
||||||
|
case WM_HSCROLL:
|
||||||
|
hscroll(t, wParam);
|
||||||
|
return 0;
|
||||||
case WM_SIZE:
|
case WM_SIZE:
|
||||||
resize(t);
|
resize(t);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue