Как в Edit выделить весь текст при установке фокуса ввода?

Тема в разделе "WASM.WIN32", создана пользователем Ni, 4 май 2008.

  1. Ni

    Ni New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2008
    Сообщения:
    12
    Если произвести двойной клик на окне Edit - происходит выделение всего текста в нём. Необходимо реализовать тоже, но при одном клике или переходе по Tab (EN_SETFOCUS).
    Пробовал EM_SETSEL выделения нет. Сообщение SETFOCUS обрабатывается правильно (нужное окно, при нужном действии), проверял, а выделения не происходит.
    Код (Text):
    1. ...
    2. invoke  GetDlgItem,[hWndDlg],ID_TEXT
    3. mov     ebx,eax
    4. invoke  SetFocus, ebx
    5. invoke  SendMessage,ebx,EM_SETSEL,0,-1
    6. ...
    Сразу оговорюсь - главное окно программы из ресурсов (независимое окно).
     
  2. x0man

    x0man New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2008
    Сообщения:
    358
    Код (Text):
    1.               push IDC_EDIT2
    2.               push hDlg
    3.               call GetDlgItem
    4.               mov ebx, eax
    5.               push ebx
    6.               call SetFocus
    7.               push -1
    8.               push 0
    9.               push EM_SETSEL
    10.               push ebx
    11.               call SendMessageA
    У меня всё работает... окно тоже из ресурсов...
    потыкайте в отладчике... мб регистры меняются как то...
     
  3. Ni

    Ni New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2008
    Сообщения:
    12
    x0man
    а с обработчиками событий у тебя как? сначало WM_COMMAND (после проверок - DefWindowProc), потом ID_TEXT (после проверок - DefWindowProc), EN_SETFOCUS (после проверок - DefWindowProc), затем выше приведёный кусок и выход из процедуры окна с обнулением eax?
    На отладчике смотрю всё нормально. Делаю спрятать edit - прячется, а выделение так и не происходит. Кстати на отладке глянул eax после SetFocus не изменяется, можно и не перекидывать регистры. Может быть какие-то заморочьки с FASM. Вообще, код - один к одному.
     
  4. Osen

    Osen Рие

    Публикаций:
    0
    Регистрация:
    5 апр 2008
    Сообщения:
    283
    Адрес:
    Париж
    Ni
    Если код который ты привел в оконной процедуре, то в ней нельзя менять регистр ebx.
     
  5. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
  6. x0man

    x0man New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2008
    Сообщения:
    358
    Ni
    Эм... DefWindowProc - не надо юзать в DlgProc, тобиш в обработчике событий диалога(окна) из ресурсов...
    всё...
     
  7. Ni

    Ni New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2008
    Сообщения:
    12
    x0man
    У меня окно создаётся CreateDialogParam, так же к нему регестрирую класс - фактически главное окно, только без заморочек создания кучи интерфейсных окон вручную. Соответственно и мессадж WM_INITDIALOG у меня не возникает, и если не указывать DefWindowProc - окно даже и не создастся (не отработают стандартные процедуры создания, прорисовки и т.д.) С этим всё впорядке (я грешным делом подумал может после проверки сообщений от edit, DefWindowProc вызывать не с хенделом главонго окна, а непосредственно окна ввода, попорбовал - тоже не помогло). По поводу ebx: смотрел на отладчике после вызова функции SetFocus регистр eax не изменяется, т.е. код может быть и таким:
    Код (Text):
    1. invoke  GetDlgItem,[hWndDlg],ID_TEXT
    2. invoke  SetFocus, eax
    3. invoke  SendMessage, eax,EM_SETSEL,0,-1
    , но нитак, нитак выделения не происходит :dntknw: видимость окна - сробатывает нормально, а именно EM_SETSEL никак не проявляется, какие параметры не ставь, хоть один символ, хоть всю строку.
     
  8. Ni

    Ni New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2008
    Сообщения:
    12
    Долго я тупил... разобрался - попробовал там же изменить шрифт окна - всё получилось (только смотря куда кликнешь - шрифт и выделение прорисовываются частично), соответсвенно надо послылать сообщение перерисовки окна...
     
  9. Osen

    Osen Рие

    Публикаций:
    0
    Регистрация:
    5 апр 2008
    Сообщения:
    283
    Адрес:
    Париж
    Ni
    Нет! На это нельзя пологаться. А то код будет работать только на твоей машине и больше нигде. Если нехватает регистров сделай push X/pop X или pushad/popad в прологе/эпилоге.

    x0man
    В DlgProc не надо, но не факт что у него DlgProc, а не собственная процедура окна построенная на диалоге из ресурсов.

    Ni
    Кидай полный код.

    KeSqueer
    Очень информативно.
     
  10. Ni

    Ni New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2008
    Сообщения:
    12
    Osen
    Про DefWindowProc писал выше. У меня действительно собственная процедура окна, построенного из ресурсов.

    А вот с перерисовкой - проблемы :dntknw: перепробовал несколько методов - не перерисовывает. Пробовал и WM_PAINT, и InvalidateRect, и RedrawWindow - всё как есть. пропробовал обработчик прорисовки включить выключить WM_SETREDRAW. выделение появляется, но ничего в окне больше не шевелится... (больше не перерисовывается).
    Вобщем вопрос остаётся открытым. Если что-то ещё делать с этим окном - и выделение определяется, и, скажем, шрифты меняются, а если только выделение - ничего не выходит. При вводе текста - старый не заменяется, а дописываются новые символы (думаю еслиб было дело только в перерисовке - ввод осуществлялся б с пустой строки)
     
  11. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    енто значит, что фокус там уже стоит
    а вообще лучше
     
  12. Ni

    Ni New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2008
    Сообщения:
    12
    Вот код
     
  13. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Ni
    Используй PostMessage вместо SendMessage и убери SetFocus, фокус уже стоит, ибо не приходило бы сообщение EN_SETFOCUS
     
  14. Ni

    Ni New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2008
    Сообщения:
    12
    KeSqueer
    Респект тебе!!! :)) стоило заменить на PostMessage всё заработало. поясни, плиз на будущее.
    Видимо из-за того, что PostMessage - только ставит в очередь сообщение и тутже возвращается, а SendMessage - посылает сообщение окну и ждёт пока оно выполнится, недавая стандартному обработчику что либо дальше с ним делать.
     
  15. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    SendMessage сразу отправляет сообщение, PostMessage ставит сообщение в очередь и дает окончить работу оконной процедуры. Пусть в эдитбокс пришло сообщение WM_LBUTTONDOWN. По его приходу нам может отправиться EN_SETFOCUS и ставится курсор в точку куда ткнули. Если мы по приходу EN_SETFOCUS поставим выделение, а потом процедура эдитбокса доделает свое дело (поставит курсор в нужное место), то выделение не установится. И мы даже не увидим мерцания, т.к. это все происходит за один проход по WndProc эдитбокса. Если же использовать PostMessage, эдитбокс все свое дело доделает, а потом только поставится выделение.
    Вот как-то вот так вот..