Форум » GUI » ? DRAW TEXT IN WINDOW » Ответить

? DRAW TEXT IN WINDOW

SADSTAR2: решил попользоваться командой DRAW TEXT IN WINDOW <WindowName> AT <nRow>,<nCol> VALUE <cString> [ FONT <cFontname> SIZE <nFontsize > ] [ BOLD ] [ ITALIC ] [ UNDERLINE ] [ STRIKEOUT ] [ TRANSPARENT ] формирует текст правильно. проблемы появляются когда сдвигом другого окна закрываешь-открываешь этот текст. Не с первого раза а гдето на пятый-десятый раз. Аналогично если задвигаешь окно с тестом за границу экрана и возвращаешь наместо. неправильно прорисовываются рамки, заголовки, сам текст отрывается от своего окна и висит в углу рабочего стола. Аналогично если менять мышкой размеры окна с обрезанием-восстановлением текста. Проверял на двух разных компах. При сворачивании и восстановлении всего окна такого эффекта добиться не удалось. Думаю проблема возникает при восстановлении изображения части окна, ранее скрытого другим окном или обрезанного краями окна или экрана. Смутно припоминил что когда-то давно пользовался подобными графическими примитивами в VB(?). И там приходилось отдельно описывать процедуру восстановления окна т.к. иначе графические примитивы не восстанавливались. Здесь же попытка прописать повтор текста в ON RESTORE проблему не решила. Да и другие подобные графический примитив DRAW LINE IN WINDOW и DRAW ROUNDRECTANGLE IN WINDOW таких проблем не вызывает. Думаю что экспертам по ядру миниГУИ полезно было бы поискать причины такого поведения системы.

Ответов - 5

SADSTAR2: демонстрация косяков файл Japan.sfx.exe Размер: 463.21 Кб, лежит здесь http://dump.ru/file_catalog/980948 пароль "Japan2" После загрузки программы нарисовано пустое поле. Правую границу можно двигать как угодно сколько угодно раз. После <Restore> поле заполнено текстом командами DRAW TEXT IN WINDOW. Надвигая правую границу на текст и возвращая назад несколько раз - получаем косяк. Еще более жестокую ситуацию получаем спуская окно вниз за границу рабочего стола и возвращая назад в полную видимоостью Маэстро, нужно что-то делать.

gfilatov: SADSTAR2 пишет: нужно что-то делать Рекомендую использовать эту команду для полноэкранных приложений либо для окон, у которых нельзя изменять размер (NOSIZE). Также можно попробовать поместить эту команду в процедуру при обработке события PAINT: Erase Window Form_1 Draw Text In Window Form_1 ...

SADSTAR2: gfilatov пишет: Также можно попробовать поместить эту команду в процедуру при обработке события PAINT: Erase Window Form_1 Draw Text In Window Form_1 ... Попробовал - еще хуже получилось - вообще не выходит из режима начальной прорисовки окна. "Все пишет да стирает, пишет да стирает" И, думаю, вот почему. в файле exdiff.txt есть такая фраза >DRAW TEXT IN WINDOW <form> - label which updated ON PAINT event Толком не пойму что это значит, но похоже, что эти команды система миниГУИ автоматом прописывает в OnPaint. В том числе и DRAW LINE. Но косячит при восстановлении окна только DRAW TEXT. И чем больше текста - тем раньше и круче. Т.е. идея хорошая, но реализация сильно ограничила способы использования. Посмотрел все примеры, где есть эта команда. Действительно. Полноэкранные программы, особенно те(!), которые не позволяют переключаться на другие программы, этим косяком не страдают. Например- ваша FillBlue. И хотя там не много текста - все два коротких блока - но ошибка в написании функции TextPaint(), которая вызывается при OnPaint, ускоряет процесс наступления косяка. Ошибка в отсутствии стирания ERASE [ IN ] WINDOW , что при каждом событии OnPaint добавляет в "память окна" по два блока текста которые визуально накладываются друг на друга и незаметны. С другой стороны добавка Erase Window Form_1 перед командами DRAW TEXT только ухудшила дело - программа не выходит из режима начальной прорисовки экрана. Так что ошибка была правильной! Всетаки надо бы посмотреть реализацию этой штуки подробно.


gustow: Извиняюсь за флейм... но "Ошибка была правильной!" - это ЗВУЧИТ :))

Петр: SADSTAR2 пишет: Толком не пойму что это значит, но похоже, что эти команды система миниГУИ автоматом прописывает в OnPaint. В том числе и DRAW LINE. Так и есть, смотрите h_draw.prg и h_events.prg обработка WM_PAINT. Есть еще в миниГУИ над чем поработать



полная версия страницы