Здравствуйте все! Столкнулся с таким вопросом. Как добавить строку в мультилайновый эдит. Поискав по форуму нашел топик, с точно таким же вопросом. Теорию вроде понял, но с практикой почему то проблемы. Суть вопроса: по нажатию на кнопку (впрочем это неважно) добавить к эдиту новую строку. Для этого помещаем курсор (SETSEL) в конец строки эдита, и добавляем (REPLACESEL) новую строку. Не получается поставить курсор в конец строки. Ставится либо в начало строки, либо затирает строку. Скорее всего я что-то путаю в параметрах сообщения SETSEL. Каким образом поместить курсор в конец строки в многострочном эдите? Вот пример кода: Код (Text): invoke SendMessage,Edit,EM_SETSEL,0,-1 invoke SendMessage,Edit,EM_REPLACESEL,0,addr szText2
вот так это делается в WKTVBDebugger'е Код (Text): AddTextToEdit proc lpText:DWORD option PROLOGUE:NONE option EPILOGUE:NONE invoke SendDlgItemMessage, g_hDlg, 1001, WM_GETTEXTLENGTH, 0, 0 invoke SendDlgItemMessage, g_hDlg, 1001, EM_SETSEL, eax, eax invoke SendDlgItemMessage, g_hDlg, 1001, EM_REPLACESEL, FALSE, [esp+4] ret (sizeof DWORD) option PROLOGUE:PROLOGUEDEF option EPILOGUE:EPILOGUEDEF AddTextToEdit endp
То есть получается, что сначала надо в любом случае получить длину строки? Да, работает! Еще один вопрос остался. В том же топике упоминается, что для того, чтобы поставить курсор в конец строки, не обязательно использовать GETTEXTLENGTH. А можно просто SETSEL передать с параметром -1. Вот про это я хотел узнать поподробнее. Можно ли такое вообще сделать? Насколько я понял из MSDN, то параметр -1 используется для выделения всей строки, а не последнего символа. Но, может, я неправильно понял. В принципе, даже если такое сделать нельзя, то ничего страшного. И такой код хороший, главное, что рабочий. Просто хотелось поподробнее узнать о такой штуке.
"If the start is 0 and the end is –1, all the text in the edit control is selected." т.е. при последующем добавлении весь текст в Edit'е будет заменен добавляемым, если я правильно понимаю
Ну, если ты правильно понял, то, тогда и я правильно понял тоже Просто сомневался в своих способностях к англицкому языку, и, вроде, раз было такое мнение, то почему бы и не спросить у старших товарищей. Спасибо за объяснение!
Пока возился с эдитами, возник еще вопрос. Не стал создавать новую тему, потому что вроде как в продолжение этой. Столкнулся с тем, что при прозрачном окне пролрутка в эдитбоксе подвешивает всю систему. То есть продробнее: Создаю окно с эдитом и другой ботвой (типа исходник для патча). Делаю окно прозрачным с помощью SetLayeredWindowAttributes. В эдит добавляю строки с помощью SETSEL и REPLACESEL. Вроде все получается. Но при выделении курсором текста в эдите и попытке его поскроллить система виснет намертво. При этом, если скроллить текст за ползунки (скроллбар), то все нормально. Проблема 100% в прозрачности окна, так как если ее убрать, то все работает. Можно ли избежать таких тормозов?
Большое спасибо, kero! Тема как раз для моего случая. К своему стыду признаюсь, что я ее не нашел, хотя поиск пинал полдня. И еще вопрос, что это за стиль WS_EX_COMPOSITED? MSDN скромно молчит. Гугль выдает десяток ссылок просто на пример использования. Блин, совершенно не умею пользовать поиск Пойду застрелюсь...
?? MSDN -> CreateWindowEx, + -> Remarks. Вот вам еще одна: http://www.geocities.com/xmemor/2lz/printlayered.zip Что б самому на лету примеряться и использовать.
Cпасибо! MSDN у меня на компе стоит. Покупал в свое время отдельно. Там такого почему-то нет. Может быть старый выпуск. А на офсайте действительно все есть =)
С Edito`м сплошные проблемы, он системный и на него наложены системные ограничения. Она же многозадачная, куда ей деваться.. С RichEdit`oм попроще - просто нужно указать WS_EX_TRANSPARENT в генеральном стиле, а для главного окна желателно -WS_CLIPCHILDREN. Код: ...... .data TEXT db " abcdefgh",0 .code ..... invoke GetCaretPos,hwndRichEdit invoke SendMessage,hwndRichEdit,EM_REPLACESEL,eax,addr TEXT invoke InvalidateRect,hwndRichEdit,0,TRUE вставляет соответсвующий текст по позиции курсора. Вставлять можно и другими способами, а с SETSEL нужно просто поэкспериментировать, чтобы понять как она работает - она можно отправить фокус в начало или конец файла, выделить заданное количество элементов, которые находятся в определенном месте строки и так далее.
Sturgeon Странно, но MSDN знает об этом Код (Text): WS_EX_COMPOSITED Windows XP: Paints all descendants of a window in bottom-to-top painting order using double-buffering. For more information, see Remarks. This cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.
если только добавляешь текст, то можешь ничего не выделять. EM_REPLACESEL если ничего не выделено по умолчанию в место курсора текст пихает