Page Menu
Home
desp's stash
Search
Configure Global Search
Log In
Files
F399193
hexedit.h
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
4 KB
Subscribers
None
hexedit.h
View Options
#pragma once
#ifndef __cplusplus
#error WTL requires C++ compilation (use a .cpp suffix)
#endif
#ifndef __ATLMISC_H__
#error hexedit.h requires atlmisc.h to be included first
#endif
#ifndef __ATLCTRLS_H__
#error hexedit.h requires atlctrls.h to be included first
#endif
/*
#ifdef _WIN64
address = _wcstoui64(hexString, NULL, 16);
#else
address = wcstoul(hexString, NULL, 16);
#endif
*/
template
<
class
T
,
typename
NUM_T
,
class
TBase
=
CEdit
,
class
TWinTraits
=
CControlWinTraits
>
class
ATL_NO_VTABLE
CHexEditImpl
:
public
CWindowImpl
<
T
,
TBase
,
TWinTraits
>
{
public
:
static
const
short
int
BASE
=
16
;
static
const
size_t
DIGITS
=
sizeof
(
NUM_T
)
*
2
;
// 2 digits / byte
static
const
size_t
STRSIZE
=
DIGITS
+
1
;
static
const
TCHAR
Digits
[];
static
const
TCHAR
OldProcProp
[];
// Operations
BOOL
SubclassWindow
(
HWND
hWnd
)
{
ATLASSERT
(
m_hWnd
==
NULL
);
ATLASSERT
(
::
IsWindow
(
hWnd
));
BOOL
bRet
=
CWindowImpl
<
T
,
TBase
,
TWinTraits
>::
SubclassWindow
(
hWnd
);
if
(
bRet
)
_Init
();
return
bRet
;
}
NUM_T
GetValue
()
const
{
ATLASSERT
(
::
IsWindow
(
m_hWnd
));
TCHAR
String
[
STRSIZE
]
=
{
0
};
GetWindowText
(
String
,
_countof
(
String
));
return
_StringToNum
(
String
);
}
void
SetValue
(
NUM_T
Num
,
bool
Fill
=
true
)
{
ATLASSERT
(
::
IsWindow
(
m_hWnd
));
TCHAR
String
[
STRSIZE
]
=
{
0
};
_NumToString
(
Num
,
String
,
Fill
);
SetWindowText
(
String
);
}
// Implementation
void
_Init
()
{
ATLASSERT
(
::
IsWindow
(
m_hWnd
));
LimitText
(
DIGITS
);
}
bool
_IsValidChar
(
TCHAR
Char
)
const
{
return
((
NUM_T
)
-
1
!=
_CharToNum
(
Char
));
}
bool
_IsValidString
(
const
TCHAR
String
[
STRSIZE
])
const
{
for
(
int
i
=
0
;
String
[
i
];
i
++
)
{
if
(
!
_IsValidChar
(
String
[
i
]))
return
false
;
}
return
true
;
}
NUM_T
_CharToNum
(
TCHAR
Char
)
const
{
Char
=
_totupper
(
Char
);
for
(
int
i
=
0
;
Digits
[
i
];
i
++
)
{
if
(
Char
==
Digits
[
i
])
return
i
;
}
return
-
1
;
}
NUM_T
_StringToNum
(
const
TCHAR
String
[
STRSIZE
])
const
{
NUM_T
CharNum
;
NUM_T
Num
=
0
;
for
(
int
i
=
0
;
String
[
i
];
i
++
)
{
CharNum
=
_CharToNum
(
String
[
i
]);
if
(
CharNum
==
(
NUM_T
)
-
1
)
break
;
Num
*=
BASE
;
Num
+=
CharNum
;
}
return
Num
;
}
TCHAR
_NumToChar
(
NUM_T
Num
)
const
{
return
Digits
[
Num
%
BASE
];
}
void
_NumToString
(
NUM_T
Num
,
TCHAR
String
[
STRSIZE
],
bool
Fill
)
const
{
NUM_T
Nums
[
DIGITS
];
int
i
,
j
;
for
(
i
=
DIGITS
-
1
;
i
>=
0
;
i
--
)
{
Nums
[
i
]
=
Num
%
BASE
;
Num
/=
BASE
;
}
for
(
i
=
j
=
0
;
i
<
DIGITS
;
i
++
)
{
// Only copy num if : non-null OR Fill OR non-null encountered before OR last num
if
(
Nums
[
i
]
||
Fill
||
j
||
i
==
DIGITS
-
1
)
{
String
[
j
++
]
=
_NumToChar
(
Nums
[
i
]);
}
}
String
[
j
]
=
'\0'
;
}
bool
_GetClipboardText
(
TCHAR
String
[
STRSIZE
])
{
#ifdef UNICODE
const
UINT
Format
=
CF_UNICODETEXT
;
#else
const
UINT
Format
=
CF_TEXT
;
#endif
bool
RetVal
=
false
;
if
(
IsClipboardFormatAvailable
(
Format
)
&&
OpenClipboard
())
{
HANDLE
HMem
=
GetClipboardData
(
Format
);
if
(
HMem
)
{
_tcsncpy_s
(
String
,
STRSIZE
,
(
TCHAR
*
)
GlobalLock
(
HMem
),
STRSIZE
-
1
);
String
[
STRSIZE
-
1
]
=
'\0'
;
GlobalUnlock
(
HMem
);
RetVal
=
true
;
}
CloseClipboard
();
}
return
RetVal
;
}
// Message map and handlers
BEGIN_MSG_MAP_EX
(
CHexEditImpl
)
MESSAGE_HANDLER_EX
(
WM_CREATE
,
OnCreate
)
MSG_WM_SETTEXT
(
OnSetText
)
MSG_WM_PASTE
(
OnPaste
)
MSG_WM_CHAR
(
OnChar
)
END_MSG_MAP
()
LRESULT
OnCreate
(
UINT
uMsg
,
WPARAM
wParam
,
LPARAM
lParam
)
{
LRESULT
lRes
=
DefWindowProc
();
_Init
();
return
lRes
;
}
int
OnSetText
(
LPCTSTR
lpstrText
)
{
bool
PassThrough
=
(
_tcslen
(
lpstrText
)
<=
DIGITS
)
&&
_IsValidString
(
lpstrText
);
if
(
!
PassThrough
)
{
MessageBeep
(
-
1
);
return
FALSE
;
}
SetMsgHandled
(
FALSE
);
return
TRUE
;
}
void
OnPaste
()
{
TCHAR
String
[
STRSIZE
];
bool
PassThrough
=
!
_GetClipboardText
(
String
)
||
_IsValidString
(
String
);
if
(
!
PassThrough
)
{
MessageBeep
(
-
1
);
return
;
}
SetMsgHandled
(
FALSE
);
return
;
}
void
OnChar
(
UINT
nChar
,
UINT
nRepCnt
,
UINT
nFlags
)
{
// ignore all printable chars (incl. space) which are not valid digits
bool
PassThrough
=
!
_istprint
((
TCHAR
)
nChar
)
||
_IsValidChar
((
TCHAR
)
nChar
);
if
(
!
PassThrough
)
{
MessageBeep
(
-
1
);
return
;
}
SetMsgHandled
(
FALSE
);
return
;
}
};
template
<
class
T
,
typename
NUM_T
,
class
TBase
,
class
TWinTraits
>
const
TCHAR
CHexEditImpl
<
T
,
NUM_T
,
TBase
,
TWinTraits
>::
Digits
[]
=
_T
(
"0123456789ABCDEF"
);
template
<
typename
NUM_T
>
class
CHexEdit
:
public
CHexEditImpl
<
CHexEdit
<
NUM_T
>
,
NUM_T
>
{
public
:
DECLARE_WND_CLASS
(
_T
(
"WTL_HexEdit"
))
};
File Metadata
Details
Attached
Mime Type
text/x-c++
Expires
Thu, Oct 9, 7:26 AM (12 h, 12 m)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
90/c6/765affa7f67792d5e8b7ba3d3017
Attached To
rSCY Scylla
Event Timeline
Log In to Comment