4 * Copyright (C) 2004 Thomas Weidenmueller <w3seek@reactos.com>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
31 INT nVisibleLinesComplete
;
46 } HEXEDIT_DATA
, *PHEXEDIT_DATA
;
49 #define HEHT_LEFTMARGIN (0x1)
50 #define HEHT_ADDRESS (0x2)
51 #define HEHT_ADDRESSSPACING (0x3)
52 #define HEHT_HEXDUMP (0x4)
53 #define HEHT_HEXDUMPSPACING (0x5)
54 #define HEHT_ASCIIDUMP (0x6)
55 #define HEHT_RIGHTMARGIN (0x7)
57 INT_PTR CALLBACK
HexEditWndProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
61 RegisterHexEditorClass(HINSTANCE hInstance
)
65 ZeroMemory(&WndClass
, sizeof(WNDCLASSEX
));
66 WndClass
.cbSize
= sizeof(WNDCLASSEX
);
67 WndClass
.style
= CS_DBLCLKS
;
68 WndClass
.lpfnWndProc
= (WNDPROC
)HexEditWndProc
;
69 WndClass
.cbWndExtra
= sizeof(PHEXEDIT_DATA
);
70 WndClass
.hInstance
= hInstance
;
71 WndClass
.hCursor
= LoadCursor(0, IDC_IBEAM
);
72 WndClass
.hbrBackground
= (HBRUSH
)(COLOR_WINDOW
+ 1);
73 WndClass
.lpszClassName
= HEX_EDIT_CLASS_NAME
;
75 return RegisterClassEx(&WndClass
);
80 UnregisterHexEditorClass(HINSTANCE hInstance
)
82 return UnregisterClass(HEX_EDIT_CLASS_NAME
, hInstance
);
85 /*** Helper functions *********************************************************/
88 HEXEDIT_MoveCaret(PHEXEDIT_DATA hed
, BOOL Scroll
)
92 si
.cbSize
= sizeof(SCROLLINFO
);
94 GetScrollInfo(hed
->hWndSelf
, SB_VERT
, &si
);
98 if(si
.nPos
> hed
->CaretLine
)
100 si
.nPos
= hed
->CaretLine
;
101 SetScrollInfo(hed
->hWndSelf
, SB_VERT
, &si
, TRUE
);
102 GetScrollInfo(hed
->hWndSelf
, SB_VERT
, &si
);
103 InvalidateRect(hed
->hWndSelf
, NULL
, TRUE
);
105 else if(hed
->CaretLine
>= (hed
->nVisibleLinesComplete
+ si
.nPos
))
107 si
.nPos
= hed
->CaretLine
- hed
->nVisibleLinesComplete
+ 1;
108 SetScrollInfo(hed
->hWndSelf
, SB_VERT
, &si
, TRUE
);
109 GetScrollInfo(hed
->hWndSelf
, SB_VERT
, &si
);
110 InvalidateRect(hed
->hWndSelf
, NULL
, TRUE
);
114 if(hed
->EditingField
)
115 SetCaretPos(hed
->LeftMargin
+ ((4 + hed
->AddressSpacing
+ (3 * hed
->CaretCol
)) * hed
->CharWidth
) - 1, (hed
->CaretLine
- si
.nPos
) * hed
->LineHeight
);
117 SetCaretPos(hed
->LeftMargin
+ ((4 + hed
->AddressSpacing
+ hed
->SplitSpacing
+ (3 * hed
->ColumnsPerLine
) + hed
->CaretCol
) * hed
->CharWidth
) - 2, (hed
->CaretLine
- si
.nPos
) * hed
->LineHeight
);
121 HEXEDIT_Update(PHEXEDIT_DATA hed
)
126 INT bufsize
, cvislines
;
128 GetClientRect(hed
->hWndSelf
, &rcClient
);
129 hed
->style
= GetWindowLongPtr(hed
->hWndSelf
, GWL_STYLE
);
131 bufsize
= (hed
->hBuffer
? (INT
) LocalSize(hed
->hBuffer
) : 0);
132 hed
->nLines
= max(bufsize
/ hed
->ColumnsPerLine
, 1);
133 if(bufsize
> hed
->ColumnsPerLine
&& (bufsize
% hed
->ColumnsPerLine
) > 0)
138 if(hed
->LineHeight
> 0)
140 hed
->nVisibleLinesComplete
= cvislines
= rcClient
.bottom
/ hed
->LineHeight
;
141 hed
->nVisibleLines
= hed
->nVisibleLinesComplete
;
142 if(rcClient
.bottom
% hed
->LineHeight
)
144 hed
->nVisibleLines
++;
149 hed
->nVisibleLines
= cvislines
= 0;
152 SbVisible
= bufsize
> 0 && cvislines
< hed
->nLines
;
153 ShowScrollBar(hed
->hWndSelf
, SB_VERT
, SbVisible
);
155 /* update scrollbar */
156 si
.cbSize
= sizeof(SCROLLINFO
);
157 si
.fMask
= SIF_RANGE
| SIF_PAGE
;
159 si
.nMax
= ((bufsize
> 0) ? hed
->nLines
- 1 : 0);
160 si
.nPage
= ((hed
->LineHeight
> 0) ? rcClient
.bottom
/ hed
->LineHeight
: 0);
161 SetScrollInfo(hed
->hWndSelf
, SB_VERT
, &si
, TRUE
);
163 if(IsWindowVisible(hed
->hWndSelf
) && SbVisible
!= hed
->SbVisible
)
165 InvalidateRect(hed
->hWndSelf
, NULL
, TRUE
);
168 hed
->SbVisible
= SbVisible
;
172 HEXEDIT_GetFixedFont(VOID
)
175 GetObject(GetStockObject(ANSI_FIXED_FONT
), sizeof(LOGFONT
), &lf
);
176 return CreateFontIndirect(&lf
);
180 HEXEDIT_PaintLines(PHEXEDIT_DATA hed
, HDC hDC
, DWORD ScrollPos
, DWORD First
, DWORD Last
, RECT
*rc
)
182 DWORD dx
, dy
, linestart
;
184 PBYTE buf
, current
, end
, line
;
186 TCHAR hex
[3], addr
[17];
189 FillRect(hDC
, rc
, (HBRUSH
)(COLOR_WINDOW
+ 1));
193 bufsize
= LocalSize(hed
->hBuffer
);
194 buf
= LocalLock(hed
->hBuffer
);
201 if(ScrollPos
+ First
== 0)
204 _stprintf(addr
, _T("%04X"), 0);
205 TextOut(hDC
, hed
->LeftMargin
, First
* hed
->LineHeight
, addr
, 4);
212 dy
= First
* hed
->LineHeight
;
213 linestart
= (ScrollPos
+ First
) * hed
->ColumnsPerLine
;
214 current
= buf
+ linestart
;
215 Last
= min(hed
->nLines
- ScrollPos
, Last
);
217 while(First
<= Last
&& current
< end
)
221 dx
= hed
->LeftMargin
;
224 _stprintf(addr
, _T("%04lX"), linestart
);
225 TextOut(hDC
, dx
, dy
, addr
, 4);
227 dx
+= ((4 + hed
->AddressSpacing
) * hed
->CharWidth
);
228 dh
= (3 * hed
->CharWidth
);
232 rct
.right
= rct
.left
+ dh
;
233 rct
.bottom
= dy
+ hed
->LineHeight
;
236 dx
+= (hed
->CharWidth
/ 2);
238 for(x
= 0; x
< hed
->ColumnsPerLine
&& current
< end
; x
++)
243 _stprintf(hex
, _T("%02X"), *(current
++));
244 ExtTextOut(hDC
, dx
, dy
, ETO_OPAQUE
, &rct
, hex
, 2, NULL
);
249 dx
= ((4 + hed
->AddressSpacing
+ hed
->SplitSpacing
+ (hed
->ColumnsPerLine
* 3)) * hed
->CharWidth
);
251 for(x
= 0; x
< hed
->ColumnsPerLine
&& current
< end
; x
++)
253 _stprintf(hex
, _T("%C"), *(current
++));
254 hex
[0] = ((hex
[0] & _T('\x007f')) >= _T(' ') ? hex
[0] : _T('.'));
255 TextOut(hDC
, dx
, dy
, hex
, 1);
256 dx
+= hed
->CharWidth
;
259 dy
+= hed
->LineHeight
;
260 linestart
+= hed
->ColumnsPerLine
;
265 LocalUnlock(hed
->hBuffer
);
269 HEXEDIT_HitRegionTest(PHEXEDIT_DATA hed
, POINTS pt
)
273 if(pt
.x
<= hed
->LeftMargin
)
275 return HEHT_LEFTMARGIN
;
278 pt
.x
-= hed
->LeftMargin
;
279 d
= (4 * hed
->CharWidth
);
286 d
= (hed
->AddressSpacing
* hed
->CharWidth
);
289 return HEHT_ADDRESSSPACING
;
293 d
= (3 * hed
->ColumnsPerLine
* hed
->CharWidth
);
300 d
= (hed
->SplitSpacing
* hed
->CharWidth
);
303 return HEHT_HEXDUMPSPACING
;
307 d
= (hed
->ColumnsPerLine
* hed
->CharWidth
);
310 return HEHT_ASCIIDUMP
;
313 return HEHT_RIGHTMARGIN
;
317 HEXEDIT_PositionFromPoint(PHEXEDIT_DATA hed
, POINTS pt
, DWORD Hit
, POINT
*EditPos
, BOOL
*EditField
)
322 si
.cbSize
= sizeof(SCROLLINFO
);
324 GetScrollInfo(hed
->hWndSelf
, SB_VERT
, &si
);
328 if(hed
->LineHeight
> 0)
330 EditPos
->y
= min(si
.nPos
+ (pt
.y
/ hed
->LineHeight
), hed
->nLines
- 1);
334 EditPos
->y
= si
.nPos
;
339 case HEHT_LEFTMARGIN
:
341 case HEHT_ADDRESSSPACING
:
343 pt
.x
-= (SHORT
) hed
->LeftMargin
+ ((4 + hed
->AddressSpacing
) * hed
->CharWidth
);
348 pt
.x
-= hed
->LeftMargin
+ ((4 + hed
->AddressSpacing
+ hed
->SplitSpacing
+ (3 * hed
->ColumnsPerLine
)) * hed
->CharWidth
);
355 INT BlockWidth
= (*EditField
? hed
->CharWidth
* 3 : hed
->CharWidth
);
356 EditPos
->x
= min(hed
->ColumnsPerLine
, pt
.x
/ BlockWidth
);
359 bufsize
= (hed
->hBuffer
? (DWORD
) LocalSize(hed
->hBuffer
) : 0);
360 Pos
= (EditPos
->y
* hed
->ColumnsPerLine
) + EditPos
->x
;
363 INT tmp
= bufsize
% hed
->ColumnsPerLine
;
365 EditPos
->x
= (tmp
== 0 ? hed
->ColumnsPerLine
: tmp
);
370 /*** Control specific messages ************************************************/
373 HEXEDIT_HEM_LOADBUFFER(PHEXEDIT_DATA hed
, PVOID Buffer
, DWORD Size
)
375 if(Buffer
!= NULL
&& Size
> 0)
379 if(hed
->MaxBuffer
> 0 && Size
> hed
->MaxBuffer
)
381 Size
= hed
->MaxBuffer
;
388 if(LocalSize(hed
->hBuffer
) != Size
)
390 hed
->hBuffer
= LocalReAlloc(hed
->hBuffer
, Size
, LMEM_MOVEABLE
| LMEM_ZEROINIT
);
395 hed
->hBuffer
= LocalFree(hed
->hBuffer
);
404 hed
->hBuffer
= LocalAlloc(LHND
, Size
);
409 buf
= LocalLock(hed
->hBuffer
);
412 memcpy(buf
, Buffer
, Size
);
416 LocalUnlock(hed
->hBuffer
);
423 else if(hed
->hBuffer
)
426 hed
->hBuffer
= LocalFree(hed
->hBuffer
);
434 HEXEDIT_HEM_COPYBUFFER(PHEXEDIT_DATA hed
, PVOID Buffer
, DWORD Size
)
443 if(Buffer
!= NULL
&& Size
> 0)
445 nCpy
= min(Size
, LocalSize(hed
->hBuffer
));
450 buf
= LocalLock(hed
->hBuffer
);
453 memcpy(Buffer
, buf
, nCpy
);
457 LocalUnlock(hed
->hBuffer
);
462 return (LRESULT
)LocalSize(hed
->hBuffer
);
466 HEXEDIT_HEM_SETMAXBUFFERSIZE(PHEXEDIT_DATA hed
, DWORD nMaxSize
)
468 hed
->MaxBuffer
= nMaxSize
;
469 if(hed
->MaxBuffer
> 0 && hed
->hBuffer
&& LocalSize(hed
->hBuffer
) > hed
->MaxBuffer
)
471 /* truncate the buffer */
472 hed
->hBuffer
= LocalReAlloc(hed
->hBuffer
, hed
->MaxBuffer
, LMEM_MOVEABLE
);
478 /*** Message Proc *************************************************************/
481 HEXEDIT_WM_NCCREATE(HWND hWnd
, CREATESTRUCT
*cs
)
485 if(!(hed
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(HEXEDIT_DATA
))))
490 hed
->hWndSelf
= hWnd
;
491 hed
->hWndParent
= cs
->hwndParent
;
492 hed
->style
= cs
->style
;
494 hed
->ColumnsPerLine
= 8;
496 hed
->AddressSpacing
= 2;
497 hed
->SplitSpacing
= 2;
498 hed
->EditingField
= TRUE
; /* in hexdump field */
500 SetWindowLongPtr(hWnd
, 0, (DWORD_PTR
)hed
);
507 HEXEDIT_WM_NCDESTROY(PHEXEDIT_DATA hed
)
511 //while(LocalUnlock(hed->hBuffer));
512 LocalFree(hed
->hBuffer
);
517 DeleteObject(hed
->hFont
);
520 SetWindowLongPtr(hed
->hWndSelf
, 0, (DWORD_PTR
)0);
521 HeapFree(GetProcessHeap(), 0, hed
);
527 HEXEDIT_WM_CREATE(PHEXEDIT_DATA hed
)
529 UNREFERENCED_PARAMETER(hed
);
534 HEXEDIT_WM_SETFOCUS(PHEXEDIT_DATA hed
)
536 CreateCaret(hed
->hWndSelf
, 0, 1, hed
->LineHeight
);
537 HEXEDIT_MoveCaret(hed
, FALSE
);
538 ShowCaret(hed
->hWndSelf
);
543 HEXEDIT_WM_KILLFOCUS(PHEXEDIT_DATA hed
)
545 UNREFERENCED_PARAMETER(hed
);
551 HEXEDIT_WM_VSCROLL(PHEXEDIT_DATA hed
, WORD ThumbPosition
, WORD SbCmd
)
556 UNREFERENCED_PARAMETER(ThumbPosition
);
558 ZeroMemory(&si
, sizeof(SCROLLINFO
));
559 si
.cbSize
= sizeof(SCROLLINFO
);
561 GetScrollInfo(hed
->hWndSelf
, SB_VERT
, &si
);
591 si
.nPos
= si
.nTrackPos
;
596 SetScrollInfo(hed
->hWndSelf
, SB_VERT
, &si
, TRUE
);
597 GetScrollInfo(hed
->hWndSelf
, SB_VERT
, &si
);
599 if(si
.nPos
!= ScrollY
)
601 ScrollWindow(hed
->hWndSelf
, 0, (ScrollY
- si
.nPos
) * hed
->LineHeight
, NULL
, NULL
);
602 UpdateWindow(hed
->hWndSelf
);
609 HEXEDIT_WM_SETFONT(PHEXEDIT_DATA hed
, HFONT hFont
, BOOL bRedraw
)
617 hFont
= HEXEDIT_GetFixedFont();
621 hDC
= GetDC(hed
->hWndSelf
);
624 hOldFont
= SelectObject(hDC
, hFont
);
626 GetTextMetrics(hDC
, &tm
);
627 hed
->LineHeight
= tm
.tmHeight
;
628 hed
->CharWidth
= tm
.tmAveCharWidth
;
631 SelectObject(hDC
, hOldFont
);
633 ReleaseDC(hed
->hWndSelf
, hDC
);
637 InvalidateRect(hed
->hWndSelf
, NULL
, TRUE
);
644 HEXEDIT_WM_GETFONT(PHEXEDIT_DATA hed
)
646 return (LRESULT
)hed
->hFont
;
650 HEXEDIT_WM_PAINT(PHEXEDIT_DATA hed
)
655 HBITMAP hbmp
, hbmpold
;
661 if(GetUpdateRect(hed
->hWndSelf
, &rc
, FALSE
) && (hed
->LineHeight
> 0))
663 ZeroMemory(&si
, sizeof(SCROLLINFO
));
664 si
.cbSize
= sizeof(SCROLLINFO
);
666 GetScrollInfo(hed
->hWndSelf
, SB_VERT
, &si
);
668 height
= (rc
.bottom
- rc
.top
);
669 nLines
= height
/ hed
->LineHeight
;
670 if((height
% hed
->LineHeight
) > 0)
674 if(nLines
> hed
->nLines
- si
.nPos
)
676 nLines
= hed
->nLines
- si
.nPos
;
678 nFirst
= rc
.top
/ hed
->LineHeight
;
680 BeginPaint(hed
->hWndSelf
, &ps
);
681 if(!(hTempDC
= CreateCompatibleDC(ps
.hdc
)))
683 FillRect(ps
.hdc
, &rc
, (HBRUSH
)(COLOR_WINDOW
+ 1));
686 if(!(hbmp
= CreateCompatibleBitmap(hTempDC
, ps
.rcPaint
.right
, ps
.rcPaint
.bottom
)))
688 FillRect(ps
.hdc
, &rc
, (HBRUSH
)(COLOR_WINDOW
+ 1));
692 hbmpold
= SelectObject(hTempDC
, hbmp
);
693 hOldFont
= SelectObject(hTempDC
, hed
->hFont
);
694 HEXEDIT_PaintLines(hed
, hTempDC
, si
.nPos
, nFirst
, nFirst
+ nLines
, &ps
.rcPaint
);
695 BitBlt(ps
.hdc
, rc
.left
, rc
.top
, rc
.right
- rc
.left
, rc
.bottom
- rc
.top
, hTempDC
, rc
.left
, rc
.top
, SRCCOPY
);
696 SelectObject(hTempDC
, hOldFont
);
697 SelectObject(hTempDC
, hbmpold
);
703 EndPaint(hed
->hWndSelf
, &ps
);
710 HEXEDIT_WM_MOUSEWHEEL(PHEXEDIT_DATA hed
, int cyMoveLines
, WORD ButtonsDown
, LPPOINTS MousePos
)
715 UNREFERENCED_PARAMETER(ButtonsDown
);
716 UNREFERENCED_PARAMETER(MousePos
);
718 SetFocus(hed
->hWndSelf
);
720 si
.cbSize
= sizeof(SCROLLINFO
);
722 GetScrollInfo(hed
->hWndSelf
, SB_VERT
, &si
);
727 si
.nPos
+= cyMoveLines
;
728 SetScrollInfo(hed
->hWndSelf
, SB_VERT
, &si
, TRUE
);
730 GetScrollInfo(hed
->hWndSelf
, SB_VERT
, &si
);
731 if(si
.nPos
!= ScrollY
)
733 ScrollWindow(hed
->hWndSelf
, 0, (ScrollY
- si
.nPos
) * hed
->LineHeight
, NULL
, NULL
);
734 UpdateWindow(hed
->hWndSelf
);
741 HEXEDIT_WM_GETDLGCODE(LPMSG Msg
)
743 UNREFERENCED_PARAMETER(Msg
);
744 return DLGC_WANTARROWS
| DLGC_WANTCHARS
;
748 HEXEDIT_WM_LBUTTONDOWN(PHEXEDIT_DATA hed
, INT Buttons
, POINTS Pt
)
752 DWORD Hit
= HEXEDIT_HitRegionTest(hed
, Pt
);
754 UNREFERENCED_PARAMETER(Buttons
);
755 SetFocus(hed
->hWndSelf
);
757 hed
->Position
= HEXEDIT_PositionFromPoint(hed
, Pt
, Hit
, &EditPos
, &NewField
);
758 hed
->EditingField
= NewField
;
759 hed
->CaretCol
= EditPos
.x
;
760 hed
->CaretLine
= EditPos
.y
;
762 HEXEDIT_MoveCaret(hed
, TRUE
);
768 HEXEDIT_WM_KEYDOWN(PHEXEDIT_DATA hed
, INT VkCode
)
773 if(GetKeyState(VK_MENU
) & 0x8000)
778 shift
= GetKeyState(VK_SHIFT
) & 0x8000;
779 control
= GetKeyState(VK_CONTROL
) & 0x8000;
781 bufsize
= (hed
->hBuffer
? LocalSize(hed
->hBuffer
) : 0);
786 if(hed
->Position
> 0)
788 if(--hed
->CaretCol
< 0)
791 hed
->CaretCol
= hed
->ColumnsPerLine
;
796 HEXEDIT_MoveCaret(hed
, TRUE
);
800 if(hed
->Position
< (INT
)bufsize
)
802 if(++hed
->CaretCol
> hed
->ColumnsPerLine
)
810 HEXEDIT_MoveCaret(hed
, TRUE
);
814 if(hed
->Position
> 0)
816 if(hed
->CaretLine
<= 0)
824 hed
->Position
-= hed
->ColumnsPerLine
;
827 HEXEDIT_MoveCaret(hed
, TRUE
);
831 if(hed
->Position
<= (INT
)bufsize
)
833 if(hed
->CaretLine
< hed
->nLines
- 1)
835 hed
->Position
+= hed
->ColumnsPerLine
;
837 if(hed
->Position
> (INT
)bufsize
)
839 hed
->Position
= (INT
) bufsize
;
840 hed
->CaretLine
= (hed
->nLines
> 0 ? hed
->nLines
- 1 : 0);
841 hed
->CaretCol
= (INT
) bufsize
% hed
->ColumnsPerLine
;
846 INT tmp
= (INT
) bufsize
% hed
->ColumnsPerLine
;
847 hed
->Position
= (INT
) bufsize
;
848 hed
->CaretCol
= (tmp
== 0 ? hed
->ColumnsPerLine
: tmp
);
851 HEXEDIT_MoveCaret(hed
, TRUE
);
859 HEXEDIT_WM_SIZE(PHEXEDIT_DATA hed
, DWORD sType
, WORD NewWidth
, WORD NewHeight
)
861 UNREFERENCED_PARAMETER(sType
);
862 UNREFERENCED_PARAMETER(NewHeight
);
863 UNREFERENCED_PARAMETER(NewWidth
);
869 HexEditWndProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
874 hed
= (PHEXEDIT_DATA
)(LONG_PTR
)GetWindowLongPtr(hWnd
, (DWORD_PTR
)0);
881 return HEXEDIT_WM_PAINT(hed
);
884 return HEXEDIT_WM_KEYDOWN(hed
, (INT
)wParam
);
887 return HEXEDIT_WM_VSCROLL(hed
, HIWORD(wParam
), LOWORD(wParam
));
890 return HEXEDIT_WM_SIZE(hed
, (DWORD
)wParam
, LOWORD(lParam
), HIWORD(lParam
));
894 p
.x
= LOWORD(lParam
);
895 p
.y
= HIWORD(lParam
);
896 return HEXEDIT_WM_LBUTTONDOWN(hed
, (INT
)wParam
, p
);
901 UINT nScrollLines
= 3;
904 SystemParametersInfoW(SPI_GETWHEELSCROLLLINES
, 0, &nScrollLines
, 0);
905 delta
-= (SHORT
)HIWORD(wParam
);
906 if(abs(delta
) >= WHEEL_DELTA
&& nScrollLines
!= 0)
908 p
.x
= LOWORD(lParam
);
909 p
.y
= HIWORD(lParam
);
910 return HEXEDIT_WM_MOUSEWHEEL(hed
, nScrollLines
* (delta
/ WHEEL_DELTA
), LOWORD(wParam
), &p
);
916 return HEXEDIT_HEM_LOADBUFFER(hed
, (PVOID
)wParam
, (DWORD
)lParam
);
919 return HEXEDIT_HEM_COPYBUFFER(hed
, (PVOID
)wParam
, (DWORD
)lParam
);
921 case HEM_SETMAXBUFFERSIZE
:
922 return HEXEDIT_HEM_SETMAXBUFFERSIZE(hed
, (DWORD
)lParam
);
925 return HEXEDIT_WM_SETFOCUS(hed
);
928 return HEXEDIT_WM_KILLFOCUS(hed
);
931 return HEXEDIT_WM_GETDLGCODE((LPMSG
)lParam
);
934 return HEXEDIT_WM_SETFONT(hed
, (HFONT
)wParam
, (BOOL
)LOWORD(lParam
));
937 return HEXEDIT_WM_GETFONT(hed
);
940 return HEXEDIT_WM_CREATE(hed
);
945 return HEXEDIT_WM_NCCREATE(hWnd
, (CREATESTRUCT
*)lParam
);
952 return HEXEDIT_WM_NCDESTROY(hed
);
957 return CallWindowProc(DefWindowProc
, hWnd
, uMsg
, wParam
, lParam
);