Во-первых, в мануале написано, что прозрачный цвет установить можно указав значение "-1", но при указании значения "&h000000" или "BGR(0,0,0)" тоже получаем прозрачность для текста или фона и лишь указав "&h000001" - получаем чёрный цвет... Во-вторых, при минимизировании и последуюющем развертывании окна - никакой отрисовки уже видно не будет, а также, этот же эффект наблюдается при расскоментировании строки "WindowColor(hwnd,&hd7d7d7)", но уже при запуске приложения. Полагаю, что это как-то связано с посылкой сообщения WM_PAINT в основной функции обработки сообщений от окна. Ну и в третьих - как видишь, на прозрачном фоне отрисовки текста виден основной цвет окна, а не фиолетового прямоугольника...
Ну и скриншот для наглядности:
П.С.: а пожелания и корректирования тоже сюда писать?
почемуто у меня на вин ХР (СП3) ничего не рисует...
Точно на XP не работает, буду смотреть.
Цитата
Во-первых, в мануале написано, что прозрачный цвет установить можно указав значение "-1", но при указании значения "&h000000" или "BGR(0,0,0)" тоже получаем прозрачность для текста или фона и лишь указав "&h000001" - получаем чёрный цвет...
Это я засранец спутал местами параметры в справке (при описании), поэтому скорее всего и путаница произошла, надо поправить:
Хотя пример нормально работает (может только трудно понимаем изначально):
У функции WindowStartDraw есть параметр ALPHA_VALUE , который будет учитываться, если параметр Alpha_FLAG = 1 Параметр ALPHA_VALUE устанавливает цвет фона для прозрачного пикселя. То есть если мы поставим значение например 255 , то все пиксели с цветом 255 отображаться не будут. У функции TextDraw четвертый параметр , установленный в -1 , не рисует фон. Пятый параметр рисует текст нужным цветом . Если мы берем цвет прозрачности у функции WindowStartDraw по умолчанию (0), то рисуя черным цветом (0) по окну , мы ничего не наблюдаем. Именно поэтому в примере ниже я цвет рисования текста поставил 1
Код
#Include "window9.bi" Var hwnd=OpenWindow("",100,100,300,150)
Во-вторых, при минимизировании и последуюющем развертывании окна - никакой отрисовки уже видно не будет, а также, этот же эффект наблюдается при расскоментировании строки "WindowColor(hwnd,&hd7d7d7)", но уже при запуске приложения. Полагаю, что это как-то связано с посылкой сообщения WM_PAINT в основной функции обработки сообщений от окна.
Это так задумано. Обработка рисования идет НЕ в процедуре с вызовами (beginPaint-EndPaint) , а вызывая контекст вручную GetDc... Ведь это не DOS, Windows не сохраняет нарисованное сама при перекрывании окна. Об этом надо заботиться (да что я говорю , думаю ты и сам знаешь). Пример в справке был сделан простой для краткости , но по нормальному я рисую либо (по таймеру\в отдельном потоке) в процедуре, либо в самом цикле сообщений при использовании WindowEvent.
Цитата
П.С.: а пожелания и корректирования тоже сюда писать?
почемуто у меня на вин ХР (СП3) ничего не рисует...
Я исправил этот баг, хотя не знаю надо ли было... Я даже не знаю можно ли это назвать моим багом. Все функции в моих обертках WindowStartDraw и StopDraw не выдали ошибок, отработали правильно. Вся разница в том, что на системах ниже (win7 и может vista) надо для получения контекста рабочего стола использовать GetWindowDC вместо GetDC . Хотя если забить в гугле , то немалое кол-во кодов именно с GetDC для XP. Тут судя по всему все та же черная магия: у одних работает, у других нет.
Я с GDI+ задолбался писать костыли для XP, поскольку прозрачность при работе с изображениями на XP тоже пропитана черной магией. И что главное на одной машине, на одной системе: то выводило с прозрачностью , то нет. После костыликов вроде все нормально .
Меня обускуражило то, что с постоянными обновлениями в течении 10 лет на XP, баги основных графических систем (GDI и GDI+) не устранили. Чем они занимались , похоже показушничали...
В реале делать поддержку для этого динозавра (windows xp) вообще не стоит. Система отстала почти на 3 поколения. С апреля следующего года можно полностью забыть о поддержке мелкософта. Помятуя как это было с win98 , весь народ (в том числе разработчики программ) практически сразу забыли о 98 винде. Не думаю что с XP будет по другому. Немалая часть продаваемой техники не имеет поддержки XP . Драйвера для новых аудио и видеоплат не пишут, а если кто-то и пишет , то скорее только для отписки и гаранти что они будут работать корректно нет никакой... При том я сам столкнулся с этим , используя технику от LENOVO.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
У функции WindowStartDraw есть параметр ALPHA_VALUE...
Ага, да, с этот параметр я както пропустил мимо, теперь стал более понятен смысл отрисовки текста в функции TextDraw.
Цитата (haav)
Это так задумано. Обработка рисования идет НЕ в процедуре с вызовами (beginPaint-EndPaint) , а вызывая контекст вручную GetDc...
Понятно, короче для прозрачных и статических изображений лучше(и проще) использовать связку - Create_ImageA, ImageDrawA, CreateHBitmapFromGpBitmap и SetImageGadget в гаджет с изображением. А WindowStartDraw использовать только для циклической анимации кадров или постояного вывода разных графических данных(графики, диаграммы) в цикле...
Цитата
Я с GDI+ задолбался писать костыли для XP, поскольку прозрачность при работе с изображениями на XP тоже пропитана черной магией...
Ну это понятно, я уже читал гдето, что у GDI очень тормознутый и глючный функционал для отрисовки, особенно с прозрачными окнами... Хотя, это у майкрософта такая тенденция - для написания web'овских и canvas'ных высокоуровневых API у них ручки не из того места растут, а вот для всяких офисов с визуал-бэйсик-макросами у них талант действительно очень развит. Вот, например, ADOBE уже в новых версиях своих програм полностью перешла на QT - видать тоже задолбались бедолаги с глюками GDI.
Цитата
В реале делать поддержку для этого динозавра (windows xp) вообще не стоит. Система отстала почти на 3 поколения. С апреля следующего года можно полностью забыть о поддержке мелкософта.
Да не такой это уже и динозавр - по статистике больше трети компов в мире работают до сих пор на винХР и на семерку их никто переводить не будет, так как железо старое, скорее просто через года 3-4 спишут в утиль... А что касается прекращения техподдержки, то многие на неё "ложили с прибором" - все равно самые критические уязвимости майкрософт так и не исправила за все время существования винХР, так что их вот эта пресловутая техподдержка рядовому пользователю на практике нафиг не нужна... А то, что большинство производителей под новое железо дров на винХР не пишут - это да, это проблема, но решаемая, вот у меня ноут(АСУС) 2011 года выпуска, - все(!!!) дрова для ноута под винХР были быстро найдены и скачаны с сайта производителя - у меня правда видео только одно встроенное(я в игры не играю), но под тот же линукс также до сих пор нет(!!!) официальных дров для автоматического переключения между двумя видяхами на новых ноутах, так что это уже пофигизм производителей...
Сообщение отредактировал ShadEx - Воскресенье, 23.12.2012, 17:42
Понятно, короче для прозрачных и статических изображений лучше(и проще) использовать связку - Create_ImageA, ImageDrawA, CreateHBitmapFromGpBitmap и SetImageGadget в гаджет с изображением. А WindowStartDraw использовать только для циклической анимации кадров или постояного вывода разных графических данных(графики, диаграммы) в цикле...
Ты все правильно понял
Цитата (ShadEx)
все(!!!) дрова для ноута под винХР были быстро найдены и скачаны с сайта производителя
Тебе повезло. Я тоже дрова для Lenovo на оф. сайте нашел быстро, но толку мало. Аудиоустройство вообще хрюша не определяет, а аудиодрайвер при установке ввиду отсутствия устройства выводит ошибку и на этом все.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
Do Var ev=WaitEvent If ev=EventClose Then End ElseIf ev=EventGadget Then Select Case EventNumberToolBar Case 1 To 3 MessBox("","Кнопка с номером " & EventNumberToolBar) End Select EndIf Loop
При нажатии на кнопку сообщение с номером этой кнопки не показывается, EventNumberToolBar возвращает 0
Точно используется последняя версия библиотеки? У меня все нормально. Возможно конечно я исправлял что-то у себя уже после выпуска последней версии. Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
Точно используется последняя версия библиотеки? У меня все нормально. Возможно конечно я исправлял что-то у себя уже после выпуска последней версии.
Я использую эту сборку FreeBasic http://freebasic.ucoz.com/forum/4-176-1 Сейчас посмотрел - действительно, сама Window9 новее, перекачал и заменил - теперь работает. Спасибо!
Да возможно, что в версии сборки 0.90 еще стоит старая версия библиотеки с данным багом. Я помню этот баг, но не помню когда его исправлял. Саму сборку после выпуска если и обновлял , то это было уже давно. С текущей версией библиотеки должно быть все в порядке. Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
Конечно не заточена, я даже об этом не думал. У FB есть встроенные средства работы с COM. Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
Интересный (и возможно дурацкий) вопрос у меня назрел, haav, не знаю, где спросить, спрошу здесь. А почему, если я сделал окно (со всякими дочерними элементами) при помощи VISG'а, или же встроенным в FbEdit визуальным редактором диалогов, у меня не получается управлять этим окном операторами window9 ? Ни по заданным ID, ни по полученным через ID_In_Number... Более того, почему-то окно , сделанное в VISG'е, даже на SetWindowText не реагирует! Почему так, и можно ли эту проблему как-нибудь решить?
Сообщение отредактировал symargl - Суббота, 02.05.2015, 10:34