Page 1 of 7

@notify

Posted: Thu Apr 29, 2010 1:04 pm
by SoUrcerer
Набросал маленькую программку, выводящую текст, переданный ей, в маленькое окошко в правом верхнем углу экрана.
Окно закрывается само через 5 секунд.
Синтаксис примитивен:
@notify [строка для вывода]

Зачем? С ее помощью можно уведомлять пользователя о включении/выключении эмулятора мыши, переключении песни в ac97 и о многих других событиях.

В планах: расширение синтаксиса. Вывод в несколько строк с использованием управляющих префиксов (например \n), передача времени отображения окна через командную строку. Заготовки иконок для различных событий (например, если событие связано со звуком - рисовать динамик, с мышью - рисовать мышку и так далее). Возможно - ini-файл с настройками (угол экрана, где окно должно появиться; цвет окна и другие параметры).

Подскажите, пожалуйста, как убрать этот мерзкий синий контур вокруг окна? //каюсь, мало курил мануалы :)//

Re: @notify

Posted: Thu Apr 29, 2010 1:33 pm
by Nasarus
Отличная идея :) . Нечто подобное и я хочу сделать, только для отображения отчетов об ошибках в программе, сохранения отчетов и т.п, потому что Board'ом не очень удобно пользоваться из-за отсутствия скроллинга, копирования и т.д. Мое мнение - продолжай в том же духе =)
Sorcerer wrote:Подскажите, пожалуйста, как убрать этот мерзкий синий контур вокруг окна? //каюсь, мало курил мануалы :)//
Как вариант сделай цвет рамки такой же как и у фона, то есть:

Code: Select all

mov EAX, 0
...
mov EDI, 0 ; черный цвет рамки
int 0x40 
Только, на черном рабочем столе (например, в ночных сборках) без рамки будет смотреться не очень :)

Re: @notify

Posted: Thu Apr 29, 2010 3:14 pm
by diamond
Sorcerer wrote:Подскажите, пожалуйста, как убрать этот мерзкий синий контур вокруг окна?
Использовать окно стиля 1, где система самостоятельно не рисует вообще ничего?

Re: @notify

Posted: Tue May 25, 2010 11:52 am
by SoUrcerer
Делаю многопоточную версию notify (ведь может же одновременно или почти одновременно произойти несколько событий)
Вопрос - как лучше передавать параметры?
Через IPC, dll, или доску отладки?
Довольно логично сделать какой-нибудь префикс для отладочных сообщений пользователю... Тогда эти сообщения можно будет увидеть и через уведомлялку, и на доске отладки.

Буфер доски отладки очищается при чтении, правильно?

Re: @notify

Posted: Tue May 25, 2010 2:52 pm
by Mario
Можно еще использовать общую память, как я сделал для OpenDialog, но готовых процедур с событиями и прочим в этом случае нету.

Re: @notify

Posted: Thu Jan 20, 2011 12:14 pm
by SoUrcerer
Увидел в ночной сборке @notify, и стало мне стыдно за то, что такой крокодил присутствует в образе.
В связи с этим переписал его с нуля, и стал он заметно легче (раза в 4), и вдобавок выводит текст не на черном фоне, а на сетке (что позволяет видеть рабочий стол под окном уведомления).

Архиватор почему-то отказался архивировать файл с именем @notify, поэтому не забудьте переименовать файл из notify в @notify.
Исходные коды прилагаются.

Re: @notify

Posted: Thu Jan 20, 2011 1:09 pm
by SoUrcerer
Более корректная версия, перерисовывающая окно и отлавливающая события.

Вопрос такой: у notify окно, в котором система ничего не рисует. Когда вызывается команда рисования окна, notify рисует сетку и выводит текст. Если под окном notify есть другое окно, то его будет видно насквозь.

Теперь я убираю окно, которое было под окном notify. Notify получает сообщение о необходимости перерисовать окно, и заново ставит точки. Но рисуются эти точки поверх прошлого состояния окна notify (т.е. когда сквозь него видно другое окно), а не с нуля. Это баг в ядре, связанный с рисованием окон? Или это фича? Как с этим бороться?

Re: @notify

Posted: Thu Jan 20, 2011 5:58 pm
by DmitrySokolowsky
Так вроде Колибри пока не поддерживает полноценную прозрачность.

Re: @notify

Posted: Thu Jan 20, 2011 6:09 pm
by Mario
Sorcerer
А как ты себе представляешь объективную отрисовку? Первичный захват точек для микширования происходит еще до вывода окна, а вторичный уже при наличии окна. На самом деле физически все, что под окном не существует, потому что ядро отрисовывает только ту информацию, которая в данный момент видна для пользователя. Слоев для восстановления информации по сути нет. Если бы они были это все отжирало бы память на хранение. В текущем виде простого решения для проблемы которую ты обозначил нет.

Re: @notify

Posted: Thu Jan 20, 2011 8:33 pm
by Gluk
вероятный workaround: при просьбе ядра перерисовать окно, изменить размер окна в ноль, затем обратно, и рисовать.

Re: @notify

Posted: Thu Jan 20, 2011 9:56 pm
by Mario
Gluk
Я хотел предложить такой метод, но он дюже неправильный - моргать будет. К тому же массовое использование несколькими приложениями такого метода будет "кошмарить" систему. В общем как и утверждалось ранее - прозрачность в Колибри это не самая перспективная и нужная вещь, особенно при отсутствующем аппаратном ускорении.

Re: @notify

Posted: Thu Jan 20, 2011 9:58 pm
by SoUrcerer
Только что проверил, не работает. Не моргает, а просто все выглядит точно так же. Что с изменением размера 67й функцией, что с изменением формы 50й.

Re: @notify

Posted: Thu Jan 20, 2011 10:39 pm
by Mario
Sorcerer
Скорее всего ты неправильно выводишь. Мало изменить 67 функцией - надо еще отрисовать после этого все той-же комбинацией функций 12+0+12, затем поменять обратно на исходные 67 функцией и снова отрисовать 12+0+12. А вообще выводить так как сделал ты не самый лучший вариант, на некоторых мониторах такой сетчатый вывод вызывает муар и режет глаза. Лучше комбинировать с захватом куска изображения после минимизации в 0 окна, через функцию 36, а затем затемнив и\или размыв захваченную картинку вывести ее, а поверх нее текст. Конечно это медленней, но это будет ближе к тому что ты хочешь получить.

Re: @notify

Posted: Thu Jan 20, 2011 10:50 pm
by SoUrcerer
Именно так и делал, 67я, потом 12, потом 0, потом 12, потом 67, потом 12, 0 и 12. Эффект нулевой (или руки кривые).

Да, я думал о том, чтобы сделать через 36ю функцию, но натерпелся глюков с программой transp, и решил попробовать сделать так, как было сделано в игрушке Seiken Densetsu 2 для SNES. Там результаты очень хорошие получались

Re: @notify

Posted: Sat Apr 02, 2011 6:42 pm
by Gluk
Sorcerer, где-то на форуме валяется прога для отображения заряда батареи by me, там сделано сворачивание в точку, вроде работает =)