📄 dlgdata.cpp
字号:
// DlgData.cpp : implementation file
//
#include "stdafx.h"
#include "Redit.h"
#include "RegNode.h"
#include "DlgData.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDlgData dialog
CDlgData::CDlgData(CWnd* pParent /*=NULL*/)
: CDialog(CDlgData::IDD, pParent)
{
//{{AFX_DATA_INIT(CDlgData)
m_strValueData = _T("");
m_strValueName = _T("");
m_strFileName = _T("");
//}}AFX_DATA_INIT
m_pNode = NULL;
m_fDataChanged = FALSE;
}
void CDlgData::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgData)
DDX_Text(pDX, IDC_EDIT_VALUEDATA, m_strValueData);
DDX_Text(pDX, IDC_EDIT_VALUENAME, m_strValueName);
DDX_Text(pDX, IDC_FILENAME, m_strFileName);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDlgData, CDialog)
//{{AFX_MSG_MAP(CDlgData)
ON_BN_CLICKED(IDC_LOAD_FROM_FILE, OnLoadFromFile)
ON_EN_CHANGE(IDC_EDIT_VALUEDATA, OnChangeEditValueData)
ON_BN_CLICKED(IDC_BROWSE_FOR_FILE, OnBrowseForFile)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDlgData message handlers
static void StringFromBinary(CString &str, const BYTE *pb, DWORD dwSize)
{
str = TEXT("");
if (!pb)
return;
CString dv;
for (DWORD i = 0; i < dwSize; ++i)
{
dv.Format(TEXT("%02X"), pb[i]);
str += dv;
}
}
static bool BinaryFromString(BYTE **ppb, DWORD *pdwSize, LPCTSTR szDigits)
{
int dl = _tcsclen(szDigits);
int dc = 0;
for (int i = 0; i < dl; ++i)
{
if (isxdigit(szDigits[i]))
++dc;
}
DWORD dwSize = (dc + 1) / 2;
BYTE *pb = new BYTE[dwSize];
if (!pb)
return false;
if (*ppb)
delete [] *ppb;
*ppb = pb;
*pdwSize = dwSize;
UINT acc = 0;
for (i = 0; dc > 0 && i < dl; ++i)
{
UINT d = 0;
if ('a' <= szDigits[i] && szDigits[i] <= 'f')
d = szDigits[i] - 'a' + 10;
else if ('A' <= szDigits[i] && szDigits[i] <= 'F')
d = szDigits[i] - 'A' + 10;
else if ('0' <= szDigits[i] && szDigits[i] <= '9')
d = szDigits[i] - '0';
else
continue;
acc = (acc << 4) | (d & 0xf);
if (dc % 2)
{
*pb = acc;
acc = 0;
}
--dc;
}
return true;
}
BOOL CDlgData::OnInitDialog()
{
CDialog::OnInitDialog();
CString strTitle;
GetDlgItem(IDC_EDIT_VALUEDATA)->ModifyStyle(ES_NUMBER, 0, 0);
// TODO: Add extra initialization here
if (m_pNode)
{
CEdit *pEditDataCtrl = (CEdit *) GetDlgItem(IDC_EDIT_VALUEDATA);
BOOL fShowLoadFile = FALSE;
switch (m_pNode->m_dwDataType)
{
case REG_SZ:
case REG_EXPAND_SZ:
strTitle = _T("Edit String value");
m_strValueData = (LPTSTR)m_pNode->m_lpData;
SetDlgItemText(IDC_VALUE_DATA_LABEL, TEXT("String Value Data:"));
break;
case REG_DWORD:
m_strValueData.Format(_T("%ld"), *((LPDWORD)m_pNode->m_lpData));
strTitle = _T("Edit DWORD value");
if (pEditDataCtrl)
pEditDataCtrl->ModifyStyle(0, ES_NUMBER, 0);
SetDlgItemText(IDC_VALUE_DATA_LABEL, TEXT("DWORD Value Data:"));
break;
case REG_BINARY:
fShowLoadFile = TRUE;
StringFromBinary(m_strValueData, m_pNode->m_lpData, m_pNode->m_dwDataSize);
strTitle = _T("Edit Binary Data - Unimplemented");
SetDlgItemText(IDC_VALUE_DATA_LABEL, TEXT("Binary Value Data:"));
break;
case REG_MULTI_SZ:
strTitle = _T("Edit Multi-String Data - Unimplemented");
if (pEditDataCtrl)
pEditDataCtrl->SetReadOnly(TRUE);
SetDlgItemText(IDC_VALUE_DATA_LABEL, TEXT("Multi-String Value Data:"));
break;
}
CWnd *swnd;
if ((swnd = (CWnd *) GetDlgItem(IDC_LOAD_FROM_FILE)))
swnd->ShowWindow(fShowLoadFile ? SW_SHOWNA : SW_HIDE);
if ((swnd = (CWnd *) GetDlgItem(IDC_FILENAME)))
swnd->ShowWindow(fShowLoadFile ? SW_SHOWNA : SW_HIDE);
if ((swnd = (CWnd *) GetDlgItem(IDC_BROWSE_FOR_FILE)))
swnd->ShowWindow(fShowLoadFile ? SW_SHOWNA : SW_HIDE);
m_strValueName = m_pNode->m_strName;
SetWindowText(strTitle);
}
UpdateData(FALSE);
m_fDataChanged = FALSE;
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CDlgData::OnOK()
{
// TODO: Add extra validation here
UpdateData(TRUE);
LONG lRet = ERROR_SUCCESS;
if (m_pNode)
{
switch (m_pNode->m_dwDataType)
{
case REG_SZ:
if (m_pNode->m_lpData)
delete [] m_pNode->m_lpData;
m_pNode->m_lpData = new BYTE[(m_strValueData.GetLength() + 1)* sizeof(TCHAR)];
_tcscpy((LPTSTR)m_pNode->m_lpData, m_strValueData.GetBuffer(0));
m_pNode->m_dwDataSize = (m_strValueData.GetLength() + 1)* sizeof(TCHAR);
break;
case REG_DWORD:
if (m_pNode->m_lpData)
delete [] m_pNode->m_lpData;
*((LPDWORD)m_pNode->m_lpData) = _ttol(m_strValueData.GetBuffer(0));
m_pNode->m_dwDataSize = sizeof(DWORD);
break;
case REG_BINARY:
if (m_fDataChanged)
{
if (!BinaryFromString(&m_pNode->m_lpData, &m_pNode->m_dwDataSize, m_strValueData.GetBuffer(0)))
{
CDialog::OnOK();
return;
}
}
break;
default:
CDialog::OnOK();
return;
break;
}
// value name changed
// delete old value
HKEY hKey = m_pNode->m_pParent->GetKeyHandle();
if (m_strValueName != m_pNode->m_strName)
{
lRet = RegDeleteValue(hKey, (LPCTSTR)m_pNode->m_strName);
}
m_pNode->m_strName = m_strValueName;
if (lRet == ERROR_SUCCESS)
lRet = RegSetValueEx(hKey, (LPCTSTR)m_pNode->m_strName, 0, m_pNode->m_dwDataType, (LPBYTE)m_pNode->m_lpData, m_pNode->m_dwDataSize);
RegCloseKey(hKey);
if (lRet != ERROR_SUCCESS)
{
EndDialog(IDCANCEL);
}
}
CDialog::OnOK();
}
void CDlgData::OnLoadFromFile()
{
if (m_pNode && m_pNode->m_dwDataType == REG_BINARY)
{
UpdateData(TRUE);
CFile f;
if (f.Open(m_strFileName, CFile::modeRead|CFile::typeBinary))
{
DWORD dwLen = f.GetLength();
BYTE *pbNewData = new BYTE[dwLen];
if (pbNewData)
{
if (f.Read(pbNewData, dwLen) == dwLen)
{
if (m_pNode->m_lpData)
delete [] m_pNode->m_lpData;
m_pNode->m_dwDataSize = dwLen;
m_pNode->m_lpData = pbNewData;
}
else
delete [] pbNewData;
}
StringFromBinary(m_strValueData, m_pNode->m_lpData, m_pNode->m_dwDataSize);
UpdateData(FALSE);
m_fDataChanged = FALSE;
}
}
}
void CDlgData::OnChangeEditValueData()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function to send the EM_SETEVENTMASK message to the control
// with the ENM_CHANGE flag ORed into the lParam mask.
m_fDataChanged = TRUE;
}
void CDlgData::OnBrowseForFile()
{
if (m_pNode && m_pNode->m_dwDataType == REG_BINARY)
{
UpdateData(TRUE);
TCHAR szFileName[1024];
_tcsncpy(szFileName, m_strFileName.GetBuffer(0), sizeof(szFileName) / sizeof(*szFileName));
OPENFILENAME ofn;
memset(&ofn, 0, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = m_hWnd;
ofn.lpstrFile = szFileName;
ofn.nMaxFile = sizeof(szFileName) / sizeof(*szFileName);
ofn.lpstrTitle = TEXT("Select Binary File");
ofn.lpstrFilter = TEXT("All Files (*.*)\0*.*\0Certificate Files (*.cer,*.der,*.crt)\0*.cer;*.der;*.crt\0");
ofn.Flags = OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST;
if (GetOpenFileName(&ofn))
{
m_strFileName = szFileName;
UpdateData(FALSE);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -