mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 10:04:49 +00:00
1. More merging from WINE regedit; imported refresh feature (which is wayyy slower than Windows regedit; need to optimize this)
2. Using GetVersion() to determine whether to add HKEY_DYN_DATA svn path=/trunk/; revision=18077
This commit is contained in:
parent
2a43a20f74
commit
ad2331b8dc
3 changed files with 206 additions and 36 deletions
|
@ -77,7 +77,7 @@ static void OnEnterMenuLoop(HWND hWnd)
|
||||||
|
|
||||||
/* Update the status bar pane sizes */
|
/* Update the status bar pane sizes */
|
||||||
nParts = -1;
|
nParts = -1;
|
||||||
SendMessage(hStatusBar, SB_SETPARTS, 1, (long)&nParts);
|
SendMessage(hStatusBar, SB_SETPARTS, 1, (LPARAM)&nParts);
|
||||||
bInMenuLoop = TRUE;
|
bInMenuLoop = TRUE;
|
||||||
SendMessage(hStatusBar, SB_SETTEXT, (WPARAM)0, (LPARAM)_T(""));
|
SendMessage(hStatusBar, SB_SETTEXT, (WPARAM)0, (LPARAM)_T(""));
|
||||||
}
|
}
|
||||||
|
@ -454,18 +454,6 @@ static BOOL CopyKeyName(HWND hWnd, LPCTSTR keyName)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL RefreshView(HWND hWnd)
|
|
||||||
{
|
|
||||||
/* TODO:*/
|
|
||||||
MessageBeep(-1);
|
|
||||||
MessageBeep(MB_ICONASTERISK);
|
|
||||||
MessageBeep(MB_ICONEXCLAMATION);
|
|
||||||
MessageBeep(MB_ICONHAND);
|
|
||||||
MessageBeep(MB_ICONQUESTION);
|
|
||||||
MessageBeep(MB_OK);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static BOOL CreateNewValue(HKEY hRootKey, LPCTSTR pszKeyPath, DWORD dwType)
|
static BOOL CreateNewValue(HKEY hRootKey, LPCTSTR pszKeyPath, DWORD dwType)
|
||||||
{
|
{
|
||||||
TCHAR szNewValueFormat[128];
|
TCHAR szNewValueFormat[128];
|
||||||
|
@ -689,7 +677,8 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ID_VIEW_REFRESH:
|
case ID_VIEW_REFRESH:
|
||||||
RefreshView(hWnd);
|
RefreshTreeView(g_pChildWnd->hTreeWnd);
|
||||||
|
/*RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, NULL); */
|
||||||
break;
|
break;
|
||||||
/*case ID_OPTIONS_TOOLBAR:*/
|
/*case ID_OPTIONS_TOOLBAR:*/
|
||||||
/* toggle_child(hWnd, LOWORD(wParam), hToolBar);*/
|
/* toggle_child(hWnd, LOWORD(wParam), hToolBar);*/
|
||||||
|
|
|
@ -37,6 +37,8 @@
|
||||||
#define PM_NEW 1
|
#define PM_NEW 1
|
||||||
#define PM_TREECONTEXT 2
|
#define PM_TREECONTEXT 2
|
||||||
|
|
||||||
|
#define MAX_NEW_KEY_LEN 128
|
||||||
|
|
||||||
extern HINSTANCE hInst;
|
extern HINSTANCE hInst;
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
@ -97,8 +99,11 @@ extern BOOL IsDefaultValue(HWND hwndLV, int i);
|
||||||
|
|
||||||
/* treeview.c */
|
/* treeview.c */
|
||||||
extern HWND CreateTreeView(HWND hwndParent, LPTSTR pHostName, int id);
|
extern HWND CreateTreeView(HWND hwndParent, LPTSTR pHostName, int id);
|
||||||
|
extern BOOL RefreshTreeView(HWND hWndTV);
|
||||||
extern BOOL OnTreeExpanding(HWND hWnd, NMTREEVIEW* pnmtv);
|
extern BOOL OnTreeExpanding(HWND hWnd, NMTREEVIEW* pnmtv);
|
||||||
extern LPCTSTR GetItemPath(HWND hwndTV, HTREEITEM hItem, HKEY* phRootKey);
|
extern LPCTSTR GetItemPath(HWND hwndTV, HTREEITEM hItem, HKEY* phRootKey);
|
||||||
|
extern HTREEITEM InsertNode(HWND hwndTV, HTREEITEM hItem, LPTSTR name);
|
||||||
|
extern HWND StartKeyRename(HWND hwndTV);
|
||||||
extern BOOL CreateNewKey(HWND hwndTV, HTREEITEM hItem);
|
extern BOOL CreateNewKey(HWND hwndTV, HTREEITEM hItem);
|
||||||
|
|
||||||
/* edit.c */
|
/* edit.c */
|
||||||
|
|
|
@ -103,24 +103,196 @@ LPCTSTR GetItemPath(HWND hwndTV, HTREEITEM hItem, HKEY* phRootKey)
|
||||||
return pathBuffer;
|
return pathBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HTREEITEM AddEntryToTree(HWND hwndTV, HTREEITEM hParent, LPTSTR label, HKEY hKey, DWORD dwChildren, HTREEITEM insAfter )
|
/* Add an entry to the tree. Only give hKey for root nodes (HKEY_ constants) */
|
||||||
|
static HTREEITEM AddEntryToTree(HWND hwndTV, HTREEITEM hParent, LPTSTR label, HKEY hKey, DWORD dwChildren)
|
||||||
{
|
{
|
||||||
TVITEM tvi;
|
TVITEM tvi;
|
||||||
TVINSERTSTRUCT tvins;
|
TVINSERTSTRUCT tvins;
|
||||||
|
|
||||||
|
if (hKey) {
|
||||||
|
if (RegQueryInfoKey(hKey, 0, 0, 0, &dwChildren, 0, 0, 0, 0, 0, 0, 0) != ERROR_SUCCESS) {
|
||||||
|
dwChildren = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN | TVIF_PARAM;
|
tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN | TVIF_PARAM;
|
||||||
tvi.pszText = label;
|
tvi.pszText = label;
|
||||||
tvi.cchTextMax = _tcslen(tvi.pszText);
|
tvi.cchTextMax = lstrlen(tvi.pszText);
|
||||||
tvi.iImage = Image_Closed;
|
tvi.iImage = Image_Closed;
|
||||||
tvi.iSelectedImage = Image_Open;
|
tvi.iSelectedImage = Image_Open;
|
||||||
tvi.cChildren = dwChildren;
|
tvi.cChildren = dwChildren;
|
||||||
tvi.lParam = (LPARAM)hKey;
|
tvi.lParam = (LPARAM)hKey;
|
||||||
tvins.u.item = tvi;
|
tvins.u.item = tvi;
|
||||||
tvins.hInsertAfter = insAfter;
|
tvins.hInsertAfter = (HTREEITEM)(hKey ? TVI_LAST : TVI_SORT);
|
||||||
tvins.hParent = hParent;
|
tvins.hParent = hParent;
|
||||||
return TreeView_InsertItem(hwndTV, &tvins);
|
return TreeView_InsertItem(hwndTV, &tvins);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BOOL RefreshTreeItem(HWND hwndTV, HTREEITEM hItem)
|
||||||
|
{
|
||||||
|
HKEY hRoot, hKey, hSubKey;
|
||||||
|
HTREEITEM childItem;
|
||||||
|
LPCTSTR KeyPath;
|
||||||
|
DWORD dwCount, dwIndex, dwMaxSubKeyLen;
|
||||||
|
LPSTR Name;
|
||||||
|
TVITEM tvItem;
|
||||||
|
|
||||||
|
KeyPath = GetItemPath(hwndTV, hItem, &hRoot);
|
||||||
|
|
||||||
|
if (*KeyPath) {
|
||||||
|
if (RegOpenKeyEx(hRoot, KeyPath, 0, KEY_READ, &hKey) != ERROR_SUCCESS) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
hKey = hRoot;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (RegQueryInfoKey(hKey, 0, 0, 0, &dwCount, &dwMaxSubKeyLen, 0, 0, 0, 0, 0, 0) != ERROR_SUCCESS) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the number of children again */
|
||||||
|
tvItem.mask = TVIF_CHILDREN;
|
||||||
|
tvItem.hItem = hItem;
|
||||||
|
tvItem.cChildren = dwCount;
|
||||||
|
if (!TreeView_SetItem(hwndTV, &tvItem)) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* We don't have to bother with the rest if it's not expanded. */
|
||||||
|
if (TreeView_GetItemState(hwndTV, hItem, TVIS_EXPANDED) == 0) {
|
||||||
|
RegCloseKey(hKey);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
dwMaxSubKeyLen++; /* account for the \0 terminator */
|
||||||
|
if (!(Name = HeapAlloc(GetProcessHeap(), 0, dwMaxSubKeyLen * sizeof(TCHAR)))) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
tvItem.cchTextMax = dwMaxSubKeyLen;
|
||||||
|
if (!(tvItem.pszText = HeapAlloc(GetProcessHeap(), 0, dwMaxSubKeyLen * sizeof(TCHAR)))) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now go through all the children in the registry, and check if any have to be added. */
|
||||||
|
for (dwIndex = 0; dwIndex < dwCount; dwIndex++) {
|
||||||
|
DWORD cName = dwMaxSubKeyLen, dwSubCount;
|
||||||
|
BOOL found;
|
||||||
|
|
||||||
|
found = FALSE;
|
||||||
|
if (RegEnumKeyEx(hKey, dwIndex, Name, &cName, 0, 0, 0, NULL) != ERROR_SUCCESS) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Find the number of children of the node. */
|
||||||
|
dwSubCount = 0;
|
||||||
|
if (RegOpenKeyEx(hKey, Name, 0, KEY_QUERY_VALUE, &hSubKey) == ERROR_SUCCESS) {
|
||||||
|
if (RegQueryInfoKey(hSubKey, 0, 0, 0, &dwSubCount, 0, 0, 0, 0, 0, 0, 0) != ERROR_SUCCESS) {
|
||||||
|
dwSubCount = 0;
|
||||||
|
}
|
||||||
|
RegCloseKey(hSubKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if the node is already in there. */
|
||||||
|
for (childItem = TreeView_GetChild(hwndTV, hItem); childItem;
|
||||||
|
childItem = TreeView_GetNextSibling(hwndTV, childItem)) {
|
||||||
|
tvItem.mask = TVIF_TEXT;
|
||||||
|
tvItem.hItem = childItem;
|
||||||
|
if (!TreeView_GetItem(hwndTV, &tvItem)) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strcmp(tvItem.pszText, Name)) {
|
||||||
|
found = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (found == FALSE) {
|
||||||
|
AddEntryToTree(hwndTV, hItem, Name, NULL, dwSubCount);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
HeapFree(GetProcessHeap(), 0, Name);
|
||||||
|
HeapFree(GetProcessHeap(), 0, tvItem.pszText);
|
||||||
|
RegCloseKey(hKey);
|
||||||
|
|
||||||
|
/* Now go through all the children in the tree, and check if any have to be removed. */
|
||||||
|
childItem = TreeView_GetChild(hwndTV, hItem);
|
||||||
|
while (childItem) {
|
||||||
|
HTREEITEM nextItem = TreeView_GetNextSibling(hwndTV, childItem);
|
||||||
|
if (RefreshTreeItem(hwndTV, childItem) == FALSE) {
|
||||||
|
TreeView_DeleteItem(hwndTV, childItem);
|
||||||
|
}
|
||||||
|
childItem = nextItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL RefreshTreeView(HWND hwndTV)
|
||||||
|
{
|
||||||
|
HTREEITEM hItem;
|
||||||
|
HTREEITEM hSelectedItem;
|
||||||
|
HCURSOR hcursorOld;
|
||||||
|
|
||||||
|
hSelectedItem = TreeView_GetSelection(hwndTV);
|
||||||
|
hcursorOld = SetCursor(LoadCursor(NULL, IDC_WAIT));
|
||||||
|
SendMessage(hwndTV, WM_SETREDRAW, FALSE, 0);
|
||||||
|
|
||||||
|
hItem = TreeView_GetChild(hwndTV, TreeView_GetRoot(hwndTV));
|
||||||
|
while (hItem) {
|
||||||
|
RefreshTreeItem(hwndTV, hItem);
|
||||||
|
hItem = TreeView_GetNextSibling(hwndTV, hItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
SendMessage(hwndTV, WM_SETREDRAW, TRUE, 0);
|
||||||
|
SetCursor(hcursorOld);
|
||||||
|
|
||||||
|
/* We reselect the currently selected node, this will prompt a refresh of the listview. */
|
||||||
|
TreeView_SelectItem(hwndTV, hSelectedItem);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
HTREEITEM InsertNode(HWND hwndTV, HTREEITEM hItem, LPTSTR name)
|
||||||
|
{
|
||||||
|
TCHAR buf[MAX_NEW_KEY_LEN];
|
||||||
|
HTREEITEM hNewItem = 0;
|
||||||
|
TVITEMEX item;
|
||||||
|
|
||||||
|
if (!hItem) hItem = TreeView_GetSelection(hwndTV);
|
||||||
|
if (!hItem) return FALSE;
|
||||||
|
if (TreeView_GetItemState(hwndTV, hItem, TVIS_EXPANDEDONCE)) {
|
||||||
|
hNewItem = AddEntryToTree(hwndTV, hItem, name, 0, 0);
|
||||||
|
} else {
|
||||||
|
item.mask = TVIF_CHILDREN | TVIF_HANDLE;
|
||||||
|
item.hItem = hItem;
|
||||||
|
if (!TreeView_GetItem(hwndTV, &item)) return FALSE;
|
||||||
|
item.cChildren = 1;
|
||||||
|
if (!TreeView_SetItem(hwndTV, &item)) return FALSE;
|
||||||
|
}
|
||||||
|
TreeView_Expand(hwndTV, hItem, TVE_EXPAND);
|
||||||
|
if (!hNewItem) {
|
||||||
|
for(hNewItem = TreeView_GetChild(hwndTV, hItem); hNewItem; hNewItem = TreeView_GetNextSibling(hwndTV, hNewItem)) {
|
||||||
|
item.mask = TVIF_HANDLE | TVIF_TEXT;
|
||||||
|
item.hItem = hNewItem;
|
||||||
|
item.pszText = buf;
|
||||||
|
item.cchTextMax = COUNT_OF(buf);
|
||||||
|
if (!TreeView_GetItem(hwndTV, &item)) continue;
|
||||||
|
if (lstrcmp(name, item.pszText) == 0) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (hNewItem) TreeView_SelectItem(hwndTV, hNewItem);
|
||||||
|
|
||||||
|
return hNewItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
HWND StartKeyRename(HWND hwndTV)
|
||||||
|
{
|
||||||
|
HTREEITEM hItem;
|
||||||
|
|
||||||
|
if(!(hItem = TreeView_GetSelection(hwndTV))) return 0;
|
||||||
|
return TreeView_EditLabel(hwndTV, hItem);
|
||||||
|
}
|
||||||
|
|
||||||
static BOOL InitTreeViewItems(HWND hwndTV, LPTSTR pHostName)
|
static BOOL InitTreeViewItems(HWND hwndTV, LPTSTR pHostName)
|
||||||
{
|
{
|
||||||
|
@ -131,7 +303,7 @@ static BOOL InitTreeViewItems(HWND hwndTV, LPTSTR pHostName)
|
||||||
tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN | TVIF_PARAM;
|
tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN | TVIF_PARAM;
|
||||||
/* Set the text of the item. */
|
/* Set the text of the item. */
|
||||||
tvi.pszText = pHostName;
|
tvi.pszText = pHostName;
|
||||||
tvi.cchTextMax = _tcslen(tvi.pszText);
|
tvi.cchTextMax = lstrlen(tvi.pszText);
|
||||||
/* Assume the item is not a parent item, so give it an image. */
|
/* Assume the item is not a parent item, so give it an image. */
|
||||||
tvi.iImage = Image_Root;
|
tvi.iImage = Image_Root;
|
||||||
tvi.iSelectedImage = Image_Root;
|
tvi.iSelectedImage = Image_Root;
|
||||||
|
@ -144,11 +316,17 @@ static BOOL InitTreeViewItems(HWND hwndTV, LPTSTR pHostName)
|
||||||
/* Add the item to the tree view control. */
|
/* Add the item to the tree view control. */
|
||||||
if (!(hRoot = TreeView_InsertItem(hwndTV, &tvins))) return FALSE;
|
if (!(hRoot = TreeView_InsertItem(hwndTV, &tvins))) return FALSE;
|
||||||
|
|
||||||
if (!AddEntryToTree(hwndTV, hRoot, _T("HKEY_CLASSES_ROOT"), HKEY_CLASSES_ROOT, 1, TVI_LAST)) return FALSE;
|
if (!AddEntryToTree(hwndTV, hRoot, _T("HKEY_CLASSES_ROOT"), HKEY_CLASSES_ROOT, 1)) return FALSE;
|
||||||
if (!AddEntryToTree(hwndTV, hRoot, _T("HKEY_CURRENT_USER"), HKEY_CURRENT_USER, 1, TVI_LAST)) return FALSE;
|
if (!AddEntryToTree(hwndTV, hRoot, _T("HKEY_CURRENT_USER"), HKEY_CURRENT_USER, 1)) return FALSE;
|
||||||
if (!AddEntryToTree(hwndTV, hRoot, _T("HKEY_LOCAL_MACHINE"), HKEY_LOCAL_MACHINE, 1, TVI_LAST)) return FALSE;
|
if (!AddEntryToTree(hwndTV, hRoot, _T("HKEY_LOCAL_MACHINE"), HKEY_LOCAL_MACHINE, 1)) return FALSE;
|
||||||
if (!AddEntryToTree(hwndTV, hRoot, _T("HKEY_USERS"), HKEY_USERS, 1, TVI_LAST)) return FALSE;
|
if (!AddEntryToTree(hwndTV, hRoot, _T("HKEY_USERS"), HKEY_USERS, 1)) return FALSE;
|
||||||
if (!AddEntryToTree(hwndTV, hRoot, _T("HKEY_CURRENT_CONFIG"), HKEY_CURRENT_CONFIG, 1, TVI_LAST)) return FALSE;
|
if (!AddEntryToTree(hwndTV, hRoot, _T("HKEY_CURRENT_CONFIG"), HKEY_CURRENT_CONFIG, 1)) return FALSE;
|
||||||
|
|
||||||
|
if (GetVersion() & 0x80000000)
|
||||||
|
{
|
||||||
|
/* Win9x specific key */
|
||||||
|
if (!AddEntryToTree(hwndTV, hRoot, _T("HKEY_DYN_DATA"), HKEY_DYN_DATA, 1)) return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/* expand and select host name */
|
/* expand and select host name */
|
||||||
TreeView_Expand(hwndTV, hRoot, TVE_EXPAND);
|
TreeView_Expand(hwndTV, hRoot, TVE_EXPAND);
|
||||||
|
@ -231,9 +409,8 @@ BOOL OnTreeExpanding(HWND hwndTV, NMTREEVIEW* pnmtv)
|
||||||
|
|
||||||
for (dwIndex = 0; dwIndex < dwCount; dwIndex++) {
|
for (dwIndex = 0; dwIndex < dwCount; dwIndex++) {
|
||||||
DWORD cName = dwMaxSubKeyLen, dwSubCount;
|
DWORD cName = dwMaxSubKeyLen, dwSubCount;
|
||||||
FILETIME LastWriteTime;
|
|
||||||
|
|
||||||
errCode = RegEnumKeyEx(hNewKey, dwIndex, Name, &cName, 0, 0, 0, &LastWriteTime);
|
errCode = RegEnumKeyEx(hNewKey, dwIndex, Name, &cName, 0, 0, 0, 0);
|
||||||
if (errCode != ERROR_SUCCESS) continue;
|
if (errCode != ERROR_SUCCESS) continue;
|
||||||
errCode = RegOpenKeyEx(hNewKey, Name, 0, KEY_QUERY_VALUE, &hKey);
|
errCode = RegOpenKeyEx(hNewKey, Name, 0, KEY_QUERY_VALUE, &hKey);
|
||||||
if (errCode == ERROR_SUCCESS) {
|
if (errCode == ERROR_SUCCESS) {
|
||||||
|
@ -241,8 +418,7 @@ BOOL OnTreeExpanding(HWND hwndTV, NMTREEVIEW* pnmtv)
|
||||||
RegCloseKey(hKey);
|
RegCloseKey(hKey);
|
||||||
}
|
}
|
||||||
if (errCode != ERROR_SUCCESS) dwSubCount = 0;
|
if (errCode != ERROR_SUCCESS) dwSubCount = 0;
|
||||||
/*printf("dwSubCount=%ld, Name=%s\n", dwSubCount, Name);*/
|
AddEntryToTree(hwndTV, pnmtv->itemNew.hItem, Name, NULL, dwSubCount);
|
||||||
AddEntryToTree(hwndTV, pnmtv->itemNew.hItem, Name, NULL, dwSubCount, TVI_FIRST);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SendMessage(hwndTV, TVM_SORTCHILDREN, 0, (LPARAM)pnmtv->itemNew.hItem);
|
SendMessage(hwndTV, TVM_SORTCHILDREN, 0, (LPARAM)pnmtv->itemNew.hItem);
|
||||||
|
@ -292,7 +468,7 @@ BOOL CreateNewKey(HWND hwndTV, HTREEITEM hItem)
|
||||||
}
|
}
|
||||||
while(!hNewKey);
|
while(!hNewKey);
|
||||||
|
|
||||||
hNewItem = AddEntryToTree(hwndTV, hItem, szNewKey, NULL, 0, NULL);
|
hNewItem = AddEntryToTree(hwndTV, hItem, szNewKey, NULL, 0);
|
||||||
if (!hNewItem)
|
if (!hNewItem)
|
||||||
goto done;
|
goto done;
|
||||||
TreeView_EditLabel(hwndTV, hNewItem);
|
TreeView_EditLabel(hwndTV, hNewItem);
|
||||||
|
|
Loading…
Reference in a new issue