fixed scrollbar issues

svn path=/trunk/; revision=9787
This commit is contained in:
Thomas Bluemel 2004-06-21 01:30:34 +00:00
parent bb74619906
commit 16ea2c47a7

View file

@ -39,6 +39,7 @@ typedef struct
INT LineHeight; INT LineHeight;
INT CharWidth; INT CharWidth;
HFONT hFont; HFONT hFont;
BOOL SbVisible;
INT LeftMargin; INT LeftMargin;
INT AddressSpacing; INT AddressSpacing;
@ -123,38 +124,49 @@ HEXEDIT_Update(PHEXEDIT_DATA hed)
{ {
SCROLLINFO si; SCROLLINFO si;
RECT rcClient; RECT rcClient;
BOOL SbVisible;
DWORD bufsize, cvislines;
GetClientRect(hed->hWndSelf, &rcClient); GetClientRect(hed->hWndSelf, &rcClient);
hed->style = GetWindowLong(hed->hWndSelf, GWL_STYLE); hed->style = GetWindowLong(hed->hWndSelf, GWL_STYLE);
hed->nLines = max((hed->hBuffer ? LocalSize(hed->hBuffer) / hed->ColumnsPerLine : 1), 1); bufsize = (hed->hBuffer ? LocalSize(hed->hBuffer) : 0);
hed->nLines = max(bufsize / hed->ColumnsPerLine, 1);
if(bufsize > hed->ColumnsPerLine && (bufsize % hed->ColumnsPerLine) > 0)
{
hed->nLines++;
}
if(hed->LineHeight > 0) if(hed->LineHeight > 0)
{ {
hed->nVisibleLines = rcClient.bottom / hed->LineHeight; hed->nVisibleLines = cvislines = rcClient.bottom / hed->LineHeight;
if(rcClient.bottom % hed->LineHeight) if(rcClient.bottom % hed->LineHeight)
{ {
hed->nVisibleLines++; hed->nVisibleLines++;
} }
} }
else else
hed->nVisibleLines = 0; {
hed->nVisibleLines = cvislines = 0;
}
SbVisible = bufsize > 0 && cvislines < hed->nLines;
ShowScrollBar(hed->hWndSelf, SB_VERT, SbVisible);
/* update scrollbar */ /* update scrollbar */
si.cbSize = sizeof(SCROLLINFO); si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_RANGE | SIF_PAGE; si.fMask = SIF_RANGE | SIF_PAGE;
si.nMin = 0; si.nMin = 0;
si.nMax = hed->nLines; si.nMax = ((bufsize > 0) ? hed->nLines - 1 : 0);
if(hed->LineHeight > 0) si.nPage = ((hed->LineHeight > 0) ? rcClient.bottom / hed->LineHeight : 0);
si.nPage = rcClient.bottom / hed->LineHeight;
else
si.nPage = 0;
SetScrollInfo(hed->hWndSelf, SB_VERT, &si, TRUE); SetScrollInfo(hed->hWndSelf, SB_VERT, &si, TRUE);
if(hed->style & WS_VISIBLE) if(IsWindowVisible(hed->hWndSelf) && SbVisible != hed->SbVisible)
{ {
InvalidateRect(hed->hWndSelf, NULL, TRUE); InvalidateRect(hed->hWndSelf, NULL, TRUE);
} }
hed->SbVisible = SbVisible;
} }
static HFONT static HFONT
@ -174,6 +186,8 @@ HEXEDIT_PaintLines(PHEXEDIT_DATA hed, HDC hDC, DWORD ScrollPos, DWORD First, DWO
TCHAR hex[3], addr[17]; TCHAR hex[3], addr[17];
RECT rct; RECT rct;
FillRect(hDC, rc, (HBRUSH)(COLOR_WINDOW + 1));
if(hed->hBuffer) if(hed->hBuffer)
{ {
bufsize = LocalSize(hed->hBuffer); bufsize = LocalSize(hed->hBuffer);
@ -183,9 +197,15 @@ HEXEDIT_PaintLines(PHEXEDIT_DATA hed, HDC hDC, DWORD ScrollPos, DWORD First, DWO
{ {
buf = NULL; buf = NULL;
bufsize = 0; bufsize = 0;
if(ScrollPos + First == 0)
{
/* draw address */
_stprintf(addr, _T("%04X"), 0);
TextOut(hDC, hed->LeftMargin, First * hed->LineHeight, addr, 4);
}
} }
FillRect(hDC, rc, (HBRUSH)(COLOR_WINDOW + 1));
if(buf) if(buf)
{ {
end = buf + bufsize; end = buf + bufsize;
@ -472,6 +492,7 @@ HEXEDIT_WM_NCCREATE(HWND hWnd, CREATESTRUCT *cs)
hed->EditingField = TRUE; /* in hexdump field */ hed->EditingField = TRUE; /* in hexdump field */
SetWindowLong(hWnd, 0, (LONG)hed); SetWindowLong(hWnd, 0, (LONG)hed);
HEXEDIT_Update(hed);
return TRUE; return TRUE;
} }
@ -778,6 +799,13 @@ HEXEDIT_WM_KEYDOWN(PHEXEDIT_DATA hed, INT VkCode)
return FALSE; return FALSE;
} }
static LRESULT
HEXEDIT_WM_SIZE(PHEXEDIT_DATA hed, DWORD sType, WORD NewWidth, WORD NewHeight)
{
HEXEDIT_Update(hed);
return 0;
}
LRESULT LRESULT
WINAPI WINAPI
HexEditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) HexEditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
@ -802,6 +830,9 @@ HexEditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case WM_VSCROLL: case WM_VSCROLL:
return HEXEDIT_WM_VSCROLL(hed, HIWORD(wParam), LOWORD(wParam)); return HEXEDIT_WM_VSCROLL(hed, HIWORD(wParam), LOWORD(wParam));
case WM_SIZE:
return HEXEDIT_WM_SIZE(hed, (DWORD)wParam, LOWORD(lParam), HIWORD(lParam));
case WM_MOUSEWHEEL: case WM_MOUSEWHEEL:
return HEXEDIT_WM_MOUSEWHEEL(hed, ((SHORT)(wParam >> 16) < 0 ? 3 : -3), LOWORD(wParam), &MAKEPOINTS(lParam)); return HEXEDIT_WM_MOUSEWHEEL(hed, ((SHORT)(wParam >> 16) < 0 ? 3 : -3), LOWORD(wParam), &MAKEPOINTS(lParam));