Добавление строк в EDIT

Тема в разделе "WASM.BEGINNERS", создана пользователем Sturgeon, 17 июл 2007.

  1. Sturgeon

    Sturgeon New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2006
    Сообщения:
    111
    Здравствуйте все!
    Столкнулся с таким вопросом. Как добавить строку в мультилайновый эдит. Поискав по форуму нашел топик, с точно таким же вопросом. Теорию вроде понял, но с практикой почему то проблемы.
    Суть вопроса: по нажатию на кнопку (впрочем это неважно) добавить к эдиту новую строку. Для этого помещаем курсор (SETSEL) в конец строки эдита, и добавляем (REPLACESEL) новую строку. Не получается поставить курсор в конец строки. Ставится либо в начало строки, либо затирает строку. Скорее всего я что-то путаю в параметрах сообщения SETSEL. Каким образом поместить курсор в конец строки в многострочном эдите?

    Вот пример кода:

    Код (Text):
    1. invoke SendMessage,Edit,EM_SETSEL,0,-1
    2.     invoke SendMessage,Edit,EM_REPLACESEL,0,addr szText2
     
  2. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    вот так это делается в WKTVBDebugger'е
    Код (Text):
    1. AddTextToEdit proc lpText:DWORD
    2. option PROLOGUE:NONE
    3. option EPILOGUE:NONE
    4.     invoke SendDlgItemMessage, g_hDlg, 1001, WM_GETTEXTLENGTH, 0, 0
    5.     invoke SendDlgItemMessage, g_hDlg, 1001, EM_SETSEL, eax, eax
    6.     invoke SendDlgItemMessage, g_hDlg, 1001, EM_REPLACESEL, FALSE, [esp+4]
    7.     ret (sizeof DWORD)
    8. option PROLOGUE:PROLOGUEDEF
    9. option EPILOGUE:EPILOGUEDEF
    10. AddTextToEdit endp
     
  3. Sturgeon

    Sturgeon New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2006
    Сообщения:
    111
    То есть получается, что сначала надо в любом случае получить длину строки?
    Да, работает!
    Еще один вопрос остался. В том же топике упоминается, что для того, чтобы поставить курсор в конец строки, не обязательно использовать GETTEXTLENGTH. А можно просто SETSEL передать с параметром -1. Вот про это я хотел узнать поподробнее. Можно ли такое вообще сделать? Насколько я понял из MSDN, то параметр -1 используется для выделения всей строки, а не последнего символа. Но, может, я неправильно понял.
    В принципе, даже если такое сделать нельзя, то ничего страшного. И такой код хороший, главное, что рабочий. Просто хотелось поподробнее узнать о такой штуке.
     
  4. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    "If the start is 0 and the end is –1, all the text in the edit control is selected."

    т.е. при последующем добавлении весь текст в Edit'е будет заменен добавляемым, если я правильно понимаю :)
     
  5. Sturgeon

    Sturgeon New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2006
    Сообщения:
    111
    Ну, если ты правильно понял, то, тогда и я правильно понял тоже :)
    Просто сомневался в своих способностях к англицкому языку, и, вроде, раз было такое мнение, то почему бы и не спросить у старших товарищей.
    Спасибо за объяснение!
     
  6. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    ставить в конец попробуй setsel -1,-1, если я не ошибаюсь
     
  7. Sturgeon

    Sturgeon New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2006
    Сообщения:
    111
    Пробовал по-всякому.
    У меня работает только с GETTEXTLENGTH.
     
  8. Sturgeon

    Sturgeon New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2006
    Сообщения:
    111
    Пока возился с эдитами, возник еще вопрос.
    Не стал создавать новую тему, потому что вроде как в продолжение этой.
    Столкнулся с тем, что при прозрачном окне пролрутка в эдитбоксе подвешивает всю систему.
    То есть продробнее: Создаю окно с эдитом и другой ботвой (типа исходник для патча). Делаю окно прозрачным с помощью SetLayeredWindowAttributes. В эдит добавляю строки с помощью SETSEL и REPLACESEL. Вроде все получается. Но при выделении курсором текста в эдите и попытке его поскроллить система виснет намертво. При этом, если скроллить текст за ползунки (скроллбар), то все нормально. Проблема 100% в прозрачности окна, так как если ее убрать, то все работает.
    Можно ли избежать таких тормозов?
     
  9. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    См. Проблема с WS_EX_LAYERED
    WS_EX_COMPOSITED
     
  10. Sturgeon

    Sturgeon New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2006
    Сообщения:
    111
    Большое спасибо, kero!
    Тема как раз для моего случая. К своему стыду признаюсь, что я ее не нашел, хотя поиск пинал полдня.
    И еще вопрос, что это за стиль WS_EX_COMPOSITED? MSDN скромно молчит. Гугль выдает десяток ссылок просто на пример использования.
    Блин, совершенно не умею пользовать поиск:dntknw: Пойду застрелюсь...
     
  11. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    google
     
  12. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    ??
    MSDN -> CreateWindowEx, + -> Remarks.

    Вот вам еще одна:
    http://www.geocities.com/xmemor/2lz/printlayered.zip
    Что б самому на лету примеряться и использовать.
     
  13. Sturgeon

    Sturgeon New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2006
    Сообщения:
    111
    Cпасибо!
    MSDN у меня на компе стоит. Покупал в свое время отдельно. Там такого почему-то нет. Может быть старый выпуск.
    А на офсайте действительно все есть =)
     
  14. Veter

    Veter New Member

    Публикаций:
    0
    Регистрация:
    23 дек 2006
    Сообщения:
    161
    С 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 нужно просто поэкспериментировать, чтобы понять как она работает - она можно отправить фокус в начало или конец файла, выделить заданное количество элементов, которые находятся в определенном месте строки и так далее.
     
  15. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    Sturgeon
    Странно, но MSDN знает об этом
    Код (Text):
    1. WS_EX_COMPOSITED
    2. 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.
     
  16. japanoise

    japanoise New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2007
    Сообщения:
    1
    если только добавляешь текст, то можешь ничего не выделять. EM_REPLACESEL если ничего не выделено по умолчанию в место курсора текст пихает