На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Помогите с ListBoxom , сабж
    Необходимо что бы редактирование элемента ListBoxa проходило по DBL_CLICK, и ввод строки производился в том месте где узвер кликнул по листу!!! Хелп плз!!!!
      А что не получилось то?
        Может, автор думает что ListBox позволяет редактировать пункты путем ввода строки?
          вот пример .вот только с фокусом чёто гоню :wacko: , а так всё норм вроде :yes:
          Ну как обычно не претендуб на лучшее решение :D
          ExpandedWrap disabled
            #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);
            }
          Сообщение отредактировано: ElcnU -
          1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0549 ]   [ 15 queries used ]   [ Generated: 20.05.24, 04:46 GMT ]