Bug 5531: [PATCH] regedit: cut, copy, paste, etc. on hexedit by Katayama Hirofumi

svn path=/trunk/; revision=48334
This commit is contained in:
Daniel Reimer 2010-07-28 19:13:24 +00:00
parent 35efa046d1
commit 1a92fc2831
29 changed files with 508 additions and 27 deletions

View file

@ -587,8 +587,8 @@ LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPa
} }
else else
pt.x = pt.y = 0; pt.x = pt.y = 0;
}
ClientToScreen(pChildWnd->hListWnd, &pt); ClientToScreen(pChildWnd->hListWnd, &pt);
}
if(i == -1) if(i == -1)
{ {
TrackPopupMenu(GetSubMenu(hPopupMenus, PM_NEW), TPM_RIGHTBUTTON, pt.x, pt.y, 0, hFrameWnd, NULL); TrackPopupMenu(GetSubMenu(hPopupMenus, PM_NEW), TPM_RIGHTBUTTON, pt.x, pt.y, 0, hFrameWnd, NULL);

View file

@ -47,9 +47,11 @@ typedef struct
INT SelStart; INT SelStart;
INT SelEnd; INT SelEnd;
BOOL SelOnField;
} HEXEDIT_DATA, *PHEXEDIT_DATA; } HEXEDIT_DATA, *PHEXEDIT_DATA;
static const TCHAR ClipboardFormatName[] = TEXT("RegEdit_HexData");
static UINT ClipboardFormatID = 0;
/* hit test codes */ /* hit test codes */
#define HEHT_LEFTMARGIN (0x1) #define HEHT_LEFTMARGIN (0x1)
#define HEHT_ADDRESS (0x2) #define HEHT_ADDRESS (0x2)
@ -67,6 +69,8 @@ RegisterHexEditorClass(HINSTANCE hInstance)
{ {
WNDCLASSEX WndClass; WNDCLASSEX WndClass;
ClipboardFormatID = RegisterClipboardFormat(ClipboardFormatName);
ZeroMemory(&WndClass, sizeof(WNDCLASSEX)); ZeroMemory(&WndClass, sizeof(WNDCLASSEX));
WndClass.cbSize = sizeof(WNDCLASSEX); WndClass.cbSize = sizeof(WNDCLASSEX);
WndClass.style = CS_DBLCLKS; WndClass.style = CS_DBLCLKS;
@ -218,7 +222,7 @@ HEXEDIT_PaintLines(PHEXEDIT_DATA hed, HDC hDC, DWORD ScrollPos, DWORD First, DWO
if(ScrollPos + First == 0) if(ScrollPos + First == 0)
{ {
/* draw address */ /* draw address */
_stprintf(addr, _T("%04X"), 0); wsprintf(addr, TEXT("%04X"), 0);
TextOut(hDC, hed->LeftMargin, First * hed->LineHeight, addr, 4); TextOut(hDC, hed->LeftMargin, First * hed->LineHeight, addr, 4);
} }
} }
@ -240,7 +244,7 @@ HEXEDIT_PaintLines(PHEXEDIT_DATA hed, HDC hDC, DWORD ScrollPos, DWORD First, DWO
dx = hed->LeftMargin; dx = hed->LeftMargin;
/* draw address */ /* draw address */
_stprintf(addr, _T("%04lX"), linestart); wsprintf(addr, TEXT("%04lX"), linestart);
TextOut(hDC, dx, dy, addr, 4); TextOut(hDC, dx, dy, addr, 4);
dx += ((4 + hed->AddressSpacing) * hed->CharWidth); dx += ((4 + hed->AddressSpacing) * hed->CharWidth);
@ -260,7 +264,7 @@ HEXEDIT_PaintLines(PHEXEDIT_DATA hed, HDC hDC, DWORD ScrollPos, DWORD First, DWO
rct.left += dh; rct.left += dh;
rct.right += dh; rct.right += dh;
_stprintf(hex, _T("%02X"), *(current++)); wsprintf(hex, TEXT("%02X"), *(current++));
if (i0 <= i && i < i1) if (i0 <= i && i < i1)
{ {
rct2.left = dx; rct2.left = dx;
@ -285,7 +289,7 @@ HEXEDIT_PaintLines(PHEXEDIT_DATA hed, HDC hDC, DWORD ScrollPos, DWORD First, DWO
i = isave; i = isave;
for(x = 0; x < hed->ColumnsPerLine && current < end; x++) for(x = 0; x < hed->ColumnsPerLine && current < end; x++)
{ {
_stprintf(hex, _T("%C"), *(current++)); wsprintf(hex, _T("%C"), *(current++));
hex[0] = ((hex[0] & _T('\x007f')) >= _T(' ') ? hex[0] : _T('.')); hex[0] = ((hex[0] & _T('\x007f')) >= _T(' ') ? hex[0] : _T('.'));
if (i0 <= i && i < i1) if (i0 <= i && i < i1)
{ {
@ -415,6 +419,149 @@ HEXEDIT_IndexFromPoint(PHEXEDIT_DATA hed, POINTS pt, DWORD Hit, POINT *EditPos,
return Index; return Index;
} }
static VOID
HEXEDIT_Copy(PHEXEDIT_DATA hed)
{
PBYTE pb, buf;
UINT cb;
INT i0, i1;
HGLOBAL hGlobal;
if (hed->SelStart < hed->SelEnd)
{
i0 = hed->SelStart;
i1 = hed->SelEnd;
}
else
{
i0 = hed->SelEnd;
i1 = hed->SelStart;
}
cb = i1 - i0;
if (cb == 0)
return;
hGlobal = GlobalAlloc(GHND | GMEM_SHARE, cb + sizeof(DWORD));
if (hGlobal == NULL)
return;
pb = GlobalLock(hGlobal);
if (pb)
{
*(PDWORD)pb = cb;
pb += sizeof(DWORD);
buf = (PBYTE) LocalLock(hed->hBuffer);
if (buf)
{
CopyMemory(pb, buf + i0, cb);
LocalUnlock(hed->hBuffer);
}
GlobalUnlock(hGlobal);
if (OpenClipboard(hed->hWndSelf))
{
EmptyClipboard();
SetClipboardData(ClipboardFormatID, hGlobal);
CloseClipboard();
}
}
else
GlobalFree(hGlobal);
}
static VOID
HEXEDIT_Delete(PHEXEDIT_DATA hed)
{
PBYTE buf;
INT i0, i1;
UINT bufsize;
if (hed->SelStart < hed->SelEnd)
{
i0 = hed->SelStart;
i1 = hed->SelEnd;
}
else
{
i0 = hed->SelEnd;
i1 = hed->SelStart;
}
if (i0 != i1)
{
bufsize = (hed->hBuffer ? LocalSize(hed->hBuffer) : 0);
buf = (PBYTE) LocalLock(hed->hBuffer);
if (buf)
{
MoveMemory(buf + i0, buf + i1, bufsize - i1);
LocalUnlock(hed->hBuffer);
}
HexEdit_SetMaxBufferSize(hed->hWndSelf, bufsize - (i1 - i0));
hed->InMid = FALSE;
hed->Index = hed->SelStart = hed->SelEnd = i0;
hed->CaretCol = hed->Index % hed->ColumnsPerLine;
hed->CaretLine = hed->Index / hed->ColumnsPerLine;
InvalidateRect(hed->hWndSelf, NULL, TRUE);
HEXEDIT_MoveCaret(hed, TRUE);
}
}
static VOID
HEXEDIT_Paste(PHEXEDIT_DATA hed)
{
HGLOBAL hGlobal;
UINT bufsize;
PBYTE pb, buf;
DWORD cb;
HEXEDIT_Delete(hed);
bufsize = (hed->hBuffer ? LocalSize(hed->hBuffer) : 0);
if (OpenClipboard(hed->hWndSelf))
{
hGlobal = GetClipboardData(ClipboardFormatID);
if (hGlobal != NULL)
{
pb = (PBYTE) GlobalLock(hGlobal);
cb = *(PDWORD) pb;
pb += sizeof(DWORD);
HexEdit_SetMaxBufferSize(hed->hWndSelf, bufsize + cb);
buf = (PBYTE) LocalLock(hed->hBuffer);
if (buf)
{
MoveMemory(buf + hed->Index + cb, buf + hed->Index,
bufsize - hed->Index);
CopyMemory(buf + hed->Index, pb, cb);
LocalUnlock(hed->hBuffer);
}
GlobalUnlock(hGlobal);
}
CloseClipboard();
}
InvalidateRect(hed->hWndSelf, NULL, TRUE);
HEXEDIT_MoveCaret(hed, TRUE);
}
static VOID
HEXEDIT_Cut(PHEXEDIT_DATA hed)
{
HEXEDIT_Copy(hed);
HEXEDIT_Delete(hed);
}
static VOID
HEXEDIT_SelectAll(PHEXEDIT_DATA hed)
{
INT bufsize;
bufsize = (hed->hBuffer ? (INT) LocalSize(hed->hBuffer) : 0);
hed->Index = hed->SelStart = 0;
hed->SelEnd = bufsize;
InvalidateRect(hed->hWndSelf, NULL, TRUE);
HEXEDIT_MoveCaret(hed, TRUE);
}
/*** Control specific messages ************************************************/ /*** Control specific messages ************************************************/
static LRESULT static LRESULT
@ -808,19 +955,18 @@ HEXEDIT_WM_LBUTTONDOWN(PHEXEDIT_DATA hed, INT Buttons, POINTS Pt)
if (GetAsyncKeyState(VK_SHIFT) < 0) if (GetAsyncKeyState(VK_SHIFT) < 0)
{ {
if (hed->SelOnField) if (hed->EditingField)
hed->Index = HEXEDIT_IndexFromPoint(hed, Pt, HEHT_HEXDUMP, &EditPos, &NewField); hed->Index = HEXEDIT_IndexFromPoint(hed, Pt, HEHT_HEXDUMP, &EditPos, &NewField);
else else
hed->Index = HEXEDIT_IndexFromPoint(hed, Pt, HEHT_ASCIIDUMP, &EditPos, &NewField); hed->Index = HEXEDIT_IndexFromPoint(hed, Pt, HEHT_ASCIIDUMP, &EditPos, &NewField);
hed->SelEnd = hed->Index; hed->SelEnd = hed->Index;
hed->EditingField = hed->SelOnField;
} }
else else
{ {
Hit = HEXEDIT_HitRegionTest(hed, Pt); Hit = HEXEDIT_HitRegionTest(hed, Pt);
hed->Index = HEXEDIT_IndexFromPoint(hed, Pt, Hit, &EditPos, &NewField); hed->Index = HEXEDIT_IndexFromPoint(hed, Pt, Hit, &EditPos, &NewField);
hed->SelStart = hed->SelEnd = hed->Index; hed->SelStart = hed->SelEnd = hed->Index;
hed->SelOnField = hed->EditingField = NewField; hed->EditingField = NewField;
SetCapture(hed->hWndSelf); SetCapture(hed->hWndSelf);
} }
hed->CaretCol = EditPos.x; hed->CaretCol = EditPos.x;
@ -839,7 +985,7 @@ HEXEDIT_WM_LBUTTONUP(PHEXEDIT_DATA hed, INT Buttons, POINTS Pt)
POINT EditPos; POINT EditPos;
if (GetCapture() == hed->hWndSelf) if (GetCapture() == hed->hWndSelf)
{ {
if (hed->SelOnField) if (hed->EditingField)
hed->Index = HEXEDIT_IndexFromPoint(hed, Pt, HEHT_HEXDUMP, &EditPos, &NewField); hed->Index = HEXEDIT_IndexFromPoint(hed, Pt, HEHT_HEXDUMP, &EditPos, &NewField);
else else
hed->Index = HEXEDIT_IndexFromPoint(hed, Pt, HEHT_ASCIIDUMP, &EditPos, &NewField); hed->Index = HEXEDIT_IndexFromPoint(hed, Pt, HEHT_ASCIIDUMP, &EditPos, &NewField);
@ -860,7 +1006,7 @@ HEXEDIT_WM_MOUSEMOVE(PHEXEDIT_DATA hed, INT Buttons, POINTS Pt)
POINT EditPos; POINT EditPos;
if (GetCapture() == hed->hWndSelf) if (GetCapture() == hed->hWndSelf)
{ {
if (hed->SelOnField) if (hed->EditingField)
hed->Index = HEXEDIT_IndexFromPoint(hed, Pt, HEHT_HEXDUMP, &EditPos, &NewField); hed->Index = HEXEDIT_IndexFromPoint(hed, Pt, HEHT_HEXDUMP, &EditPos, &NewField);
else else
hed->Index = HEXEDIT_IndexFromPoint(hed, Pt, HEHT_ASCIIDUMP, &EditPos, &NewField); hed->Index = HEXEDIT_IndexFromPoint(hed, Pt, HEHT_ASCIIDUMP, &EditPos, &NewField);
@ -900,8 +1046,51 @@ HEXEDIT_WM_KEYDOWN(PHEXEDIT_DATA hed, INT VkCode)
switch(VkCode) switch(VkCode)
{ {
case VK_DELETE: case 'X':
if (GetAsyncKeyState(VK_SHIFT) >= 0 &&
GetAsyncKeyState(VK_CONTROL) < 0 && hed->SelStart != hed->SelEnd)
HEXEDIT_Cut(hed);
else
return TRUE;
break;
case 'C':
if (GetAsyncKeyState(VK_SHIFT) >= 0 &&
GetAsyncKeyState(VK_CONTROL) < 0 && hed->SelStart != hed->SelEnd)
HEXEDIT_Copy(hed);
else
return TRUE;
break;
case 'V':
if (GetAsyncKeyState(VK_SHIFT) >= 0 && GetAsyncKeyState(VK_CONTROL) < 0)
HEXEDIT_Paste(hed);
else
return TRUE;
break;
case 'A':
if (GetAsyncKeyState(VK_SHIFT) >= 0 && GetAsyncKeyState(VK_CONTROL) < 0)
HEXEDIT_SelectAll(hed);
else
return TRUE;
break;
case VK_INSERT:
if (hed->SelStart != hed->SelEnd) if (hed->SelStart != hed->SelEnd)
{
if (GetAsyncKeyState(VK_SHIFT) >= 0 && GetAsyncKeyState(VK_CONTROL) < 0)
HEXEDIT_Copy(hed);
}
if (GetAsyncKeyState(VK_SHIFT) < 0 && GetAsyncKeyState(VK_CONTROL) >= 0)
HEXEDIT_Paste(hed);
break;
case VK_DELETE:
if (GetAsyncKeyState(VK_SHIFT) < 0 && GetAsyncKeyState(VK_CONTROL) >= 0 &&
hed->SelStart != hed->SelEnd)
HEXEDIT_Copy(hed);
if (i0 != i1)
{ {
buf = (PBYTE) LocalLock(hed->hBuffer); buf = (PBYTE) LocalLock(hed->hBuffer);
if (buf) if (buf)
@ -946,7 +1135,7 @@ HEXEDIT_WM_KEYDOWN(PHEXEDIT_DATA hed, INT VkCode)
break; break;
case VK_BACK: case VK_BACK:
if (hed->SelStart != hed->SelEnd) if (i0 != i1)
{ {
buf = (PBYTE) LocalLock(hed->hBuffer); buf = (PBYTE) LocalLock(hed->hBuffer);
if (buf) if (buf)
@ -986,6 +1175,8 @@ HEXEDIT_WM_KEYDOWN(PHEXEDIT_DATA hed, INT VkCode)
hed->CaretCol = hed->Index % hed->ColumnsPerLine; hed->CaretCol = hed->Index % hed->ColumnsPerLine;
hed->CaretLine = hed->Index / hed->ColumnsPerLine; hed->CaretLine = hed->Index / hed->ColumnsPerLine;
} }
else
return TRUE;
HexEdit_SetMaxBufferSize(hed->hWndSelf, bufsize - 1); HexEdit_SetMaxBufferSize(hed->hWndSelf, bufsize - 1);
hed->InMid = FALSE; hed->InMid = FALSE;
} }
@ -1056,6 +1247,9 @@ HEXEDIT_WM_KEYDOWN(PHEXEDIT_DATA hed, INT VkCode)
InvalidateRect(hed->hWndSelf, NULL, TRUE); InvalidateRect(hed->hWndSelf, NULL, TRUE);
HEXEDIT_MoveCaret(hed, TRUE); HEXEDIT_MoveCaret(hed, TRUE);
break; break;
default:
return TRUE;
} }
return FALSE; return FALSE;
@ -1185,6 +1379,40 @@ HEXEDIT_WM_SIZE(PHEXEDIT_DATA hed, DWORD sType, WORD NewWidth, WORD NewHeight)
return 0; return 0;
} }
static VOID
HEXEDIT_WM_CONTEXTMENU(PHEXEDIT_DATA hed, INT x, INT y)
{
HMENU hMenu;
RECT rc;
if (x == -1 && y == -1)
{
GetWindowRect(hed->hWndSelf, &rc);
x = rc.left;
y = rc.top;
}
hMenu = GetSubMenu(hPopupMenus, PM_HEXEDIT);
if (hed->SelStart == hed->SelEnd)
{
EnableMenuItem(hMenu, ID_HEXEDIT_CUT, MF_GRAYED);
EnableMenuItem(hMenu, ID_HEXEDIT_COPY, MF_GRAYED);
EnableMenuItem(hMenu, ID_HEXEDIT_PASTE, MF_GRAYED);
EnableMenuItem(hMenu, ID_HEXEDIT_DELETE, MF_GRAYED);
}
else
{
EnableMenuItem(hMenu, ID_HEXEDIT_CUT, MF_ENABLED);
EnableMenuItem(hMenu, ID_HEXEDIT_COPY, MF_ENABLED);
EnableMenuItem(hMenu, ID_HEXEDIT_PASTE, MF_ENABLED);
EnableMenuItem(hMenu, ID_HEXEDIT_DELETE, MF_ENABLED);
}
SetForegroundWindow(hed->hWndSelf);
TrackPopupMenu(hMenu, TPM_RIGHTBUTTON, x, y, 0, hed->hWndSelf, NULL);
PostMessage(hed->hWndSelf, WM_NULL, 0, 0);
}
INT_PTR CALLBACK INT_PTR CALLBACK
HexEditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) HexEditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{ {
@ -1291,11 +1519,32 @@ HexEditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
break; break;
case WM_CONTEXTMENU: case WM_CONTEXTMENU:
/* FIXME: Implement Cut, Copy, Paste, Delete and Select All */ HEXEDIT_WM_CONTEXTMENU(hed, (short)LOWORD(lParam), (short)HIWORD(lParam));
break; break;
case WM_COMMAND: case WM_COMMAND:
/* FIXME: Implement Cut, Copy, Paste, Delete and Select All */ switch(LOWORD(wParam))
{
case ID_HEXEDIT_CUT:
HEXEDIT_Cut(hed);
break;
case ID_HEXEDIT_COPY:
HEXEDIT_Copy(hed);
break;
case ID_HEXEDIT_PASTE:
HEXEDIT_Paste(hed);
break;
case ID_HEXEDIT_DELETE:
HEXEDIT_Delete(hed);
break;
case ID_HEXEDIT_SELECT_ALL:
HEXEDIT_SelectAll(hed);
break;
}
break; break;
} }

View file

@ -162,6 +162,15 @@ BEGIN
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Çàïîìíÿíå ñòîéíîñòòà íà êëþ÷à", ID_EDIT_COPYKEYNAME MENUITEM "&Çàïîìíÿíå ñòîéíîñòòà íà êëþ÷à", ID_EDIT_COPYKEYNAME
END END
POPUP ""
BEGIN
MENUITEM "C&ut", ID_HEXEDIT_CUT
MENUITEM "&Copy", ID_HEXEDIT_COPY
MENUITEM "&Paste", ID_HEXEDIT_PASTE
MENUITEM "&Delete", ID_HEXEDIT_DELETE
MENUITEM SEPARATOR
MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL
END
END END

View file

@ -160,6 +160,15 @@ BEGIN
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Z&kopírovat název klíèe", ID_EDIT_COPYKEYNAME MENUITEM "Z&kopírovat název klíèe", ID_EDIT_COPYKEYNAME
END END
POPUP ""
BEGIN
MENUITEM "C&ut", ID_HEXEDIT_CUT
MENUITEM "&Copy", ID_HEXEDIT_COPY
MENUITEM "&Paste", ID_HEXEDIT_PASTE
MENUITEM "&Delete", ID_HEXEDIT_DELETE
MENUITEM SEPARATOR
MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL
END
END END

View file

@ -162,6 +162,15 @@ BEGIN
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "S&chlüsselnamen kopieren", ID_EDIT_COPYKEYNAME MENUITEM "S&chlüsselnamen kopieren", ID_EDIT_COPYKEYNAME
END END
POPUP ""
BEGIN
MENUITEM "&Ausschneiden", ID_HEXEDIT_CUT
MENUITEM "&Kopieren", ID_HEXEDIT_COPY
MENUITEM "&Einfügen", ID_HEXEDIT_PASTE
MENUITEM "&Löschen", ID_HEXEDIT_DELETE
MENUITEM SEPARATOR
MENUITEM "A&lles auswählen", ID_HEXEDIT_SELECT_ALL
END
END END

View file

@ -162,6 +162,15 @@ BEGIN
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&ÁíôéãñáöÞ Ïíüìáôïò Êëåéäéïý", ID_EDIT_COPYKEYNAME MENUITEM "&ÁíôéãñáöÞ Ïíüìáôïò Êëåéäéïý", ID_EDIT_COPYKEYNAME
END END
POPUP ""
BEGIN
MENUITEM "C&ut", ID_HEXEDIT_CUT
MENUITEM "&Copy", ID_HEXEDIT_COPY
MENUITEM "&Paste", ID_HEXEDIT_PASTE
MENUITEM "&Delete", ID_HEXEDIT_DELETE
MENUITEM SEPARATOR
MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL
END
END END

View file

@ -160,6 +160,15 @@ BEGIN
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Copy Key Name", ID_EDIT_COPYKEYNAME MENUITEM "&Copy Key Name", ID_EDIT_COPYKEYNAME
END END
POPUP ""
BEGIN
MENUITEM "C&ut", ID_HEXEDIT_CUT
MENUITEM "&Copy", ID_HEXEDIT_COPY
MENUITEM "&Paste", ID_HEXEDIT_PASTE
MENUITEM "&Delete", ID_HEXEDIT_DELETE
MENUITEM SEPARATOR
MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL
END
END END

View file

@ -165,6 +165,15 @@ BEGIN
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Copiar nombre de clave", ID_EDIT_COPYKEYNAME MENUITEM "&Copiar nombre de clave", ID_EDIT_COPYKEYNAME
END END
POPUP ""
BEGIN
MENUITEM "C&ut", ID_HEXEDIT_CUT
MENUITEM "&Copy", ID_HEXEDIT_COPY
MENUITEM "&Paste", ID_HEXEDIT_PASTE
MENUITEM "&Delete", ID_HEXEDIT_DELETE
MENUITEM SEPARATOR
MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL
END
END END

View file

@ -165,6 +165,15 @@ BEGIN
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Copier le nom de la clé", ID_EDIT_COPYKEYNAME MENUITEM "&Copier le nom de la clé", ID_EDIT_COPYKEYNAME
END END
POPUP ""
BEGIN
MENUITEM "C&ut", ID_HEXEDIT_CUT
MENUITEM "&Copy", ID_HEXEDIT_COPY
MENUITEM "&Paste", ID_HEXEDIT_PASTE
MENUITEM "&Delete", ID_HEXEDIT_DELETE
MENUITEM SEPARATOR
MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL
END
END END

View file

@ -163,6 +163,15 @@ BEGIN
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Copy Key Name", ID_EDIT_COPYKEYNAME MENUITEM "&Copy Key Name", ID_EDIT_COPYKEYNAME
END END
POPUP ""
BEGIN
MENUITEM "C&ut", ID_HEXEDIT_CUT
MENUITEM "&Copy", ID_HEXEDIT_COPY
MENUITEM "&Paste", ID_HEXEDIT_PASTE
MENUITEM "&Delete", ID_HEXEDIT_DELETE
MENUITEM SEPARATOR
MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL
END
END END

View file

@ -162,6 +162,15 @@ BEGIN
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Copy Nama Kunci", ID_EDIT_COPYKEYNAME MENUITEM "&Copy Nama Kunci", ID_EDIT_COPYKEYNAME
END END
POPUP ""
BEGIN
MENUITEM "C&ut", ID_HEXEDIT_CUT
MENUITEM "&Copy", ID_HEXEDIT_COPY
MENUITEM "&Paste", ID_HEXEDIT_PASTE
MENUITEM "&Delete", ID_HEXEDIT_DELETE
MENUITEM SEPARATOR
MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL
END
END END

View file

@ -165,6 +165,15 @@ BEGIN
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Copia il nome della chiave", ID_EDIT_COPYKEYNAME MENUITEM "&Copia il nome della chiave", ID_EDIT_COPYKEYNAME
END END
POPUP ""
BEGIN
MENUITEM "C&ut", ID_HEXEDIT_CUT
MENUITEM "&Copy", ID_HEXEDIT_COPY
MENUITEM "&Paste", ID_HEXEDIT_PASTE
MENUITEM "&Delete", ID_HEXEDIT_DELETE
MENUITEM SEPARATOR
MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL
END
END END

View file

@ -160,6 +160,15 @@ BEGIN
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "キー名のコピー(&C)", ID_EDIT_COPYKEYNAME MENUITEM "キー名のコピー(&C)", ID_EDIT_COPYKEYNAME
END END
POPUP ""
BEGIN
MENUITEM "切り取り(&C)", ID_HEXEDIT_CUT
MENUITEM "コピー(&C)", ID_HEXEDIT_COPY
MENUITEM "貼\り付け(&P)", ID_HEXEDIT_PASTE
MENUITEM "削除(&D)", ID_HEXEDIT_DELETE
MENUITEM SEPARATOR
MENUITEM "すべて選択(&A)", ID_HEXEDIT_SELECT_ALL
END
END END

View file

@ -147,6 +147,15 @@ BEGIN
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "키 이름 복사(&C)", ID_EDIT_COPYKEYNAME MENUITEM "키 이름 복사(&C)", ID_EDIT_COPYKEYNAME
END END
POPUP ""
BEGIN
MENUITEM "C&ut", ID_HEXEDIT_CUT
MENUITEM "&Copy", ID_HEXEDIT_COPY
MENUITEM "&Paste", ID_HEXEDIT_PASTE
MENUITEM "&Delete", ID_HEXEDIT_DELETE
MENUITEM SEPARATOR
MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL
END
END END

View file

@ -162,6 +162,15 @@ BEGIN
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Copy Key Name", ID_EDIT_COPYKEYNAME MENUITEM "&Copy Key Name", ID_EDIT_COPYKEYNAME
END END
POPUP ""
BEGIN
MENUITEM "C&ut", ID_HEXEDIT_CUT
MENUITEM "&Copy", ID_HEXEDIT_COPY
MENUITEM "&Paste", ID_HEXEDIT_PASTE
MENUITEM "&Delete", ID_HEXEDIT_DELETE
MENUITEM SEPARATOR
MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL
END
END END

View file

@ -162,6 +162,15 @@ BEGIN
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Kopier nøkkelnavn", ID_EDIT_COPYKEYNAME MENUITEM "&Kopier nøkkelnavn", ID_EDIT_COPYKEYNAME
END END
POPUP ""
BEGIN
MENUITEM "C&ut", ID_HEXEDIT_CUT
MENUITEM "&Copy", ID_HEXEDIT_COPY
MENUITEM "&Paste", ID_HEXEDIT_PASTE
MENUITEM "&Delete", ID_HEXEDIT_DELETE
MENUITEM SEPARATOR
MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL
END
END END

View file

@ -167,6 +167,15 @@ BEGIN
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Kopiuj nazwê klucza", ID_EDIT_COPYKEYNAME MENUITEM "&Kopiuj nazwê klucza", ID_EDIT_COPYKEYNAME
END END
POPUP ""
BEGIN
MENUITEM "C&ut", ID_HEXEDIT_CUT
MENUITEM "&Copy", ID_HEXEDIT_COPY
MENUITEM "&Paste", ID_HEXEDIT_PASTE
MENUITEM "&Delete", ID_HEXEDIT_DELETE
MENUITEM SEPARATOR
MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL
END
END END

View file

@ -163,6 +163,15 @@ BEGIN
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Copiar nome da chave", ID_EDIT_COPYKEYNAME MENUITEM "&Copiar nome da chave", ID_EDIT_COPYKEYNAME
END END
POPUP ""
BEGIN
MENUITEM "C&ut", ID_HEXEDIT_CUT
MENUITEM "&Copy", ID_HEXEDIT_COPY
MENUITEM "&Paste", ID_HEXEDIT_PASTE
MENUITEM "&Delete", ID_HEXEDIT_DELETE
MENUITEM SEPARATOR
MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL
END
END END

View file

@ -163,6 +163,15 @@ BEGIN
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Copy Key Name", ID_EDIT_COPYKEYNAME MENUITEM "&Copy Key Name", ID_EDIT_COPYKEYNAME
END END
POPUP ""
BEGIN
MENUITEM "C&ut", ID_HEXEDIT_CUT
MENUITEM "&Copy", ID_HEXEDIT_COPY
MENUITEM "&Paste", ID_HEXEDIT_PASTE
MENUITEM "&Delete", ID_HEXEDIT_DELETE
MENUITEM SEPARATOR
MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL
END
END END

View file

@ -162,6 +162,15 @@ BEGIN
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Êîïèðîâàòü èìÿ êëþ÷à", ID_EDIT_COPYKEYNAME MENUITEM "&Êîïèðîâàòü èìÿ êëþ÷à", ID_EDIT_COPYKEYNAME
END END
POPUP ""
BEGIN
MENUITEM "C&ut", ID_HEXEDIT_CUT
MENUITEM "&Copy", ID_HEXEDIT_COPY
MENUITEM "&Paste", ID_HEXEDIT_PASTE
MENUITEM "&Delete", ID_HEXEDIT_DELETE
MENUITEM SEPARATOR
MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL
END
END END

View file

@ -147,6 +147,15 @@ BEGIN
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Copy Key Name", ID_EDIT_COPYKEYNAME MENUITEM "&Copy Key Name", ID_EDIT_COPYKEYNAME
END END
POPUP ""
BEGIN
MENUITEM "C&ut", ID_HEXEDIT_CUT
MENUITEM "&Copy", ID_HEXEDIT_COPY
MENUITEM "&Paste", ID_HEXEDIT_PASTE
MENUITEM "&Delete", ID_HEXEDIT_DELETE
MENUITEM SEPARATOR
MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL
END
END END

View file

@ -162,6 +162,15 @@ BEGIN
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Copy Key Name", ID_EDIT_COPYKEYNAME MENUITEM "&Copy Key Name", ID_EDIT_COPYKEYNAME
END END
POPUP ""
BEGIN
MENUITEM "C&ut", ID_HEXEDIT_CUT
MENUITEM "&Copy", ID_HEXEDIT_COPY
MENUITEM "&Paste", ID_HEXEDIT_PASTE
MENUITEM "&Delete", ID_HEXEDIT_DELETE
MENUITEM SEPARATOR
MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL
END
END END

View file

@ -160,6 +160,15 @@ BEGIN
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Kopiera nyckelnamn", ID_EDIT_COPYKEYNAME MENUITEM "&Kopiera nyckelnamn", ID_EDIT_COPYKEYNAME
END END
POPUP ""
BEGIN
MENUITEM "C&ut", ID_HEXEDIT_CUT
MENUITEM "&Copy", ID_HEXEDIT_COPY
MENUITEM "&Paste", ID_HEXEDIT_PASTE
MENUITEM "&Delete", ID_HEXEDIT_DELETE
MENUITEM SEPARATOR
MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL
END
END END

View file

@ -162,6 +162,15 @@ BEGIN
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Copy Key Name", ID_EDIT_COPYKEYNAME MENUITEM "&Copy Key Name", ID_EDIT_COPYKEYNAME
END END
POPUP ""
BEGIN
MENUITEM "C&ut", ID_HEXEDIT_CUT
MENUITEM "&Copy", ID_HEXEDIT_COPY
MENUITEM "&Paste", ID_HEXEDIT_PASTE
MENUITEM "&Delete", ID_HEXEDIT_DELETE
MENUITEM SEPARATOR
MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL
END
END END

View file

@ -163,6 +163,15 @@ BEGIN
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Êîï³þâàòè ³ì'ÿ ðîçä³ëó", ID_EDIT_COPYKEYNAME MENUITEM "&Êîï³þâàòè ³ì'ÿ ðîçä³ëó", ID_EDIT_COPYKEYNAME
END END
POPUP ""
BEGIN
MENUITEM "C&ut", ID_HEXEDIT_CUT
MENUITEM "&Copy", ID_HEXEDIT_COPY
MENUITEM "&Paste", ID_HEXEDIT_PASTE
MENUITEM "&Delete", ID_HEXEDIT_DELETE
MENUITEM SEPARATOR
MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL
END
END END

View file

@ -162,6 +162,15 @@ BEGIN
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "复制项名称(&C)", ID_EDIT_COPYKEYNAME MENUITEM "复制项名称(&C)", ID_EDIT_COPYKEYNAME
END END
POPUP ""
BEGIN
MENUITEM "C&ut", ID_HEXEDIT_CUT
MENUITEM "&Copy", ID_HEXEDIT_COPY
MENUITEM "&Paste", ID_HEXEDIT_PASTE
MENUITEM "&Delete", ID_HEXEDIT_DELETE
MENUITEM SEPARATOR
MENUITEM "Select &All", ID_HEXEDIT_SELECT_ALL
END
END END

View file

@ -35,6 +35,7 @@
#define PM_MODIFYVALUE 0 #define PM_MODIFYVALUE 0
#define PM_NEW 1 #define PM_NEW 1
#define PM_TREECONTEXT 2 #define PM_TREECONTEXT 2
#define PM_HEXEDIT 3
#define MAX_NEW_KEY_LEN 128 #define MAX_NEW_KEY_LEN 128

View file

@ -108,6 +108,11 @@
#define ID_REGISTRY_PRINTSUBTREE 32832 #define ID_REGISTRY_PRINTSUBTREE 32832
#define ID_REGISTRY_PRINTERSETUP 32833 #define ID_REGISTRY_PRINTERSETUP 32833
#define ID_REGISTRY_SAVESUBTREEAS 32834 #define ID_REGISTRY_SAVESUBTREEAS 32834
#define ID_HEXEDIT_CUT 32835
#define ID_HEXEDIT_COPY 32836
#define ID_HEXEDIT_PASTE 32837
#define ID_HEXEDIT_DELETE 32838
#define ID_HEXEDIT_SELECT_ALL 32839
#define IDS_LICENSE 32835 #define IDS_LICENSE 32835
#define IDS_ERROR 32836 #define IDS_ERROR 32836
#define IDS_BAD_VALUE 32837 #define IDS_BAD_VALUE 32837
@ -203,6 +208,7 @@
#define IDC_LOOKAT_DATA 2016 #define IDC_LOOKAT_DATA 2016
#define IDC_MATCHSTRING 2017 #define IDC_MATCHSTRING 2017
#define IDC_MATCHCASE 2018 #define IDC_MATCHCASE 2018
#define IDS_FINISHEDFIND 2019 #define IDS_FINISHEDFIND 2019
#define ID_FAVORITES_MIN 2100 #define ID_FAVORITES_MIN 2100
@ -210,4 +216,5 @@
#define ID_ACCEL 3000 #define ID_ACCEL 3000
#define IDC_STATIC -1 #define IDC_STATIC -1

View file

@ -540,15 +540,16 @@ BOOL CreateNewKey(HWND hwndTV, HTREEITEM hItem)
TCHAR szNewKey[128]; TCHAR szNewKey[128];
LPCTSTR pszKeyPath; LPCTSTR pszKeyPath;
int iIndex = 1; int iIndex = 1;
HKEY hRootKey; LONG nResult;
HKEY hKey = NULL; HKEY hRootKey = NULL, hKey = NULL, hNewKey = NULL;
HKEY hNewKey = NULL;
BOOL bSuccess = FALSE; BOOL bSuccess = FALSE;
DWORD dwDisposition; DWORD dwDisposition;
HTREEITEM hNewItem; HTREEITEM hNewItem;
pszKeyPath = GetItemPath(g_pChildWnd->hTreeWnd, hItem, &hRootKey); pszKeyPath = GetItemPath(hwndTV, hItem, &hRootKey);
if (RegOpenKey(hRootKey, pszKeyPath, &hKey) != ERROR_SUCCESS) if (pszKeyPath[0] == TEXT('\0'))
hKey = hRootKey;
else if (RegOpenKey(hRootKey, pszKeyPath, &hKey) != ERROR_SUCCESS)
goto done; goto done;
if (LoadString(hInst, IDS_NEW_KEY, szNewKeyFormat, sizeof(szNewKeyFormat) / sizeof(szNewKeyFormat[0])) <= 0) if (LoadString(hInst, IDS_NEW_KEY, szNewKeyFormat, sizeof(szNewKeyFormat) / sizeof(szNewKeyFormat[0])) <= 0)
@ -557,13 +558,20 @@ BOOL CreateNewKey(HWND hwndTV, HTREEITEM hItem)
/* Need to create a new key with a unique name */ /* Need to create a new key with a unique name */
do do
{ {
_sntprintf(szNewKey, sizeof(szNewKey) / sizeof(szNewKey[0]), szNewKeyFormat, iIndex++); wsprintf(szNewKey, szNewKeyFormat, iIndex++);
RegCreateKeyEx(hKey, szNewKey, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hNewKey, &dwDisposition); nResult = RegCreateKeyEx(hKey, szNewKey, 0, NULL, 0, KEY_WRITE, NULL, &hNewKey, &dwDisposition);
if (hNewKey && (dwDisposition == REG_OPENED_EXISTING_KEY)) if (hNewKey && dwDisposition == REG_OPENED_EXISTING_KEY)
{ {
RegCloseKey(hNewKey); RegCloseKey(hNewKey);
hNewKey = NULL; hNewKey = NULL;
} }
else if (!hNewKey)
{
TCHAR sz[256];
wsprintf(sz, TEXT("Cannot create new key!\n\nError Code: %d"), nResult);
MessageBox(hFrameWnd, sz, NULL, MB_ICONERROR);
goto done;
}
} }
while(!hNewKey); while(!hNewKey);
@ -578,7 +586,7 @@ BOOL CreateNewKey(HWND hwndTV, HTREEITEM hItem)
bSuccess = TRUE; bSuccess = TRUE;
done: done:
if (hKey) if (hKey != hRootKey && hKey)
RegCloseKey(hKey); RegCloseKey(hKey);
if (hNewKey) if (hNewKey)
RegCloseKey(hNewKey); RegCloseKey(hNewKey);