mirror of
https://github.com/reactos/reactos.git
synced 2025-06-12 01:48:31 +00:00
some little fixes
svn path=/trunk/; revision=9961
This commit is contained in:
parent
db3e54f680
commit
ecae0d0647
1 changed files with 85 additions and 52 deletions
|
@ -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));
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue