Опытный
 
Профиль
Группа: Участник
Сообщений: 272
Регистрация: 10.6.2006
Где: Москва
Репутация: 4 Всего: 5
|
Есть обычное OVERLAPPED окно. В нем есть TreeView, созданный со стилем TVS_EDITLABELS. Добавляю туда item. Хочу его отредактровать. Щелкаю два раза мышкой на нем. Все нормально: появилась рамка, каретка приехала, куда надо, текст выделился. Вот только собственно отредактировать текст не получается. Не работают символьные (или как они называются) клавиши. Стрелки работают: каретка двигается. Работает, слава Богу, и Del. А вот буквы, цифры, пробелы вставлять, а также использовать Backspace не получается (ничего не происходит). Редактирование заканчивается по Enter, как и должно быть. Никаких TVN_KEYDOWN я не обрабатываю. | Код | #include <windows.h> #include <tchar.h> #include <commctrl.h>
#pragma comment (lib, "ComCtl32.Lib")
int APIENTRY _tWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR szCmdLine, int CmdShow); LRESULT CALLBACK WndProc (HWND hWnd, UINT MessageCode, WPARAM wParam, LPARAM lParam);
int APIENTRY _tWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR szCmdLine, int CmdShow) { const LPTSTR szWindowClass = _TEXT("Label Editing in TreeView"); const LPTSTR szCaption = _TEXT("Label Edititing in TreeView"); INITCOMMONCONTROLSEX InitComCtl; InitComCtl.dwSize = sizeof InitComCtl; InitComCtl.dwICC = ICC_TREEVIEW_CLASSES; InitCommonControlsEx (&InitComCtl);
WNDCLASS WndClass; WndClass.cbClsExtra = 0; WndClass.cbWndExtra = 0; WndClass.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_WINDOW+1); WndClass.hCursor = LoadCursor (0, IDC_ARROW); WndClass.hIcon = LoadIcon (0, IDI_APPLICATION); WndClass.hInstance = hInstance; WndClass.lpfnWndProc = reinterpret_cast<WNDPROC>(WndProc); WndClass.lpszClassName = szWindowClass; WndClass.lpszMenuName = 0; WndClass.style = 0;
RegisterClass (&WndClass);
HWND hWnd = CreateWindow ( szWindowClass, szCaption, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0, 0, 0, 0);
ShowWindow (hWnd, CmdShow); UpdateWindow (hWnd);
MSG MessageStruct; while (int a = GetMessage (&MessageStruct, 0, 0, 0)) { if (a == -1) return -1; DispatchMessage (&MessageStruct); }
return static_cast<int>(MessageStruct.wParam); }
LRESULT CALLBACK WndProc (HWND hWnd, UINT MessageCode, WPARAM wParam, LPARAM lParam) { static HWND hTreeView; switch (MessageCode) { case WM_CREATE: { RECT ClientRect; GetClientRect (hWnd, &ClientRect); hTreeView = CreateWindow ( WC_TREEVIEW, 0, WS_CHILD | WS_VISIBLE | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_EDITLABELS, 0, 0, ClientRect.right, ClientRect.bottom, hWnd, 0, 0, 0);
TVINSERTSTRUCT InsertStruct; InsertStruct.hInsertAfter = TVI_ROOT; InsertStruct.hParent = TVI_ROOT; InsertStruct.item.mask = TVIF_TEXT; InsertStruct.item.pszText = _TEXT("ROOT"); TreeView_InsertItem (hTreeView, &InsertStruct);
return 0; } case WM_NOTIFY: { LPNMHDR pHeader = reinterpret_cast<LPNMHDR>(lParam); if (pHeader->hwndFrom == hTreeView && pHeader->code == TVN_ENDLABELEDIT) { return TRUE; } break; } case WM_DESTROY:
PostQuitMessage (0); return 0; } return DefWindowProc (hWnd, MessageCode, wParam, lParam); }
|
Может, какой нибудь стиль нужно добавить или сообщение обработать? Добавлено @ 17:23 А в диалоговом окне все пашет отлично! | Код | #include <windows.h> #include <tchar.h> #include <commctrl.h> #include "resource.h"
#pragma comment (lib, "ComCtl32.Lib")
int APIENTRY _tWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR szCmdLine, int CmdShow); LRESULT CALLBACK WndProc (HWND hWnd, UINT MessageCode, WPARAM wParam, LPARAM lParam);
int APIENTRY _tWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR szCmdLine, int CmdShow) { INITCOMMONCONTROLSEX InitComCtl; InitComCtl.dwSize = sizeof InitComCtl; InitComCtl.dwICC = ICC_TREEVIEW_CLASSES; InitCommonControlsEx (&InitComCtl);
return static_cast<int>(DialogBox (hInstance, MAKEINTRESOURCE(IDD_DIALOG1), 0, reinterpret_cast<DLGPROC>(WndProc))); }
LRESULT CALLBACK WndProc (HWND hWnd, UINT MessageCode, WPARAM wParam, LPARAM lParam) { static HWND hTreeView; switch (MessageCode) { case WM_INITDIALOG: { RECT ClientRect; GetClientRect (hWnd, &ClientRect); hTreeView = CreateWindow ( WC_TREEVIEW, 0, WS_CHILD | WS_VISIBLE | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_EDITLABELS, 0, 0, ClientRect.right, ClientRect.bottom, hWnd, 0, 0, 0);
TVINSERTSTRUCT InsertStruct; InsertStruct.hInsertAfter = TVI_ROOT; InsertStruct.hParent = TVI_ROOT; InsertStruct.item.mask = TVIF_TEXT; InsertStruct.item.pszText = _TEXT("ROOT"); TreeView_InsertItem (hTreeView, &InsertStruct);
return TRUE; } case WM_NOTIFY: { LPNMHDR pHeader = reinterpret_cast<LPNMHDR>(lParam); if (pHeader->hwndFrom == hTreeView && pHeader->code == TVN_ENDLABELEDIT) { return TRUE; } return FALSE; } case WM_CLOSE:
DestroyWindow (hWnd); return TRUE;
case WM_DESTROY:
EndDialog (hWnd, 0); return TRUE; } return FALSE; }
|
|