Если произвести двойной клик на окне Edit - происходит выделение всего текста в нём. Необходимо реализовать тоже, но при одном клике или переходе по Tab (EN_SETFOCUS). Пробовал EM_SETSEL выделения нет. Сообщение SETFOCUS обрабатывается правильно (нужное окно, при нужном действии), проверял, а выделения не происходит. Код (Text): ... invoke GetDlgItem,[hWndDlg],ID_TEXT mov ebx,eax invoke SetFocus, ebx invoke SendMessage,ebx,EM_SETSEL,0,-1 ... Сразу оговорюсь - главное окно программы из ресурсов (независимое окно).
Код (Text): push IDC_EDIT2 push hDlg call GetDlgItem mov ebx, eax push ebx call SetFocus push -1 push 0 push EM_SETSEL push ebx call SendMessageA У меня всё работает... окно тоже из ресурсов... потыкайте в отладчике... мб регистры меняются как то...
x0man а с обработчиками событий у тебя как? сначало WM_COMMAND (после проверок - DefWindowProc), потом ID_TEXT (после проверок - DefWindowProc), EN_SETFOCUS (после проверок - DefWindowProc), затем выше приведёный кусок и выход из процедуры окна с обнулением eax? На отладчике смотрю всё нормально. Делаю спрятать edit - прячется, а выделение так и не происходит. Кстати на отладке глянул eax после SetFocus не изменяется, можно и не перекидывать регистры. Может быть какие-то заморочьки с FASM. Вообще, код - один к одному.
Ni Эм... DefWindowProc - не надо юзать в DlgProc, тобиш в обработчике событий диалога(окна) из ресурсов... всё...
x0man У меня окно создаётся CreateDialogParam, так же к нему регестрирую класс - фактически главное окно, только без заморочек создания кучи интерфейсных окон вручную. Соответственно и мессадж WM_INITDIALOG у меня не возникает, и если не указывать DefWindowProc - окно даже и не создастся (не отработают стандартные процедуры создания, прорисовки и т.д.) С этим всё впорядке (я грешным делом подумал может после проверки сообщений от edit, DefWindowProc вызывать не с хенделом главонго окна, а непосредственно окна ввода, попорбовал - тоже не помогло). По поводу ebx: смотрел на отладчике после вызова функции SetFocus регистр eax не изменяется, т.е. код может быть и таким: Код (Text): invoke GetDlgItem,[hWndDlg],ID_TEXT invoke SetFocus, eax invoke SendMessage, eax,EM_SETSEL,0,-1 , но нитак, нитак выделения не происходит видимость окна - сробатывает нормально, а именно EM_SETSEL никак не проявляется, какие параметры не ставь, хоть один символ, хоть всю строку.
Долго я тупил... разобрался - попробовал там же изменить шрифт окна - всё получилось (только смотря куда кликнешь - шрифт и выделение прорисовываются частично), соответсвенно надо послылать сообщение перерисовки окна...
Ni Нет! На это нельзя пологаться. А то код будет работать только на твоей машине и больше нигде. Если нехватает регистров сделай push X/pop X или pushad/popad в прологе/эпилоге. x0man В DlgProc не надо, но не факт что у него DlgProc, а не собственная процедура окна построенная на диалоге из ресурсов. Ni Кидай полный код. KeSqueer Очень информативно.
Osen Про DefWindowProc писал выше. У меня действительно собственная процедура окна, построенного из ресурсов. А вот с перерисовкой - проблемы перепробовал несколько методов - не перерисовывает. Пробовал и WM_PAINT, и InvalidateRect, и RedrawWindow - всё как есть. пропробовал обработчик прорисовки включить выключить WM_SETREDRAW. выделение появляется, но ничего в окне больше не шевелится... (больше не перерисовывается). Вобщем вопрос остаётся открытым. Если что-то ещё делать с этим окном - и выделение определяется, и, скажем, шрифты меняются, а если только выделение - ничего не выходит. При вводе текста - старый не заменяется, а дописываются новые символы (думаю еслиб было дело только в перерисовке - ввод осуществлялся б с пустой строки)
Ni Используй PostMessage вместо SendMessage и убери SetFocus, фокус уже стоит, ибо не приходило бы сообщение EN_SETFOCUS
KeSqueer Респект тебе!!! ) стоило заменить на PostMessage всё заработало. поясни, плиз на будущее. Видимо из-за того, что PostMessage - только ставит в очередь сообщение и тутже возвращается, а SendMessage - посылает сообщение окну и ждёт пока оно выполнится, недавая стандартному обработчику что либо дальше с ним делать.
SendMessage сразу отправляет сообщение, PostMessage ставит сообщение в очередь и дает окончить работу оконной процедуры. Пусть в эдитбокс пришло сообщение WM_LBUTTONDOWN. По его приходу нам может отправиться EN_SETFOCUS и ставится курсор в точку куда ткнули. Если мы по приходу EN_SETFOCUS поставим выделение, а потом процедура эдитбокса доделает свое дело (поставит курсор в нужное место), то выделение не установится. И мы даже не увидим мерцания, т.к. это все происходит за один проход по WndProc эдитбокса. Если же использовать PostMessage, эдитбокс все свое дело доделает, а потом только поставится выделение. Вот как-то вот так вот..