some little fixes

svn path=/trunk/; revision=9961
This commit is contained in:
Thomas Bluemel 2004-07-01 23:36:57 +00:00
parent db3e54f680
commit ecae0d0647

View file

@ -34,6 +34,7 @@ typedef struct
DWORD MaxBuffer; DWORD MaxBuffer;
DWORD ColumnsPerLine; DWORD ColumnsPerLine;
DWORD nLines; DWORD nLines;
DWORD nVisibleLinesComplete;
DWORD nVisibleLines; DWORD nVisibleLines;
INT Position; INT Position;
INT LineHeight; INT LineHeight;
@ -90,7 +91,7 @@ UnregisterHexEditorClass(HINSTANCE hInstance)
/*** Helper functions *********************************************************/ /*** Helper functions *********************************************************/
static VOID static VOID
HEXEDIT_MoveCaret(PHEXEDIT_DATA hed, INT Line, INT Column, BOOL HexDump) HEXEDIT_MoveCaret(PHEXEDIT_DATA hed, BOOL Scroll)
{ {
SCROLLINFO si; SCROLLINFO si;
@ -98,25 +99,28 @@ HEXEDIT_MoveCaret(PHEXEDIT_DATA hed, INT Line, INT Column, BOOL HexDump)
si.fMask = SIF_POS; si.fMask = SIF_POS;
GetScrollInfo(hed->hWndSelf, SB_VERT, &si); GetScrollInfo(hed->hWndSelf, SB_VERT, &si);
if(si.nPos > Line) if(Scroll)
{ {
si.nPos = Line; if(si.nPos > hed->CaretLine)
SetScrollInfo(hed->hWndSelf, SB_VERT, &si, TRUE); {
GetScrollInfo(hed->hWndSelf, SB_VERT, &si); si.nPos = hed->CaretLine;
InvalidateRect(hed->hWndSelf, NULL, TRUE); SetScrollInfo(hed->hWndSelf, SB_VERT, &si, TRUE);
} GetScrollInfo(hed->hWndSelf, SB_VERT, &si);
else if((Line - si.nPos) > hed->nVisibleLines) InvalidateRect(hed->hWndSelf, NULL, TRUE);
{ }
si.nPos += (Line - si.nPos); else if(hed->CaretLine >= (hed->nVisibleLinesComplete + si.nPos))
SetScrollInfo(hed->hWndSelf, SB_VERT, &si, TRUE); {
GetScrollInfo(hed->hWndSelf, SB_VERT, &si); si.nPos = hed->CaretLine - hed->nVisibleLinesComplete + 1;
InvalidateRect(hed->hWndSelf, NULL, TRUE); SetScrollInfo(hed->hWndSelf, SB_VERT, &si, TRUE);
GetScrollInfo(hed->hWndSelf, SB_VERT, &si);
InvalidateRect(hed->hWndSelf, NULL, TRUE);
}
} }
if(HexDump) if(hed->EditingField)
SetCaretPos(hed->LeftMargin + ((4 + hed->AddressSpacing) * hed->CharWidth) - 2, (Line - si.nPos) * hed->LineHeight); SetCaretPos(hed->LeftMargin + ((4 + hed->AddressSpacing + (3 * hed->CaretCol)) * hed->CharWidth) - 1, (hed->CaretLine - si.nPos) * hed->LineHeight);
else else
SetCaretPos(hed->LeftMargin + ((4 + hed->AddressSpacing + hed->SplitSpacing + (3 * hed->ColumnsPerLine)) * hed->CharWidth) - 2, (Line - si.nPos) * hed->LineHeight); SetCaretPos(hed->LeftMargin + ((4 + hed->AddressSpacing + hed->SplitSpacing + (3 * hed->ColumnsPerLine) + hed->CaretCol) * hed->CharWidth) - 2, (hed->CaretLine - si.nPos) * hed->LineHeight);
} }
static VOID static VOID
@ -139,7 +143,8 @@ HEXEDIT_Update(PHEXEDIT_DATA hed)
if(hed->LineHeight > 0) if(hed->LineHeight > 0)
{ {
hed->nVisibleLines = cvislines = rcClient.bottom / hed->LineHeight; hed->nVisibleLinesComplete = cvislines = rcClient.bottom / hed->LineHeight;
hed->nVisibleLines = hed->nVisibleLinesComplete;
if(rcClient.bottom % hed->LineHeight) if(rcClient.bottom % hed->LineHeight)
{ {
hed->nVisibleLines++; hed->nVisibleLines++;
@ -527,7 +532,7 @@ static LRESULT
HEXEDIT_WM_SETFOCUS(PHEXEDIT_DATA hed) HEXEDIT_WM_SETFOCUS(PHEXEDIT_DATA hed)
{ {
CreateCaret(hed->hWndSelf, 0, 1, hed->LineHeight); CreateCaret(hed->hWndSelf, 0, 1, hed->LineHeight);
HEXEDIT_MoveCaret(hed, hed->CaretLine, hed->CaretCol, hed->EditingField); HEXEDIT_MoveCaret(hed, FALSE);
ShowCaret(hed->hWndSelf); ShowCaret(hed->hWndSelf);
return 0; return 0;
} }
@ -725,35 +730,16 @@ HEXEDIT_WM_MOUSEWHEEL(PHEXEDIT_DATA hed, int cyMoveLines, WORD ButtonsDown, LPPO
} }
static LRESULT static LRESULT
HEXEDIT_WM_SETCURSOR(PHEXEDIT_DATA hed) HEXEDIT_WM_GETDLGCODE(LPMSG Msg)
{ {
POINTS pt; return DLGC_WANTARROWS | DLGC_WANTCHARS;
DWORD Hit, Pos;
Pos = GetMessagePos();
pt = MAKEPOINTS(Pos);
Hit = HEXEDIT_HitRegionTest(hed, pt, NULL);
switch(Hit)
{
case HEHT_HEXDUMP:
case HEHT_HEXDUMPSPACING:
case HEHT_ASCIIDUMP:
SetCursor(LoadCursor(0, MAKEINTRESOURCE(IDC_IBEAM)));
break;
default:
SetCursor(LoadCursor(0, MAKEINTRESOURCE(IDC_ARROW)));
break;
}
return TRUE;
} }
static BOOL static BOOL
HEXEDIT_WM_KEYDOWN(PHEXEDIT_DATA hed, INT VkCode) HEXEDIT_WM_KEYDOWN(PHEXEDIT_DATA hed, INT VkCode)
{ {
DWORD bufsize; DWORD bufsize;
BOOL shift, control, handled; BOOL shift, control;
if(GetKeyState(VK_MENU) & 0x8000) if(GetKeyState(VK_MENU) & 0x8000)
{ {
@ -764,7 +750,6 @@ HEXEDIT_WM_KEYDOWN(PHEXEDIT_DATA hed, INT VkCode)
control = GetKeyState(VK_CONTROL) & 0x8000; control = GetKeyState(VK_CONTROL) & 0x8000;
bufsize = (hed->hBuffer ? LocalSize(hed->hBuffer) : 0); bufsize = (hed->hBuffer ? LocalSize(hed->hBuffer) : 0);
handled = FALSE;
switch(VkCode) switch(VkCode)
{ {
@ -778,10 +763,8 @@ HEXEDIT_WM_KEYDOWN(PHEXEDIT_DATA hed, INT VkCode)
} }
else else
hed->Position--; hed->Position--;
HEXEDIT_MoveCaret(hed, hed->CaretLine, hed->CaretCol, hed->EditingField);
} }
handled = TRUE; HEXEDIT_MoveCaret(hed, TRUE);
break; break;
case VK_RIGHT: case VK_RIGHT:
@ -789,15 +772,54 @@ HEXEDIT_WM_KEYDOWN(PHEXEDIT_DATA hed, INT VkCode)
{ {
if(++hed->CaretCol > hed->ColumnsPerLine) if(++hed->CaretCol > hed->ColumnsPerLine)
{ {
hed->CaretLine = 0; hed->CaretCol = 0;
hed->CaretLine++; hed->CaretLine++;
} }
else else
hed->Position++; hed->Position++;
HEXEDIT_MoveCaret(hed, hed->CaretLine, hed->CaretCol, hed->EditingField);
} }
handled = TRUE; HEXEDIT_MoveCaret(hed, TRUE);
break;
case VK_UP:
if(hed->Position > 0)
{
if(hed->CaretLine <= 0)
{
hed->CaretCol = 0;
hed->Position = 0;
}
else
{
hed->CaretLine--;
hed->Position -= hed->ColumnsPerLine;
}
}
HEXEDIT_MoveCaret(hed, TRUE);
break;
case VK_DOWN:
if(hed->Position <= bufsize)
{
if(hed->CaretLine < hed->nLines - 1)
{
hed->Position += hed->ColumnsPerLine;
hed->CaretLine++;
if(hed->Position > bufsize)
{
hed->Position = bufsize;
hed->CaretLine = (hed->nLines > 0 ? hed->nLines - 1 : 0);
hed->CaretCol = bufsize % hed->ColumnsPerLine;
}
}
else
{
INT tmp = bufsize % hed->ColumnsPerLine;
hed->Position = bufsize;
hed->CaretCol = (tmp == 0 ? hed->ColumnsPerLine : tmp);
}
}
HEXEDIT_MoveCaret(hed, TRUE);
break; break;
} }
@ -826,9 +848,6 @@ HexEditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case WM_PAINT: case WM_PAINT:
return HEXEDIT_WM_PAINT(hed); return HEXEDIT_WM_PAINT(hed);
case WM_SETCURSOR:
return HEXEDIT_WM_SETCURSOR(hed);
case WM_KEYDOWN: case WM_KEYDOWN:
return HEXEDIT_WM_KEYDOWN(hed, (INT)wParam); return HEXEDIT_WM_KEYDOWN(hed, (INT)wParam);
@ -839,7 +858,18 @@ HexEditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return HEXEDIT_WM_SIZE(hed, (DWORD)wParam, LOWORD(lParam), HIWORD(lParam)); 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)); {
UINT nScrollLines = 3;
int delta = 0;
SystemParametersInfoW(SPI_GETWHEELSCROLLLINES, 0, &nScrollLines, 0);
delta -= (SHORT)HIWORD(wParam);
if(abs(delta) >= WHEEL_DELTA && nScrollLines != 0)
{
return HEXEDIT_WM_MOUSEWHEEL(hed, nScrollLines * (delta / WHEEL_DELTA), LOWORD(wParam), &MAKEPOINTS(lParam));
}
break;
}
case HEM_LOADBUFFER: case HEM_LOADBUFFER:
return HEXEDIT_HEM_LOADBUFFER(hed, (PVOID)wParam, (DWORD)lParam); return HEXEDIT_HEM_LOADBUFFER(hed, (PVOID)wParam, (DWORD)lParam);
@ -856,6 +886,9 @@ HexEditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case WM_KILLFOCUS: case WM_KILLFOCUS:
return HEXEDIT_WM_KILLFOCUS(hed); return HEXEDIT_WM_KILLFOCUS(hed);
case WM_GETDLGCODE:
return HEXEDIT_WM_GETDLGCODE((LPMSG)lParam);
case WM_SETFONT: case WM_SETFONT:
return HEXEDIT_WM_SETFONT(hed, (HFONT)wParam, (BOOL)LOWORD(lParam)); return HEXEDIT_WM_SETFONT(hed, (HFONT)wParam, (BOOL)LOWORD(lParam));