
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.86] |
![]() |
|
![]() |
|
|
Необходимо что бы редактирование элемента ListBoxa проходило по DBL_CLICK, и ввод строки производился в том месте где узвер кликнул по листу!!! Хелп плз!!!!
|
Сообщ.
#2
,
|
|
|
А что не получилось то?
|
![]() |
Сообщ.
#3
,
|
|
Может, автор думает что ListBox позволяет редактировать пункты путем ввода строки?
|
![]() |
Сообщ.
#4
,
|
|
вот пример .вот только с фокусом чёто гоню
![]() ![]() Ну как обычно не претендуб на лучшее решение ![]() ![]() ![]() #include <windows.h> BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK ListBoxProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK EditProc(HWND, UINT, WPARAM, LPARAM); HWND hWnd; HWND hListBox; HWND hEdit; WNDPROC lpOldListBoxProc=NULL; WNDPROC lpOldEditProc=NULL; int nItem=0; enum { ID_LISTBOX =100, ID_EDIT =101 }; int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { MSG msg; if (!InitInstance (hInstance, nCmdShow)) return FALSE; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int) msg.wParam; } BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = NULL; wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = NULL; wcex.lpszClassName = "ELB"; wcex.hIconSm = NULL; RegisterClassEx(&wcex); hWnd = CreateWindow(wcex.lpszClassName, "FRM_EDITLISTBOX", WS_OVERLAPPEDWINDOW, 100, 100, 200, 200, NULL, NULL, hInstance, NULL); if (!hWnd) return FALSE; ::SendMessage(hListBox,LB_ADDSTRING,0,LPARAM("строка1")); ::SendMessage(hListBox,LB_ADDSTRING,0,LPARAM("строка2")); ::SendMessage(hListBox,LB_ADDSTRING,0,LPARAM("строка3")); ::SendMessage(hListBox,LB_ADDSTRING,0,LPARAM("строка4")); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; switch (message) { case WM_CREATE: { hListBox=::CreateWindow("LISTBOX",NULL,WS_CHILD|WS_VISIBLE,0,0,0,0, hWnd,(HMENU)ID_LISTBOX,::GetModuleHandle(NULL),NULL); if(hListBox!=NULL) lpOldListBoxProc=(WNDPROC)(LONG_PTR)::SetWindowLong(hListBox, GWL_WNDPROC,(LONG)(LONG_PTR)&ListBoxProc); break; } case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Parse the menu selections: switch (wmId) { default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_SIZE: { MoveWindow(hListBox,0, 0,LOWORD(lParam),HIWORD(lParam),TRUE); return 0; } case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } LRESULT CALLBACK ListBoxProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_LBUTTONDBLCLK: { int x=LOWORD(lParam); int y=HIWORD(lParam); RECT rcItem; nItem=(int)::SendMessage(hWnd,LB_ITEMFROMPOINT,0,MAKELPARAM(x,y)); ::SendMessage(hWnd,LB_GETITEMRECT,nItem,LPARAM(&rcItem)); char szText[MAX_PATH]; SendMessage(hWnd,LB_GETTEXT,WPARAM(nItem),LPARAM(szText)); hEdit=::CreateWindow("EDIT","",ES_LEFT|WS_VISIBLE|WS_CHILD|LBS_HASSTRINGS,rcItem.left,rcItem.top, rcItem.right-rcItem.left,rcItem.bottom-rcItem.top,hWnd,(HMENU)ID_EDIT, ::GetModuleHandle(NULL),NULL); ::SetWindowText(hEdit,szText); // ::SendMessage(hEdit,WM_SETFOCUS,WPARAM(NULL),0); // SetActiveWindow(hEdit); // ::EnableWindow(hEdit,TRUE); lpOldEditProc=(WNDPROC)(LONG_PTR)::SetWindowLong(hEdit,GWL_WNDPROC,(LONG)(LONG_PTR)&EditProc); } } return ::CallWindowProc(lpOldListBoxProc,hWnd,message,wParam,lParam); } LRESULT CALLBACK EditProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_KILLFOCUS: { char szText[MAX_PATH]; ::SendMessage(hListBox,LB_DELETESTRING,WPARAM(nItem),0); ::GetWindowText(hEdit,szText,MAX_PATH); ::SendMessage(hListBox,LB_INSERTSTRING,WPARAM(nItem),LPARAM(szText)); ::DestroyWindow(hWnd); } } return ::CallWindowProc(lpOldEditProc,hWnd,message,wParam,lParam); } |