396 lines
9.4 KiB
C
396 lines
9.4 KiB
C
|
/*******************************************************************************
|
||
|
*
|
||
|
* (C) COPYRIGHT MICROSOFT CORP., 1993-1994
|
||
|
*
|
||
|
* TITLE: REGDWDED.C
|
||
|
*
|
||
|
* VERSION: 4.01
|
||
|
*
|
||
|
* AUTHOR: Tracy Sharpe
|
||
|
*
|
||
|
* DATE: 24 Sep 1994
|
||
|
*
|
||
|
* Dword edit dialog for use by the Registry Editor.
|
||
|
*
|
||
|
*******************************************************************************/
|
||
|
|
||
|
#include "pch.h"
|
||
|
#include "regresid.h"
|
||
|
#include "reghelp.h"
|
||
|
|
||
|
const DWORD s_EditDwordValueHelpIDs[] = {
|
||
|
IDC_VALUEDATA, IDH_REGEDIT_VALUEDATA,
|
||
|
IDC_VALUENAME, IDH_REGEDIT_VALUENAME,
|
||
|
IDC_HEXADECIMAL, IDH_REGEDIT_DWORDBASE,
|
||
|
IDC_DECIMAL, IDH_REGEDIT_DWORDBASE,
|
||
|
0, 0
|
||
|
};
|
||
|
|
||
|
const TCHAR s_DecimalFormatSpec[] = TEXT("%u");
|
||
|
const TCHAR s_HexadecimalFormatSpec[] = TEXT("%x");
|
||
|
|
||
|
// Subclassed IDC_VALUEDATA's previous window procedure. Only one instance of
|
||
|
// this dialog is assumed to exist.
|
||
|
WNDPROC s_PrevValueDataWndProc;
|
||
|
|
||
|
// The radio button that is currently selected: IDC_HEXADECIMAL or IDC_DECIMAL.
|
||
|
UINT s_SelectedBase;
|
||
|
|
||
|
UINT
|
||
|
PASCAL
|
||
|
GetDlgItemHex(
|
||
|
HWND hWnd,
|
||
|
int nIDDlgItem,
|
||
|
BOOL *lpTranslated
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
PASCAL
|
||
|
EditDwordValue_OnInitDialog(
|
||
|
HWND hWnd,
|
||
|
HWND hFocusWnd,
|
||
|
LPARAM lParam
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
PASCAL
|
||
|
EditDwordValue_SetValueDataText(
|
||
|
HWND hWnd,
|
||
|
LPEDITVALUEPARAM lpEditValueParam,
|
||
|
UINT DlgItem
|
||
|
);
|
||
|
|
||
|
LRESULT
|
||
|
CALLBACK
|
||
|
EditDwordValue_ValueDataWndProc(
|
||
|
HWND hWnd,
|
||
|
UINT Message,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam
|
||
|
);
|
||
|
|
||
|
BOOL EditDwordValue_StoreDlgValueData(HWND hWnd, LPEDITVALUEPARAM lpEditValueParam);
|
||
|
|
||
|
/*******************************************************************************
|
||
|
*
|
||
|
* GetDlgItemHex
|
||
|
*
|
||
|
* DESCRIPTION:
|
||
|
* Like GetDlgItemInt, only for hexadecimal numbers.
|
||
|
*
|
||
|
* PARAMETERS:
|
||
|
* See GetDlgItemInt.
|
||
|
*
|
||
|
*******************************************************************************/
|
||
|
|
||
|
UINT
|
||
|
PASCAL
|
||
|
GetDlgItemHex(
|
||
|
HWND hWnd,
|
||
|
int nIDDlgItem,
|
||
|
BOOL *lpTranslated
|
||
|
)
|
||
|
{
|
||
|
|
||
|
TCHAR Buffer[10]; // Enough to hold 8 digits, null, extra
|
||
|
UINT Length;
|
||
|
DWORD Dword;
|
||
|
UINT Index;
|
||
|
DWORD Nibble;
|
||
|
|
||
|
Dword = 0;
|
||
|
|
||
|
//
|
||
|
// We'll assume that the edit control contains only valid characters and
|
||
|
// doesn't begin with any spaces (for Regedit this will be true). So, we
|
||
|
// only need to validate that the length of the string isn't too long.
|
||
|
//
|
||
|
|
||
|
Length = GetDlgItemText(hWnd, nIDDlgItem, Buffer, sizeof(Buffer)/sizeof(TCHAR));
|
||
|
|
||
|
if (Length > 0 && Length <= 8) {
|
||
|
|
||
|
for (Index = 0; Index < Length; Index++) {
|
||
|
|
||
|
if (Buffer[Index] >= TEXT('0') && Buffer[Index] <= TEXT('9'))
|
||
|
Nibble = Buffer[Index] - TEXT('0');
|
||
|
else if (Buffer[Index] >= TEXT('a') && Buffer[Index] <= TEXT('f'))
|
||
|
Nibble = Buffer[Index] - TEXT('a') + 10;
|
||
|
else
|
||
|
Nibble = Buffer[Index] - TEXT('A') + 10;
|
||
|
|
||
|
Dword = (Dword << 4) + Nibble;
|
||
|
|
||
|
}
|
||
|
|
||
|
*lpTranslated = TRUE;
|
||
|
}
|
||
|
else
|
||
|
*lpTranslated = FALSE;
|
||
|
|
||
|
return Dword;
|
||
|
|
||
|
}
|
||
|
|
||
|
/*******************************************************************************
|
||
|
*
|
||
|
* EditDwordValueDlgProc
|
||
|
*
|
||
|
* DESCRIPTION:
|
||
|
*
|
||
|
* PARAMETERS:
|
||
|
*
|
||
|
*******************************************************************************/
|
||
|
|
||
|
INT_PTR
|
||
|
CALLBACK
|
||
|
EditDwordValueDlgProc(
|
||
|
HWND hWnd,
|
||
|
UINT Message,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam
|
||
|
)
|
||
|
{
|
||
|
|
||
|
LPEDITVALUEPARAM lpEditValueParam;
|
||
|
BOOL Translated;
|
||
|
DWORD Dword;
|
||
|
|
||
|
lpEditValueParam = (LPEDITVALUEPARAM) GetWindowLongPtr(hWnd, DWLP_USER);
|
||
|
|
||
|
switch (Message) {
|
||
|
|
||
|
HANDLE_MSG(hWnd, WM_INITDIALOG, EditDwordValue_OnInitDialog);
|
||
|
|
||
|
case WM_COMMAND:
|
||
|
switch (GET_WM_COMMAND_ID(wParam, lParam)) {
|
||
|
|
||
|
case IDC_VALUEDATA:
|
||
|
if (GET_WM_COMMAND_CMD(wParam, lParam) == EN_KILLFOCUS)
|
||
|
{
|
||
|
// EditDwordValue_StoreDlgValueData(hWnd, lpEditValueParam);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case IDC_DECIMAL:
|
||
|
case IDC_HEXADECIMAL:
|
||
|
if (EditDwordValue_StoreDlgValueData(hWnd, lpEditValueParam))
|
||
|
{
|
||
|
EditDwordValue_SetValueDataText(hWnd, lpEditValueParam,
|
||
|
GET_WM_COMMAND_ID(wParam, lParam));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// Since the value cannot be stored (only happens with decimal to
|
||
|
// hex) undo the user's choice.
|
||
|
CheckRadioButton(hWnd, IDC_HEXADECIMAL, IDC_DECIMAL, IDC_DECIMAL);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case IDOK:
|
||
|
if (!EditDwordValue_StoreDlgValueData(hWnd, lpEditValueParam))
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
// FALL THROUGH
|
||
|
|
||
|
case IDCANCEL:
|
||
|
EndDialog(hWnd, GET_WM_COMMAND_ID(wParam, lParam));
|
||
|
break;
|
||
|
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case WM_HELP:
|
||
|
WinHelp(((LPHELPINFO) lParam)-> hItemHandle, g_pHelpFileName,
|
||
|
HELP_WM_HELP, (ULONG_PTR) s_EditDwordValueHelpIDs);
|
||
|
break;
|
||
|
|
||
|
case WM_CONTEXTMENU:
|
||
|
WinHelp((HWND) wParam, g_pHelpFileName, HELP_CONTEXTMENU,
|
||
|
(ULONG_PTR) s_EditDwordValueHelpIDs);
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
return FALSE;
|
||
|
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
|
||
|
}
|
||
|
|
||
|
/*******************************************************************************
|
||
|
*
|
||
|
* EditDwordValue_OnInitDialog
|
||
|
*
|
||
|
* DESCRIPTION:
|
||
|
*
|
||
|
* PARAMETERS:
|
||
|
* hWnd, handle of EditDwordValue window.
|
||
|
* hFocusWnd,
|
||
|
* lParam,
|
||
|
*
|
||
|
*******************************************************************************/
|
||
|
|
||
|
BOOL
|
||
|
PASCAL
|
||
|
EditDwordValue_OnInitDialog(
|
||
|
HWND hWnd,
|
||
|
HWND hFocusWnd,
|
||
|
LPARAM lParam
|
||
|
)
|
||
|
{
|
||
|
|
||
|
LPEDITVALUEPARAM lpEditValueParam;
|
||
|
|
||
|
SetWindowLongPtr(hWnd, DWLP_USER, lParam);
|
||
|
lpEditValueParam = (LPEDITVALUEPARAM) lParam;
|
||
|
|
||
|
s_PrevValueDataWndProc = SubclassWindow(GetDlgItem(hWnd, IDC_VALUEDATA),
|
||
|
EditDwordValue_ValueDataWndProc);
|
||
|
|
||
|
SetDlgItemText(hWnd, IDC_VALUENAME, lpEditValueParam-> pValueName);
|
||
|
|
||
|
CheckRadioButton(hWnd, IDC_HEXADECIMAL, IDC_DECIMAL, IDC_HEXADECIMAL);
|
||
|
EditDwordValue_SetValueDataText(hWnd, lpEditValueParam, IDC_HEXADECIMAL);
|
||
|
|
||
|
return TRUE;
|
||
|
|
||
|
UNREFERENCED_PARAMETER(hFocusWnd);
|
||
|
|
||
|
}
|
||
|
|
||
|
/*******************************************************************************
|
||
|
*
|
||
|
* EditDwordValue_SetValueDataText
|
||
|
*
|
||
|
* DESCRIPTION:
|
||
|
*
|
||
|
* PARAMETERS:
|
||
|
* hWnd, handle of EditDwordValue window.
|
||
|
*
|
||
|
*******************************************************************************/
|
||
|
|
||
|
VOID
|
||
|
PASCAL
|
||
|
EditDwordValue_SetValueDataText(
|
||
|
HWND hWnd,
|
||
|
LPEDITVALUEPARAM lpEditValueParam,
|
||
|
UINT DlgItem
|
||
|
)
|
||
|
{
|
||
|
|
||
|
TCHAR Buffer[12]; // Enough to hold 2^32 in decimal
|
||
|
LPCTSTR lpFormatSpec;
|
||
|
UINT uEditLength;
|
||
|
|
||
|
s_SelectedBase = DlgItem;
|
||
|
|
||
|
if (s_SelectedBase == IDC_DECIMAL)
|
||
|
{
|
||
|
uEditLength = 10;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
uEditLength = 8;
|
||
|
}
|
||
|
SendDlgItemMessage( hWnd, IDC_VALUEDATA, EM_LIMITTEXT, ( WPARAM )uEditLength, 0L );
|
||
|
|
||
|
|
||
|
lpFormatSpec = (DlgItem == IDC_HEXADECIMAL) ? s_HexadecimalFormatSpec :
|
||
|
s_DecimalFormatSpec;
|
||
|
wsprintf(Buffer, lpFormatSpec, ((LPDWORD) lpEditValueParam->
|
||
|
pValueData)[0]);
|
||
|
SetDlgItemText(hWnd, IDC_VALUEDATA, Buffer);
|
||
|
|
||
|
}
|
||
|
|
||
|
/*******************************************************************************
|
||
|
*
|
||
|
* EditDwordValue_ValueDataEditProc
|
||
|
*
|
||
|
* DESCRIPTION:
|
||
|
*
|
||
|
* PARAMETERS:
|
||
|
* hWnd, handle of EditDwordValue window.
|
||
|
*
|
||
|
*******************************************************************************/
|
||
|
|
||
|
LRESULT
|
||
|
CALLBACK
|
||
|
EditDwordValue_ValueDataWndProc(
|
||
|
HWND hWnd,
|
||
|
UINT Message,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam
|
||
|
)
|
||
|
{
|
||
|
|
||
|
TCHAR Char;
|
||
|
|
||
|
switch (Message) {
|
||
|
|
||
|
case WM_CHAR:
|
||
|
Char = (TCHAR) wParam;
|
||
|
|
||
|
if (Char >= TEXT(' ')) {
|
||
|
|
||
|
if ((Char >= TEXT('0') && Char <= TEXT('9')))
|
||
|
break;
|
||
|
|
||
|
if (s_SelectedBase == IDC_HEXADECIMAL &&
|
||
|
((Char >= TEXT('A') && Char <= TEXT('F')) || ((Char >= TEXT('a')) &&
|
||
|
(Char <= TEXT('f')))))
|
||
|
break;
|
||
|
|
||
|
MessageBeep(0);
|
||
|
return 0;
|
||
|
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
}
|
||
|
|
||
|
return CallWindowProc(s_PrevValueDataWndProc, hWnd, Message, wParam,
|
||
|
lParam);
|
||
|
|
||
|
}
|
||
|
|
||
|
BOOL EditDwordValue_StoreDlgValueData(HWND hWnd, LPEDITVALUEPARAM lpEditValueParam)
|
||
|
{
|
||
|
BOOL fTranslated = TRUE;
|
||
|
DWORD dwValue = (s_SelectedBase == IDC_HEXADECIMAL) ?
|
||
|
GetDlgItemHex(hWnd, IDC_VALUEDATA, &fTranslated) :
|
||
|
GetDlgItemInt(hWnd, IDC_VALUEDATA, &fTranslated,
|
||
|
FALSE);
|
||
|
|
||
|
//
|
||
|
// Special case: "" == 0
|
||
|
//
|
||
|
if(!fTranslated && GetWindowTextLength(GetDlgItem(hWnd, IDC_VALUEDATA)) == 0) {
|
||
|
dwValue = 0;
|
||
|
fTranslated = TRUE;
|
||
|
}
|
||
|
|
||
|
if (fTranslated)
|
||
|
{
|
||
|
((LPDWORD) lpEditValueParam-> pValueData)[0] = dwValue;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
MessageBeep(0);
|
||
|
|
||
|
if (InternalMessageBox(g_hInstance, hWnd, MAKEINTRESOURCE(IDS_EDITDWTRUNCATEDEC),
|
||
|
MAKEINTRESOURCE(IDS_EDITWARNOVERFLOW), MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2,
|
||
|
NULL) == IDYES)
|
||
|
{
|
||
|
// Truncate Value
|
||
|
dwValue = 0xffffffff;
|
||
|
((LPDWORD) lpEditValueParam-> pValueData)[0] = dwValue;
|
||
|
fTranslated = TRUE;
|
||
|
}
|
||
|
}
|
||
|
return fTranslated;
|
||
|
}
|