Важная информация
Показано с 1 по 9 из 9

Тема: Можно ли вытащить текст из окна редактирования посимвольно?

  1. #1 Можно ли вытащить текст из окна редактирования посимвольно? 
    Профи Аватар для Сионист
    Регистрация
    21.01.2016
    Адрес
    Галактика Млечный Путь
    Сообщений
    509
    Сказал(а) спасибо
    11
    Поблагодарили 21 раз(а) в 20 сообщениях
    Можно ли вытащить текст из окна редактирования посимвольно?
    Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на си.
    Ответить с цитированием  
     

  2. #2  
    Модератор
    Регистрация
    19.02.2014
    Сообщений
    403
    Сказал(а) спасибо
    108
    Поблагодарили 303 раз(а) в 191 сообщениях
    Записей в блоге
    36
    EM_GETSELTEXT
    UA6527P
    Ответить с цитированием  
     

  3. Пользователь сказал cпасибо:

    >Quiet Snow< (22.03.2017)

  4. #3  
    Профи Аватар для Сионист
    Регистрация
    21.01.2016
    Адрес
    Галактика Млечный Путь
    Сообщений
    509
    Сказал(а) спасибо
    11
    Поблагодарили 21 раз(а) в 20 сообщениях
    Мне надо не выделенный кусок вытащить, а при обработке одного сообщения загнать весь текст в stdщную строку. Текст может быть длинным и при этом его ещё надо преобразовать из UTF16 в UTF32. Если динамически выделять буфера, то их надо целых два: в который скопирую текст GetWindowText, и в который буду преобразовывать. Вот я и хочу вытащить по одному символы, преобразовать их и сложить в std::u32string. Тогда можно обойтись 40-а байтами автоматических переменных + та память, которую расходует std::u32string и её оператор-член +=(char32_t). Динамически ничего выделять не надо.
    Последний раз редактировалось Сионист; 22.03.2017 в 13:50.
    Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на си.
    Ответить с цитированием  
     

  5. #4  
    Модератор
    Регистрация
    19.02.2014
    Сообщений
    403
    Сказал(а) спасибо
    108
    Поблагодарили 303 раз(а) в 191 сообщениях
    Записей в блоге
    36
    Не понял в чем проблема - выделяй по одному символу по EM_SETSEL и копируй через EM_GETSELTEXT.
    UA6527P
    Ответить с цитированием  
     

  6. Пользователь сказал cпасибо:

    >Quiet Snow< (22.03.2017)

  7. #5  
    Профи Аватар для Сионист
    Регистрация
    21.01.2016
    Адрес
    Галактика Млечный Путь
    Сообщений
    509
    Сказал(а) спасибо
    11
    Поблагодарили 21 раз(а) в 20 сообщениях
    А количество символов как то можно узнать?
    Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на си.
    Ответить с цитированием  
     

  8. #6  
    Модератор
    Регистрация
    19.02.2014
    Сообщений
    403
    Сказал(а) спасибо
    108
    Поблагодарили 303 раз(а) в 191 сообщениях
    Записей в блоге
    36
    WM_GETTEXTLENGTH
    UA6527P
    Ответить с цитированием  
     

  9. Пользователь сказал cпасибо:

    >Quiet Snow< (22.03.2017)

  10. #7  
    Профи Аватар для Сионист
    Регистрация
    21.01.2016
    Адрес
    Галактика Млечный Путь
    Сообщений
    509
    Сказал(а) спасибо
    11
    Поблагодарили 21 раз(а) в 20 сообщениях
    Выделяет правильно. Но не получает. Выделен символ "1",
    C++ Code:
    1. SendMessage(Handle, EM_GETSELTEXT, 0, (LPARAM)UTF16);
    , в UTF16 остаётся то же, что там и было (это массив wchar_t, так что в параметр передаётся адрес,
    C++ Code:
    1. *((wchar_t*)((LPARAM)UTF16))='z';
    дало ожидаемый результат).
    Последний раз редактировалось Сионист; 22.03.2017 в 15:26.
    Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на си.
    Ответить с цитированием  
     

  11. #8  
    Модератор
    Регистрация
    19.02.2014
    Сообщений
    403
    Сказал(а) спасибо
    108
    Поблагодарили 303 раз(а) в 191 сообщениях
    Записей в блоге
    36
    По такому огрызку текста ничего не могу сказать.
    UA6527P
    Ответить с цитированием  
     

  12. #9  
    Профи Аватар для Сионист
    Регистрация
    21.01.2016
    Адрес
    Галактика Млечный Путь
    Сообщений
    509
    Сказал(а) спасибо
    11
    Поблагодарили 21 раз(а) в 20 сообщениях
    C++ Code:
    1. static TEdit           NameWindow;
    2. static TEdit           T;
    3.         HINSTANCE       Instance;
    4.         RECT            ClientRectagle;
    5. static HFONT           Font1;
    6. static HFONT           Font2;
    7.         HDC             Context;
    8. static POINT           Interval;
    9.         PAINTSTRUCT     PaintStructure;
    10. static THint           NameHint;
    11.         POINT           NameHintPoint;
    12.         TDirrectory    *Dirrectory;
    13.         TBody          *Body;
    14.         std::wstring    BufferUFT16;
    15.         std::u32string  BufferUFT32;
    16.         size_t          i;
    17.         size_t          iNext;
    18.         size_t          Length;
    19.         wchar_t         UTF16[3]={'\0', '\0', '\0'};
    20.         char32_t        UTF32;
    21. switch (Message)
    22. {
    23.   case WM_CREATE           : Instance=(HINSTANCE) GetWindowLongPtr(Window, GWLP_HINSTANCE);
    24.                              Context=GetDC(Window);
    25.                              SetMapMode(Context, MM_TEXT);
    26.                              Instance=(HINSTANCE) GetWindowLongPtr(Window, GWLP_HINSTANCE);
    27.                              Font1=Create2DFont(Context, L"Times New Roman", 5.0, AttributesNormal);
    28.                              SelectObject(Context, Font1);
    29.                              NameWindow.TextSize=GetTextSize(Context, U"ЙЦ");
    30.                              SetMapMode(Context, MM_HIMETRIC);
    31.                              Font2=Create2DFont(Context, L"Times New Roman", 5.0, AttributesNormal);
    32.                              SelectObject(Context, Font2);
    33.                              Interval.x= 200;
    34.                              Interval.y=-200;
    35.                              LPtoDP(Context, &Interval, 1);
    36.                              LoadString(Instance, IDS_Name, NameHint.Text, 64);
    37.                              NameHint.TextSize=GetTextSize(Context, NameHint.Text);
    38.                              NameHintPoint.x= NameHint.TextSize.cx;
    39.                              NameHintPoint.y=-NameHint.TextSize.cy;
    40.                              LPtoDP(Context, &NameHintPoint, 1);
    41.                              NameWindow.Window=CreateWindow(L"edit", nullptr, WS_CHILD|WS_VISIBLE|WS_BORDER|ES_LEFT, 0, 0, 0, 0, Window,  nullptr, Instance, nullptr);
    42.                              OldEditWindowWindowProcedure=(WNDPROC) SetWindowLongPtr(NameWindow.Window, GWLP_WNDPROC, (LONG_PTR)NameWindowWindowProcedure);
    43.                              T.Window=CreateWindow(L"edit", nullptr, WS_CHILD|WS_VISIBLE|WS_BORDER|ES_LEFT, 0, 0, 0, 0, Window,  nullptr, Instance, nullptr);
    44.                              SendMessage(NameWindow.Window, WM_SETFONT, (WPARAM)Font1, TRUE);
    45.                              NameWindow.Left  =Interval.x;
    46.                              NameWindow.Top   =Interval.y*2+NameHintPoint.y;
    47.                              NameWindow.Height=NameWindow.TextSize.cy+4;
    48.                              ReleaseDC(Window, Context);
    49.                              PostMessage(Window, WM_COMMAND, IDQ_ReReadTree, 0);
    50.   break;
    51.   case WM_SIZE             : GetClientRect(Window, &ClientRectagle);
    52.                              NameWindow.Width=ClientRectagle.right-Interval.x*2;
    53.                              MoveWindow(NameWindow.Window, NameWindow.Left, NameWindow.Top, NameWindow.Width, NameWindow.Height, TRUE);
    54.                              MoveWindow(T.Window, NameWindow.Left, 200, NameWindow.Width, NameWindow.Height, TRUE);
    55.   break;
    56.   case WM_PAINT            : BeginPaint(Window, &PaintStructure);
    57.                              SetMapMode(PaintStructure.hdc, MM_HIMETRIC);
    58.                              GetClientRect(Window, &ClientRectagle);
    59.                              TextOut(PaintStructure.hdc, 200, -200, L"Имя:");
    60.                              EndPaint(Window, &PaintStructure);
    61.   break;
    62.   case WM_DESTROY          : DeleteObject(Font2);
    63.                              DeleteObject(Font1);
    64.   break;
    65.   case WM_COMMAND          : switch (LOWORD(First))
    66.                              {
    67.                               case IDQ_ReReadTree        : Dirrectory=&(Scene.Root.GetCurrentDirrectory());
    68.                                                            Body     =  Dirrectory->GetCurrentBody();
    69.                                                            if (Body==nullptr)
    70.                                                            {
    71.                                                             BufferUFT16=u32stringtowstring(Dirrectory->GetName());
    72.                                                             SetWindowText(NameWindow.Window, BufferUFT16.c_str());
    73.                                                             /*if (Dirrectory!=&(Scene.Root))
    74.                                                             {
    75.                                                              PostMessage (NameWindow.Window, EM_SETREADONLY, TRUE, 0);
    76.                                                             }
    77.                                                             else
    78.                                                             {
    79.                                                              PostMessage (NameWindow.Window, EM_SETREADONLY, FALSE, 0);
    80.                                                             }*/
    81.                                                             EnableWindow(NameWindow.Window, Dirrectory!=&(Scene.Root));
    82.                                                            }
    83.                               break;
    84.                              }
    85.   break;
    86.   case WM_KEYDOWN          : if (((void*)Second)==((void*)NameWindow.Window))
    87.                              {
    88.                               switch (First)
    89.                               {
    90.                                case VK_RETURN : Dirrectory=&(Scene.Root.GetCurrentDirrectory());
    91.                                                 if (Dirrectory!=(&(Scene.Root)))
    92.                                                 {
    93.                                                  Length=SendMessage(NameWindow.Window, WM_GETTEXTLENGTH, 0, 0);
    94.                                                  if (Length>=0)
    95.                                                  {
    96.                                                   BufferUFT32.clear();
    97.                                                   *((wchar_t*)((LPARAM)UTF16))=L'z';
    98.                                                   for (i=0, iNext=1; i<Length; i=iNext, ++iNext)
    99.                                                   {
    100.                                                    SendMessage(NameWindow.Window, EM_SETSEL    , (WPARAM)i, (LPARAM)iNext);
    101.                                                    SendMessage(NameWindow.Window, EM_GETSELTEXT, 0        , (LPARAM)UTF16);
    102.                                                    Utf16ToUtf32(UTF16, UTF32);
    103.                                                    BufferUFT32+=UTF32;
    104.                                                   }
    105.                                                   if (Dirrectory->SetName(BufferUFT32))
    106.                                                   {
    107.                                                    PostMessage(GetParent(Window), WM_COMMAND, IDC_RePaint, 0);
    108.                                                    PostMessage(Window, WM_COMMAND, IDQ_ReReadTree, 0);
    109.                                                   }
    110.                                                  }
    111.                                                 }
    112.                                break;
    113.                               }
    114.                              }
    115.   break;
    116. }
    117. return DefWindowProc(Window, Message, First, Second);
    118. }
    На дебаге видно, что EM_SETSEL работает, а GETSELTEXT - нет. Пробовал многострочность, результат тот же.
    Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на си.
    Ответить с цитированием  
     

Информация о теме
Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 13
    Последнее сообщение: 21.03.2017, 20:22
  2. Ответов: 2
    Последнее сообщение: 21.03.2017, 14:27
  3. вытащить данные из облака
    от strizhanovwew в разделе Софт
    Ответов: 2
    Последнее сообщение: 22.11.2015, 23:24
  4. нужен текст
    от non-ferrous в разделе Turbo Pascal
    Ответов: 1
    Последнее сообщение: 21.02.2014, 20:12
  5. Есть возможность вытащить исходник (спректрум)?
    от stabud в разделе Приставочные игры
    Ответов: 8
    Последнее сообщение: 31.07.2013, 09:18
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •