Skip to content

Commit 3489cd5

Browse files
committed
Allow decimal input to HexEditor through touch screen by adding a phone keyboard to the dialog
1 parent 32eac59 commit 3489cd5

File tree

4 files changed

+129
-9
lines changed

4 files changed

+129
-9
lines changed

editdlg.cpp

Lines changed: 111 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -335,13 +335,38 @@ INT_PTR CALLBACK EditDWORD (HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) {
335335
return 0;
336336
}
337337

338-
INT_PTR CALLBACK EditBinary (HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) {
338+
static WNDPROC DefPhoneKeyboardProc = NULL;
339+
static LRESULT CALLBACK PhoneKeyboardProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
340+
return CallWindowProc(DefPhoneKeyboardProc, hwnd, msg == WM_LBUTTONDBLCLK ? WM_LBUTTONDOWN : msg, wParam, lParam);
341+
}
342+
343+
INT_PTR CALLBACK EditBinary(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
339344
val_ed_dialog_data *params;
340345
TCHAR s[64];
346+
RECT rect;
347+
TCITEM item;
348+
UINT value;
349+
BOOL valid;
341350
switch (msg) {
351+
case WM_ACTIVATE:
352+
if (HWND const hwndPhoneKeyboard = GetDlgItem(hwnd, IDC_PHONEKEYBOARD)) {
353+
if (wParam)
354+
DefPhoneKeyboardProc = (WNDPROC)SetWindowLongPtr(hwndPhoneKeyboard, GWLP_WNDPROC, (LONG_PTR)PhoneKeyboardProc);
355+
else
356+
SetWindowLongPtr(hwndPhoneKeyboard, GWLP_WNDPROC, (LONG_PTR)DefPhoneKeyboardProc);
357+
}
358+
break;
342359
case WM_INITDIALOG:
343360
SetWindowLongPtr(hwnd, DWLP_USER, lParam);
344361
params = (val_ed_dialog_data*)lParam;
362+
if (HWND const hwndPhoneKeyboard = GetDlgItem(hwnd, IDC_PHONEKEYBOARD)) {
363+
GetClientRect(hwndPhoneKeyboard, &rect);
364+
TabCtrl_SetItemSize(hwndPhoneKeyboard, rect.bottom, rect.bottom);
365+
item.mask = TCIF_TEXT;
366+
item.pszText = _T("*");
367+
TabCtrl_InsertItem(hwndPhoneKeyboard, 0, &item);
368+
TabCtrl_SetCurSel(hwndPhoneKeyboard, -1);
369+
}
345370
if (params->readonly) {
346371
SendDlgItemMessage(hwnd,IDC_HEXEDIT,EM_SETREADONLY,1,0);
347372
EnableWindow(GetDlgItem(hwnd,IDOK),0);
@@ -379,6 +404,91 @@ INT_PTR CALLBACK EditBinary (HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) {
379404
break;
380405
}
381406
return 1;
407+
case WM_NOTIFY:
408+
switch (LPNMHDR(lParam)->code) {
409+
case TCN_SELCHANGE:
410+
switch (UINT const hitcode =
411+
TabCtrl_GetCurSel(LPNMHDR(lParam)->hwndFrom) |
412+
TabCtrl_GetItemCount(LPNMHDR(lParam)->hwndFrom) << 4) {
413+
case 0x10: //symbol *
414+
SetWindowText(LPNMHDR(lParam)->hwndFrom, NULL);
415+
GetWindowRect(LPNMHDR(lParam)->hwndFrom, &rect);
416+
MapWindowPoints(NULL, hwnd, LPPOINT(&rect), 2);
417+
SetWindowPos(LPNMHDR(lParam)->hwndFrom, NULL,
418+
rect.left, rect.top - (rect.bottom - rect.top + 3) * 3,
419+
(rect.bottom - rect.top + 3) * 3,
420+
(rect.bottom - rect.top + 3) * 4,
421+
SWP_NOZORDER);
422+
item.mask = TCIF_TEXT;
423+
item.pszText = _T("#");
424+
TabCtrl_InsertItem(LPNMHDR(lParam)->hwndFrom, 1, &item);
425+
item.pszText = _T("0");
426+
TabCtrl_InsertItem(LPNMHDR(lParam)->hwndFrom, 1, &item);
427+
item.pszText = _T("9");
428+
TabCtrl_InsertItem(LPNMHDR(lParam)->hwndFrom, 0, &item);
429+
item.pszText = _T("8");
430+
TabCtrl_InsertItem(LPNMHDR(lParam)->hwndFrom, 0, &item);
431+
item.pszText = _T("7");
432+
TabCtrl_InsertItem(LPNMHDR(lParam)->hwndFrom, 0, &item);
433+
item.pszText = _T("6");
434+
TabCtrl_InsertItem(LPNMHDR(lParam)->hwndFrom, 0, &item);
435+
item.pszText = _T("5");
436+
TabCtrl_InsertItem(LPNMHDR(lParam)->hwndFrom, 0, &item);
437+
item.pszText = _T("4");
438+
TabCtrl_InsertItem(LPNMHDR(lParam)->hwndFrom, 0, &item);
439+
item.pszText = _T("3");
440+
TabCtrl_InsertItem(LPNMHDR(lParam)->hwndFrom, 0, &item);
441+
item.pszText = _T("2");
442+
TabCtrl_InsertItem(LPNMHDR(lParam)->hwndFrom, 0, &item);
443+
item.pszText = _T("1");
444+
TabCtrl_InsertItem(LPNMHDR(lParam)->hwndFrom, 0, &item);
445+
break;
446+
case 0xCB: //symbol #
447+
value = GetDlgItemInt(hwnd, LPNMHDR(lParam)->idFrom, &valid, FALSE);
448+
if (valid)
449+
SendDlgItemMessage(hwnd, IDC_HEXEDIT, WM_USER + 4, value, 0);
450+
// fall through
451+
case 0xC9: //symbol *
452+
GetWindowRect(LPNMHDR(lParam)->hwndFrom, &rect);
453+
MapWindowPoints(NULL, hwnd, LPPOINT(&rect), 2);
454+
SetWindowPos(LPNMHDR(lParam)->hwndFrom, NULL,
455+
rect.left, rect.right - rect.left + rect.top,
456+
(rect.bottom - rect.top) - (rect.right - rect.left) - 3,
457+
(rect.bottom - rect.top) - (rect.right - rect.left) - 3,
458+
SWP_NOZORDER);
459+
TabCtrl_DeleteItem(LPNMHDR(lParam)->hwndFrom, 0);
460+
TabCtrl_DeleteItem(LPNMHDR(lParam)->hwndFrom, 0);
461+
TabCtrl_DeleteItem(LPNMHDR(lParam)->hwndFrom, 0);
462+
TabCtrl_DeleteItem(LPNMHDR(lParam)->hwndFrom, 0);
463+
TabCtrl_DeleteItem(LPNMHDR(lParam)->hwndFrom, 0);
464+
TabCtrl_DeleteItem(LPNMHDR(lParam)->hwndFrom, 0);
465+
TabCtrl_DeleteItem(LPNMHDR(lParam)->hwndFrom, 0);
466+
TabCtrl_DeleteItem(LPNMHDR(lParam)->hwndFrom, 0);
467+
TabCtrl_DeleteItem(LPNMHDR(lParam)->hwndFrom, 0);
468+
TabCtrl_DeleteItem(LPNMHDR(lParam)->hwndFrom, 1);
469+
TabCtrl_DeleteItem(LPNMHDR(lParam)->hwndFrom, 1);
470+
break;
471+
case 0xC0: //digit 1
472+
case 0xC1: //digit 2
473+
case 0xC2: //digit 3
474+
case 0xC3: //digit 4
475+
case 0xC4: //digit 5
476+
case 0xC5: //digit 6
477+
case 0xC6: //digit 7
478+
case 0xC7: //digit 8
479+
case 0xC8: //digit 9
480+
case 0xCA: //digit 0
481+
value = GetDlgItemInt(hwnd, LPNMHDR(lParam)->idFrom, &valid, FALSE);
482+
value *= 10;
483+
if (hitcode != 0xCA)
484+
value += hitcode - 0xBF;
485+
SetDlgItemInt(hwnd, LPNMHDR(lParam)->idFrom, value, FALSE);
486+
break;
487+
}
488+
TabCtrl_SetCurSel(LPNMHDR(lParam)->hwndFrom, -1);
489+
break;
490+
}
491+
return 1;
382492
}
383493
return 0;
384494
}

myctlrs.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -729,6 +729,12 @@ LRESULT CALLBACK MyHexEditProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara
729729
case WM_USER+3://Ensure that caret (text cursor) is visible
730730
break;
731731

732+
case WM_USER+4://Enter the byte given in wParam
733+
hs->decimalflag = true;
734+
hs->decimalbyte = static_cast<BYTE>(wParam);
735+
hs->onKeyUp(VK_CONTROL);
736+
break;
737+
732738
case EM_SETREADONLY:
733739
hs->readonly = wParam != 0;
734740
break;

regedt33.rc

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include "gen-versioninfo.h"
33

44
#include <winres.h>
5+
#include <commctrl.h>
56

67
#define STRINGIZE_NO_EXPANSION(x) #x
78
#define STRINGIZE(x) STRINGIZE_NO_EXPANSION(x)
@@ -159,16 +160,17 @@ BEGIN
159160
END
160161

161162
EDBINARY DIALOGEX 0, 0, 241, 146
162-
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
163+
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_CLIPCHILDREN
163164
CAPTION "Edit Binary"
164165
FONT 8, "MS Sans Serif"
165166
BEGIN
166-
DEFPUSHBUTTON "OK",IDOK,68,127,50,14
167-
PUSHBUTTON "Cancel",IDCANCEL,126,127,50,14
167+
CONTROL "", IDC_PHONEKEYBOARD, "SysTabControl32", TCS_BUTTONS | TCS_MULTILINE | TCS_FIXEDWIDTH | TCS_FOCUSNEVER, 7, 124, 20, 17
168+
DEFPUSHBUTTON "OK",IDOK,72,127,50,14
169+
PUSHBUTTON "Cancel",IDCANCEL,128,127,50,14
168170
LTEXT "Value name:",IDC_STATIC,7,5,227,8
169171
EDITTEXT IDC_VNAME,7,17,227,12,ES_AUTOHSCROLL | ES_READONLY
170172
LTEXT "Value data:",IDC_STATIC,7,33,227,8
171-
CONTROL "",IDC_HEXEDIT,"MyHexEdit",WS_TABSTOP|WS_VSCROLL,7,46,227,73,
173+
CONTROL "",IDC_HEXEDIT,"MyHexEdit",WS_TABSTOP|WS_VSCROLL|WS_CLIPSIBLINGS,7,46,227,73,
172174
WS_EX_CLIENTEDGE
173175
PUSHBUTTON "Apply",IDC_APPLY,184,127,50,14,WS_DISABLED
174176
END
@@ -647,14 +649,15 @@ BEGIN
647649
END
648650

649651
EDBINARY_AV DIALOGEX 0, 0, 241, 146
650-
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
652+
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_CLIPCHILDREN
651653
CAPTION "Edit Binary"
652654
FONT 8, "MS Sans Serif"
653655
BEGIN
654-
DEFPUSHBUTTON "OK",IDOK,68,127,50,14
655-
PUSHBUTTON "Cancel",IDCANCEL,126,127,50,14
656+
CONTROL "", IDC_PHONEKEYBOARD, "SysTabControl32", TCS_BUTTONS | TCS_MULTILINE | TCS_FIXEDWIDTH | TCS_FOCUSNEVER, 7, 124, 20, 17
657+
DEFPUSHBUTTON "OK",IDOK,72,127,50,14
658+
PUSHBUTTON "Cancel",IDCANCEL,128,127,50,14
656659
LTEXT "zzz",IDC_VNAME,7,5,227,8
657-
CONTROL "",IDC_HEXEDIT,"MyHexEdit",WS_TABSTOP|WS_VSCROLL,7,19,227,100,
660+
CONTROL "",IDC_HEXEDIT,"MyHexEdit",WS_TABSTOP|WS_VSCROLL|WS_CLIPSIBLINGS,7,19,227,100,
658661
WS_EX_CLIENTEDGE
659662
PUSHBUTTON "Apply",IDC_APPLY,184,127,50,14,WS_DISABLED
660663
END

resource.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#define IDB_ARROWUP 108
77
#define IDB_ARROWDOWN 109
88
#define IDC_APPLY 1000
9+
#define IDC_PHONEKEYBOARD 1001
910
#define IDC_EDITSTR 1002
1011
#define IDC_HEXNUM 1002
1112
#define IDC_EDIT_SERACH 1002

0 commit comments

Comments
 (0)