|
|
/*******************************************************************************
* * (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; }
|