FallenSoul
|
|
« : 12-04-2008 12:02 » |
|
Доброе время суток. Принялся за решение задачи получения хендла ключа, имя которого выбрано на данный момент в дереве. Всё ок, только возникла проблема в своевременности реакции. Описываю процесс: Раскрываем один из ключей(например HKEY_USER). Кликаем на ключ .DEFAULT и не имеем никакой визуальной реакции, хотя уже сейчас мне хотелось бы иметь хендл этого ключа. При повторном клике на какую-либо строку из дерева с именем главного ключа или подключа, уже появляется окно с выбранным до этого ключа(в нашем случае .DEFAULT) и т.д. при нажатие на следующую строку. в общем реакция запаздывания Вот код : case WM_NOTIFY: switch (((LPNMHDR)lParam)->code) { case NM_CLICK: { if(((LPNMHDR)lParam)->idFrom == IDC_TREEVIEW) { tvTempItem.hItem=TreeView_GetSelection(m_MyHandles.hTreeView); tvTempItem.mask=TVIF_TEXT; tvTempItem.cchTextMax=256; tvTempItem.pszText=SelectedTVIName; TreeView_GetItem(m_MyHandles.hTreeView, &tvTempItem); // SelectedTVIName - буфер с именем ключа Get_KeyHandle(SelectedTVIName); } break; }
void Get_KeyHandle(char*KeyName) { HKEY Temp=NULL; for(int i=0,u=0;i<6 && !u;i++) { RegOpenKeyEx(hTopKeys[i],KeyName,NULL,KEY_ALL_ACCESS,&Temp); if(Temp!=NULL) { MessageBox(NULL,KeyName,KeyName,0); u=1; } } }
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #1 : 12-04-2008 12:15 » |
|
хм, больше похоже на поведение вроде WM_KILLFOCUS для элемента
|
|
|
Записан
|
|
|
|
FallenSoul
|
|
« Ответ #2 : 12-04-2008 18:06 » |
|
Дело в том, что данные выбранного ключа мне надо отображать в правом ListView. Need help Вплоть до функции RegOpenKeyEx окно выскакивает при первом же событии(клике), но сразу после него окно выскакивает только в при след. наступлении Использование LONG WINAPI RegOpenKey( __in HKEY hKey, __in_opt LPCTSTR lpSubKey, __out PHKEY phkResult );
не сказалось на работе приложения
|
|
« Последнее редактирование: 12-04-2008 18:19 от FallenSoul »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #3 : 12-04-2008 18:20 » |
|
а может не перерисовывается просто ? Отправь окну WM_PAINT
|
|
|
Записан
|
|
|
|
FallenSoul
|
|
« Ответ #4 : 12-04-2008 18:26 » |
|
а может не перерисовывается просто ? Отправь окну WM_PAINT
void Get_KeyHandle(char*KeyName,HWND hWnd) { HKEY Temp=NULL; for(int i=0,u=0;i<6 && !u;i++) { if(RegOpenKey(hTopKeys[i],KeyName,&Temp)==ERROR_SUCCESS) { if(Temp!=NULL) { MessageBox(NULL,KeyName,KeyName,0); SendMessage(hWnd,WM_PAINT,NULL,NULL); u=1; } RegCloseKey(Temp); } } }
Я правильно понял? не работает
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #5 : 12-04-2008 18:31 » |
|
FallenSoul, нет, не правильно (хотя порядок выполнения и верный, но лучше так: ) case WM_NOTIFY: switch (((LPNMHDR)lParam)->code) { case NM_CLICK: { if(((LPNMHDR)lParam)->idFrom == IDC_TREEVIEW) { tvTempItem.hItem=TreeView_GetSelection(m_MyHandles.hTreeView); tvTempItem.mask=TVIF_TEXT; tvTempItem.cchTextMax=256; tvTempItem.pszText=SelectedTVIName; TreeView_GetItem(m_MyHandles.hTreeView, &tvTempItem); // SelectedTVIName - буфер с именем ключа Get_KeyHandle(SelectedTVIName);
PostMessage(hWnd,WM_PAINT,NULL,NULL);
} break; }
|
|
|
Записан
|
|
|
|
FallenSoul
|
|
« Ответ #6 : 12-04-2008 18:34 » |
|
Не работает =\
|
|
|
Записан
|
|
|
|
FallenSoul
|
|
« Ответ #7 : 12-04-2008 18:39 » |
|
[code]Выяснилось что задержка появляется ещё до функции Get_KeyHandle с получением имени в переменную SelectedTVIName на этом этапе
[code] tvTempItem.hItem=TreeView_GetSelection(m_MyHandles.hTreeView); tvTempItem.mask=TVIF_TEXT; tvTempItem.cchTextMax=256; tvTempItem.pszText=SelectedTVIName; TreeView_GetItem(m_MyHandles.hTreeView, &tvTempItem);
2 При первом клике выдаёт FALSE if(TreeView_GetItem(m_MyHandles.hTreeView, &tvTempItem)==TRUE) MessageBox(NULL,"TRUE","TRUE",0); [/code][/code]
|
|
« Последнее редактирование: 12-04-2008 18:54 от FallenSoul »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #8 : 12-04-2008 18:54 » |
|
FallenSoul, а что у тебя со скобками блоков ? У тебя case WM_NOTIFY: switch (((LPNMHDR)lParam)->code) { case NM_CLICK: { if(((LPNMHDR)lParam)->idFrom == IDC_TREEVIEW) { ... } break; }
а для свича где парная скобка ? ------------------- не понимаю, что значит - задержка ? Ты ждёшь, а через 10 секунд - оно вдруг появляется ? Или не появится ?
|
|
|
Записан
|
|
|
|
FallenSoul
|
|
« Ответ #9 : 12-04-2008 18:56 » |
|
Задержка, это значит что только при повторном клике на той же строке дерева или уже на другой выдаётся окно с именем предыдущей записи switch(uMsg) { case WM_NOTIFY: switch (((LPNMHDR)lParam)->code) { case NM_CUSTOMDRAW: { if(((LPNMHDR)lParam)->idFrom == IDC_TREEVIEW) { if(rTree1.right<rMainClient1.right/2) {
} else {
} } break; } case NM_CLICK: { if(((LPNMHDR)lParam)->idFrom == IDC_TREEVIEW) {
} break; }
case TTN_NEEDTEXT: {
} }
default: return DefWindowProc(hWnd,uMsg,wParam,lParam); }
|
|
« Последнее редактирование: 12-04-2008 18:58 от FallenSoul »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #10 : 12-04-2008 18:56 » |
|
FallenSoul, блин, извини меня, я ступил
PostMessage(hWnd,WM_PAINT,NULL,NULL);
- надо не hWnd, конечно же, а хендл твоего ListView
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #11 : 12-04-2008 18:57 » |
|
FallenSoul, это не задержка, а отсутствие синхронизации называется
|
|
|
Записан
|
|
|
|
FallenSoul
|
|
« Ответ #12 : 12-04-2008 19:00 » |
|
FallenSoul, блин, извини меня, я ступил
PostMessage(hWnd,WM_PAINT,NULL,NULL);
- надо не hWnd, конечно же, а хендл твоего ListView
Да вопрос уже несколько в другом. case NM_CLICK: { if(((LPNMHDR)lParam)->idFrom == IDC_TREEVIEW) { tvTempItem.hItem=TreeView_GetSelection(m_MyHandles.hTreeView); tvTempItem.mask=TVIF_TEXT; tvTempItem.cchTextMax=256; tvTempItem.pszText=SelectedTVIName; if(TreeView_GetItem(m_MyHandles.hTreeView, &tvTempItem)==TRUE) MessageBox(NULL,"TRUE","TRUE",0); // SelectedTVIName MessageBox(NULL,SelectedTVIName,SelectedTVIName,0); Get_KeyHandle(SelectedTVIName); // PostMessage(hWnd,WM_PAINT,NULL,NULL); } break; }
При первом клике на записи окно TRUE-TRUE не выдаётся, т.е. TreeView_GetItem в первый раз возвращает FALSE
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #13 : 12-04-2008 19:07 » |
|
у тебя tvTempItem - глобальная переменная ?
|
|
|
Записан
|
|
|
|
FallenSoul
|
|
« Ответ #14 : 12-04-2008 19:10 » |
|
Да
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #15 : 12-04-2008 19:14 » |
|
FallenSoul, покажи содержимое переменной до и после самого ПЕРВОГО вызова if(TreeView_GetItem(m_MyHandles.hTreeView, &tvTempItem)==TRUE) -------------------- о, кстати и ещё Pointer to a TVITEM structure that specifies the information to retrieve and receives information about the item. With version 4.71 and later, you can use a TVITEMEX structure instead.
|
|
|
Записан
|
|
|
|
FallenSoul
|
|
« Ответ #16 : 12-04-2008 19:22 » |
|
TVITEMEX tvTempItem; не помогло Как посмотреть значение переменной во время работы программы (Debug если я правильно понял) не знаю
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #17 : 12-04-2008 19:31 » |
|
проект в режиме дебага.
на нужной строчке поставь точку останова (F9) , а потом запусти программу в режиме отладки (F5)
когда остановится - жми alt+3 (если окошка просмотра ещё нет на экране) и пиши туда переменную
|
|
|
Записан
|
|
|
|
FallenSoul
|
|
« Ответ #18 : 12-04-2008 19:35 » |
|
проект в режиме дебага.
Поясни как это сделать
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #19 : 12-04-2008 19:45 » |
|
на баре с кнопками инструментов в студии есть комба для выбора режима проекта , по умолчанию там две позиции: Win32 Debug Win32 Release
|
|
|
Записан
|
|
|
|
FallenSoul
|
|
« Ответ #20 : 12-04-2008 19:52 » |
|
Блин, выставил, нажал F5.
Окно
First-chance exception in Second.exe(NTDLL.DLL): 0xC00000008: Invalid Handle.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #21 : 12-04-2008 20:10 » |
|
хе хе хе...
делай так: когда это окно выскочет, нажми кнопку "повтор" , окажешься коде, где вылез косяк. Если непонятно там, жми alt+7 (появится окно стека вызовов) и смотри, откуда пришли - двигайся по шагам назад, пока не разберёшься, откуда хендл корявый взялся
Если хендл будет (хе хе хе) 0xcccccccc или 0xcdcdcdcd - это не инициализированная переменная значит
в релизе этот хендл скорее всего был ==0
|
|
|
Записан
|
|
|
|
FallenSoul
|
|
« Ответ #22 : 12-04-2008 20:15 » |
|
Фигня какая-то,-ничего не получается.
Глянь если не сложно
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #23 : 12-04-2008 20:32 » |
|
процедура void Fill_ChildKeys(HWND hTreeView,HTREEITEM hItem,TV_INSERTSTRUCT TItemStruct,HKEY hTopKey,DWORD lpcSubKeys) for(int i=0;i<lpcSubKeys;i++) { } RegCloseKey(hChildKey); //тут улетает.
когда у тебя lpcSubKeys==0 , то ты закрываешь hChildKey==0xcccccccc Выводы: 1) переменные надо инициализировать ( не HKEY hChildKey; а HKEY hChildKey=0; ) 2) вообще не нужно вызывать RegCloseKey , если ты не открывал ключ: if(hChildKey) { RegCloseKey(hChildKey); }
|
|
|
Записан
|
|
|
|
FallenSoul
|
|
« Ответ #24 : 12-04-2008 20:43 » |
|
За замечания спс,а значения &tvTempItem- адресс не изменный =\ При первом прогоне переменная hItem структуры tvTempItem инициализируется 0х00000000 и уже только на 2й прогон заполняется значением =\ Другими словами tvTempItem.hItem=TreeView_GetSelection(m_MyHandles.hTreeView); инициализирует нулевым значением =/ 2 tvTempItem.hItem=TreeView_GetNextItem(m_MyHandles.hTreeView,hTempItem,TVGN_CARET); смена функции не помогла
|
|
« Последнее редактирование: 12-04-2008 20:57 от FallenSoul »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #25 : 12-04-2008 20:57 » |
|
ну тогда всё ясно у тебя самый первый вызов tvTempItem.hItem == 0. Потому что TreeView_GetSelection(m_MyHandles.hTreeView)==0; - что следует из названия функции (ведь ничего ещё не выделено). А когда что то было выделено, ты берёшь тот, выделенный, ПРЕДЫДУЩИЙ элемент
|
|
|
Записан
|
|
|
|
FallenSoul
|
|
« Ответ #26 : 12-04-2008 21:09 » |
|
ну тогда всё ясно у тебя самый первый вызов tvTempItem.hItem == 0. Потому что TreeView_GetSelection(m_MyHandles.hTreeView)==0; - что следует из названия функции (ведь ничего ещё не выделено). А когда что то было выделено, ты берёшь тот, выделенный, ПРЕДЫДУЩИЙ элемент Другими словами при первом клике происходит не "выделение" а установка фокуса? Или то что запись "выделена", до ОСи доходит несколько позже и оконная процедура просто не успевает обработать сие? Как это победить?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #27 : 12-04-2008 21:28 » |
|
методом Научного Тыка я определил нужное тебе сообщение, это не NM_CLICK , а 0xfffffe6e. Но символьное название не знаю
зы Алексей1153++, FallenSoul и 15 Гостей смотрят эту тему. ))))))))
|
|
|
Записан
|
|
|
|
FallenSoul
|
|
« Ответ #28 : 12-04-2008 21:43 » |
|
методом Научного Тыка я определил нужное тебе сообщение, это не NM_CLICK , а 0xfffffe6e. Но символьное название не знаю
зы Алексей1153++, FallenSoul и 15 Гостей смотрят эту тему. ))))))))
Это сильно Можно хотя бы в краце узнать как ты его определял, а то перед преподом будет неудобно- обяз. спросит 2Символьное значение есть : TVN_SELCHANGEDA / TVN_SELCHANGED
|
|
« Последнее редактирование: 12-04-2008 21:47 от FallenSoul »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #29 : 12-04-2008 21:53 » |
|
определил как - под отладчиком поставил точку в case WM_NOTIFY: { int iii= (((LPNMHDR)lParam)->code); iii=1; //тут точку останова поставил }
и что прилетало не в тему, то писал себе - это не оно . Когда добился, что некое сообщение появляется только при отпускании левой кнопки с контрола - попробовал это сообщение, оказалось то, что нужно
|
|
|
Записан
|
|
|
|
|