Сейчас на форуме: UniSoft, bartolomeo (+6 невидимых)

 eXeL@B —› Программирование —› переместить курсор в Edit control
Посл.ответ Сообщение

Ранг: 1.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 01 августа 2007 01:58
· Личное сообщение · #1

при помощи сообщения SendMessage(hWnd,WM_SETTEXT,0,(LPARAM) mes); записываю текст в контрол.Всё хорошо.Но курсор как был в самом начале текстовой строки так там и остаётся,в результате чего когда я вывожу другой текст то он затирает старый.Неправильно это.А как сделать чтобы новый текст шол за окончанием предыдущего,ну чтобы можно было например отслеживать поступающую инфу в Edit.
Помогите кто может.
Может я чтото со стилем неправильно сделал?
Стиль контрола:
CreateWindow("EDIT",NULL,ES_MULTILINE | WS_HSCROLL | WS_VSCROLL | WS_TABSTOP |
WS_VISIBLE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | WS_CHILD |
WS_BORDER | ES_WANTRETURN ,10,60,570,400,hWnd,0,hInstance,NULL);

Да,небольшая просьба,если дадите ответ то желательно чтобы вы знали что советуете.Перед тем как создать тему я долго и безрезультатно лазил в MSDN.Помогите,проэкт стоит.....




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 01 августа 2007 02:13 · Поправил: multiarc
· Личное сообщение · #2

Можно вот так (Delphi):

len:=GetWindowTextLength(hWnd);
GetMem(buf,len+newlen+1);//+1 потому что надо чтоб в конце нулик остался...
len:=GetWindowText(hWnd,buf,len);
{в buf у нас будет лежать текст из EDIT'а и можно с ним работать как с PAnsiChar (PChar)... В len будет лежать действительная длина строки... а после GetWindowTextLength, как пишут может лежать значение большее, чем действительно}
asm
mov eax,buf
add eax,len
mov buf,eax
end;
lstrcpy(buf,pchar(text_to_add),newlen);
SetWindowText(hWnd,buf);
asm
mov eax,buf
sub eax,len
mov buf,eax
end;
FreeMem(buf);

Вроде должно работать...




Ранг: 120.9 (ветеран), 5thx
Активность: 0.080
Статус: Участник
Programmer and reverser

Создано: 01 августа 2007 02:13
· Личное сообщение · #3

Чтобы переместить курсор в конец текста можно послать окну сообщение WM_CHAR, передав код клавиш Ctrl+END. Но это не поможет. WM_SETTEXT в любом случае заменяет весь текст. Как вариант, прочитать текст из окна, прибавить к нему тот, который нужно добавить и снова WM_SETTEXT. Другого подсказать не могу.

-----
Уважайте других и пишите грамотно.




Ранг: 1.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 01 августа 2007 03:20
· Личное сообщение · #4

Спасиба за ответы.Насколько я понял так как работать с консолью тут неполучится.Что меня напрягает так это то что нужно делать много дополнительных операций,вообще жуть.Постоянно гонять данные межде буфером....В любом случае всем огромное спасиба.



Ранг: 51.0 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 01 августа 2007 03:20
· Личное сообщение · #5


int Len; // длина
char *new_text, *buf;
// пусть hEdit - хэндл эдита
// new_text - текст, который добавляем
Len = strlen(new_text) + GetWindowTextLength(hEdit) + 1;
buf = (char*) malloc(Len);
GetWindowText(hEdit, buf, Len);
strcat(buf, new_text);
SetWindowText(hEdit, buf);
free(buf);




Ранг: 51.0 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 01 августа 2007 03:25
· Личное сообщение · #6

valentyn пишет:
Насколько я понял так как работать с консолью тут неполучится.Что меня напрягает так это то что нужно делать много дополнительных операций,вообще жуть.Постоянно гонять данные межде буфером....


можно оптимизировать предложенные нами варианты и обойтись без GetWindowText, просто храня буфер с текстом окна и при необходимости его realloc'ить. подумай об этом, ведь консольный буфер, про который ты писал, тоже хранится где-то в памяти... это с виду всё так неудобно кажется. а если красиво код вынести в отдельные функции, то не так и страшно.



Ранг: 1.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 01 августа 2007 03:37
· Личное сообщение · #7

Интересная идея,спасиба.Насколько я понял хранить буфер -копию едита и просто дописывать туда текст а потом его выводить стандартными средствами.Прикольно.Спасиба.



Ранг: 51.8 (постоянный), 58thx
Активность: 0.03=0.03
Статус: Участник

Создано: 01 августа 2007 07:29
· Личное сообщение · #8

IMHO, это удобнее всего реализуется посылкой двух сообщений:
1. EM_SETSEL (чтобы снять в EditBox-е всё выделение и поместить курсор в конец строки).
2. EM_REPLACESEL (поскольку нет выделенного текста, то замещающий текст вставится в месте нахождения курсора).



Ранг: 78.3 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 01 августа 2007 14:20 · Поправил: fakit
· Личное сообщение · #9

valentyn пишет:
при помощи сообщения SendMessage(hWnd,WM_SETTEXT,0,(LPARAM) mes);

так в любом случае затирается старое значение и курсор тут непричем.




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 07 декабря 2010 02:20
· Личное сообщение · #10

до Win7 работал код [D7]
Code:
  1.   {Переместим курсор мыши}
  2.   Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE,Pt.X,Pt.Y,0,0);
  3.   {Имитируем нажатие левой кнопки мыши}
  4.   Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN,Pt.X,Pt.Y,0,0);
  5.   {Имитируем отпускание левой кнопки мыши}
  6.   Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP,Pt.X,Pt.Y,0,0);

Чем его в Win7 заменить можно?

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 09 декабря 2010 14:26
· Личное сообщение · #11

SendInput()?

-----
Yann Tiersen best and do not fuck


| Сообщение посчитали полезным: HandMill, Isaev

Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

Создано: 09 декабря 2010 14:58
· Личное сообщение · #12

Isaev, Использую такой подход:

Code:
  1. void AddTextToEditBox(HWND hEditBox, TCHAR* Message)
  2. {
  3.          int ndx = GetWindowTextLength (hEditBox);
  4.          SetFocus (hEditBox);
  5.  
  6.          #ifdef WIN32
  7.                  SendMessage (hEditBox, EM_SETSEL, (WPARAM)ndx, (LPARAM)ndx);
  8.          #else
  9.                  SendMessage (hEditBox, EM_SETSEL, 0, MAKELONG (ndx, ndx));
  10.          #endif
  11.  
  12.          SendMessage (hEditBox, EM_REPLACESEL, 0, (LPARAM) Message);
  13.  
  14.          return;
  15. }


PE_Kill про SendInput не знал. Спасибо!

-----
все багрепорты - в личные сообщения





Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 09 декабря 2010 15:10 · Поправил: Isaev
· Личное сообщение · #13

PE_Kill универсальная вещь, спасибо [а она в семёрке точно есть? что-то нигде про совместимость с ней не нашёл... надо потестить]
HandMill ты по теме ветки, а у меня вопрос не совсем в тему был, мне эмуляция мыши надо

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh



 eXeL@B —› Программирование —› переместить курсор в Edit control
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати