Редактирование текста на текстуре ( ?)

Тема в разделе "WASM.BEGINNERS", создана пользователем Veter, 23 дек 2006.

  1. Veter

    Veter New Member

    Публикаций:
    0
    Регистрация:
    23 дек 2006
    Сообщения:
    161
    MASM32
    Подскажите,плиз, начинающему - ставим SetBkMode в Transparent - и преотлично печатаем на Bitmap'e.
    Что происходит дальше ? - Буквы как будто проваливаются из Edita вниз на битмап и редактирование - йок. Похоже, что мы просто запретили эдиту уничтожать фон - и он не может отличить фон от символа после того,как символ напечатан (хотя, если вывести форму за пределы экрана - символы ,которые мы хотели удалить - удаляются вполне нормально).

    Но ведь как-тоже можно - Word и еще парочка редакторов вроде умеют.
    BOOKSHELFS - нет , он для редактирования переключается в какойто другой режим.
    Если нельзя простыми методами - можно-ли установить в программе переключение на режим OPAQUE ? и обратно,разумеется.
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    InvalidateRect восстановит фон.
     
  3. Veter

    Veter New Member

    Публикаций:
    0
    Регистрация:
    23 дек 2006
    Сообщения:
    161
    Спасибо...
    Но я ведь начинающий - т.е. пока еще осваиваю метод copy-paster.
    Правая рука постоянно болит,блин.

    Поставил invoke InvalidateRect, hdc,NULL,TRUE после

    invoke GetStockObject......Null_BRUSH
    ret
    На другое ума не хватает ( надеюсь,что это не навсегда)
    Кое-что заработало,например символы удаляются ,но если попытаться вставить что-то печатает по старой строке,не сдвигая её. Удаление одного символа загружает проц на 70%.

    Появилась идея - создать контрол,который будет печатать символы битмапами - размер их вроде-бы измеряется миллиметрами,а не пикселами - и должен оставаться постоянным при любом разрешении экрана.Или мне это показалось?
     
  4. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Похоже, что Вы вызываете InvalidateRect прямо в обработчике WM_PAINT. Это приводит к повторной отправке сообщения WM_PAINT и т.д. пока очередь не переполнится. Если Вы уже находитесь в обработчике WM_PAINT, то можете сами перерисовывать фон, а на нём текст. По началу, возможно, будет заметно мерцание, но это поправимо.
     
  5. Veter

    Veter New Member

    Публикаций:
    0
    Регистрация:
    23 дек 2006
    Сообщения:
    161
    Не получается...
    Ситуация - эдит печатает на битмапе символ - пытаемся его удалить - не реагирует,не видит его. Но,если после попытки удаления тронуть рамку окна- т.е. оно обновится, символ тут-же удаляется . Как-то надо обновлять некую область после нажатия клавиши.
    Пытался обрабатывать сообщение WM_CHAR. Н е понимаю,что происходит при этом и что нужно делать. Нужно ли как-то получить координаты области ,которую необходимо обновить? Кажется да,но как? И как обновить - ничто не срабатывает.Даже в example Stylе iz MASM32 та же проблема - обратите внимание.И нигде нет конкретного рецепта - только расплывчатые теоретические рекомендации,для начинающего мало полезные.

    Вопрос к экпертам - SetBkMode контролирует свойсво эдита - уничтожать или нет бэкграунд при рисовании символа.У него 2 постоянные - ТRANSPARENT и OPAQUE. Можно ли их как-то переключать по ходу дела? В смысле - читаем,- если надо что-то подредактировать- нажимаем кнопку и редактируем......?? Возможно ли это в принципе ? или надо закрывать файл ,отключать эдит ,включать другой эдит с другим свойством,снова открывать файл(на том же месте ) и так далее ???
     
  6. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Значит, имеем статическую картинку (битмап), а над ней находится стандартный эдит? Где и как Вы вызываете SetBkMode? Может проще сделать эдит полупрозрачным: при создании эдита нужно указать стиль WS_EX_LAYERED, потом задаём прозрачность SetLayeredWindowAttributes(hEdit, 0, 128, LWA_ALPHA);
    128 - это примерно 50% прозрачность.
     
  7. Veter

    Veter New Member

    Публикаций:
    0
    Регистрация:
    23 дек 2006
    Сообщения:
    161
    Спасибо,попробую.
    У меня так : произносим соответствующие заклинания по поводу создания окна, застилаем битмапом, создаем эдит и после
    mov...
    invoke.... hwndedite ...

    обрабатываем :

    .ELSEIF uMsg==WM_CTLCOLOREDIT

    invoke SetBkMode,wParam,TRANSPARENT ;;;;;OPAQUE
    invoke SetTextColor,wParam,0202020h
    ;;;;;;;;invoke SetBkColor,wParam,0CCCCCCh
    invoke GetStockObject,NULL_BRUSH

    ret
    __________

    Вот и все ... В данном случае цвет бэкраунда эдита не нужен,но если сделать цвет Objeckt'a не ноль , можно менять его цвет ...
    Можно все сделать прозрачным и главное окно тоже .
    Но , с редактированием кранты ...Не хочет по нормальному,в интерактивном режиме.
     
  8. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    В таком случае InvalidateRect нужно вызывать в ответ на EN_UPDATE.
     
  9. kero

    kero Модератор SOURCES & 2LZ

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

    >Правая рука постоянно болит,блин

    :)

    Возможно, это поможет:

    http://rsdn.ru/File/42164/ws_ex_composited.zip

    http://rsdn.ru/File/42164/ws_ex_transparent.zip


    Quantum

    >Может проще сделать эдит полупрозрачным: при создании эдита нужно указать стиль WS_EX_LAYERED, потом задаём прозрачность SetLayeredWindowAttributes(hEdit, 0, 128, LWA_ALPHA);
    128 - это примерно 50% прозрачность.

    Даже MSDN знает, что эдит - это child, а WS_EX_LAYERED - только для top-level :)
     
  10. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    kero
    "A window that has no parent, or whose parent is the desktop window, is called a top-level window." (c) msdn
    Для использования стиля WS_EX_LAYERED достаточно не указывать WS_CHILD. Таким образом, данный стиль вполне применим для "owned windows". Так что достаточно задать стиль WS_POPUP и эдит можно сделать слоёным. Зато прозрачность плохо совместима со стилями вроде CS_PARENTDC, а эдит имеет именно этот стиль, так что родительское окно тоже нужно делать слоёным.
     
  11. Veter

    Veter New Member

    Публикаций:
    0
    Регистрация:
    23 дек 2006
    Сообщения:
    161
    Спасибо ,уважаемые, за помощь. Но дело пока стоит - зря я наверное в качестве первой учебной программы решил создать текстовый редактор,который должен заменить штатный Ms WORD.
    Посто обидно ,что нет нормальной читалки - все не такие какие-то.
    http://eddyv.narod.ru/ProE.rar - вот заготовка.
    Если-бы удалось решить проблему с редактированием , останется совсем немного - научиться вставлять символы, картинки всякие и как-то надо еще разбивать файл на страницы. Получается 4 эдита - левая страница,правая, и два - для номеров страниц и похоже, их все надо суббклассировать ...
    А как передать фокус с одного эдита на другой ,когда кончается страница? А как ... короче всё в тумане...
     
  12. kero

    kero Модератор SOURCES & 2LZ

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

    Чтобы не разводить здесь оффтоп - продолжаю в новой ветке:
    http://www.wasm.ru/forum/viewtopic.php?id=18039
     
  13. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Veter
    Угу, только сабклассингом, AFAIK.