OSD и Desktop плагины

Обсуждение программ nnCron и nnCron LITE

OSD и Desktop плагины

Postby Mitry » Thu, 23 Sep 2004, 02:51

Хотел бы предложить свои поделки:

:<-----------------------------
Code: Select all
\ File:      desktop.spf
\ Author:   dMitry Alexandrow
\ Version:   $Id: desktop.spf,v 1.4 2004/09/22 20:52:49 mitry Exp $
\ Description:  Set desktop wallpaper/transparency and other desktop
\      related routines
\ Usage:
\   WALLPAPER: "path_to\wallpaper.bmp" \ set wallpaper
\   WALLPAPER: ""      \ remove wallpaper
\   DESKTOP-TRANSPARENCY   \ Set transparent color for text under icons
\   DESKTOP-HEIGHT      \ Get display screen width  in pixels
\   DESKTOP-WIDTH      \ Get display screen height in pixels
\   OSD: "%hh%:%mm%"   \ Rough OnScreenDisplay
\   WIN-ROLL      \ Roll/Unroll current window (Unix-like feature)
\   WIN-HWND WIN-SIZE   \ Returns width and height for the win handle
\ ###############################
WINAPI: SystemParametersInfoA USER32.DLL

: WALLPAPER ( a u -- )
   DROP
   1 SWAP 0 20 SystemParametersInfoA DROP
;
: WALLPAPER: eval-string, POSTPONE WALLPAPER ; IMMEDIATE

\ ################################
WINAPI: GetShellWindow USER32.DLL
WINAPI: InvalidateRect USER32.DLL
WINAPI: UpdateWindow   USER32.DLL

\ ################################
\  Set transparent color for text under icons on the desktop
: DESKTOP-TRANSPARENCY ( -- )
   GetShellWindow TO WIN-HWND
   FOR-CHILD-WINDOWS: "SHELLDLL_DefView"
      WIN-CHILD-HWND TO WIN-HWND
      FOR-CHILD-WINDOWS: "SysListView32"
         0xFFFFFFFF 0 0x1026 WIN-CHILD-HWND SendMessageA DROP
         TRUE 0 WIN-CHILD-HWND InvalidateRect DROP
         WIN-CHILD-HWND UpdateWindow DROP
      ;FOR-CHILD-WINDOWS
   ;FOR-CHILD-WINDOWS
;

\ ################################
: OSD-FONT   Z" Tahoma" ;
\ : OSD-FONT   Z" DS Crystal" ;
50      CONSTANT   OSD-SIZE
100      VALUE      OSD-X
50      VALUE      OSD-Y
1000      VALUE      OSD-PAUSE


WINAPI: GetWindowDC      user32.dll
WINAPI: ReleaseDC      user32.dll
WINAPI: RedrawWindow      user32.dll

WINAPI: TextOutA      gdi32.dll
WINAPI: SetBkMode      gdi32.dll
WINAPI: SetTextColor      gdi32.dll
WINAPI: SelectObject      gdi32.dll
WINAPI: CreateFontA      gdi32.dll

: OSD    \ ( a u -- )
   GetDesktopWindow GetWindowDC   \ DC
   DUP 1 SWAP SetBkMode DROP
   DUP 0x0000FF00 SWAP SetTextColor DROP
   DUP
   OSD-FONT 0 0 0 0 1 0 0 0 0 0 0 0 OSD-SIZE CreateFontA
   SWAP SelectObject DROP
   DUP            \ a u DC DC
   2OVER   SWAP         \ a u DC DC u a
   ROT            \ a u DC u a DC
   OSD-Y OSD-X ROT         \ a u DC u a X Y DC
   TextOutA DROP
   ReleaseDC 2DROP
   OSD-PAUSE PAUSE
   133 0 0 GetDesktopWindow RedrawWindow DROP
;

: OSD: eval-string, POSTPONE OSD ; IMMEDIATE

\ ################################
: DESKTOP-HEIGHT GetDesktopWindow WIN-RECT 2DROP DROP ;
: DESKTOP-WIDTH  GetDesktopWindow WIN-RECT 2DROP SWAP DROP ;

\ ################################
: WIN-SIZE ( hwnd -- w h )
   WIN-RECT   \ y2 x2 y1 x1
   >R SWAP R> - >R   \ w ->R
   - R> SWAP
;

\ ################################
: WIN-ROLL
   GetForegroundWindow TO WIN-HWND
   WIN-HWND WIN-SIZE   \ w h
   60 > IF 24 ELSE
      WIN-HWND WIN-POS SWAP DROP DESKTOP-HEIGHT SWAP -
   THEN
   WIN-RESIZE
;

\ EOF desktop.spf \\ vim: ft=forth:ts=8:noet:fenc=cp1251

:<-----------------------------
Mitry
 
Posts: 9
Joined: Thu, 23 Sep 2004, 02:26

Postby VK » Thu, 23 Sep 2004, 12:48

Супер! OSD - очень часто "запрашиваемая" фича... Просьба к тебе: вынеси, плз, OSD в отдельный плагин (скажем, osd.spf). Соответственно, там нужны кое-какие "доделки" - для удобства. Было бы хорошо, если бы ты сделал что-то вроде:

Code: Select all
OSD: "screen txt" "time_in_seconds"


Плюс управление с помощью опций (как HINT-POS:, HINT-SIZE:). Видимо, их надо делать USER-перемнными:

Code: Select all
OSD-FONT: "font_name"
OSD-SIZE: osd_size    \ (in_pixels?)
OSD-POS: x y


Что скажешь? Будешь доделывать?
CU
VK
User avatar
VK
 
Posts: 680
Joined: Wed, 14 Jul 2004, 19:17

Postby Mitry » Sun, 26 Sep 2004, 01:41

VK (far_away) wrote:...вынеси, плз, OSD в отдельный плагин (скажем, osd.spf).


Я сделал отдельный плагин, а, заодно, кое-что добавил и исправил:
была ошибка с освобождением DC (виноват :x )

Кстати, возник вопрос о использовании WINAPI:
Как я понял, при вызове функции из DLL, она (DLL) каждый раз
загружается заново. Можно ли как-то загрузить DLL, вызвать
init из одной задачи, а затем вызывать ее ф-ции из других
задач, ну и потом, естественно, deinit?

:<---------------
Code: Select all
\ File:      osd.spf
\ Author:   dMitry Alexandrow
\ Version:   $Id: osd.spf,v 1.1 2004/09/25 21:41:59 mitry Exp $
\ Description:  OnScreenDisplay - simplest variant
\ Usage:
\   OSD-FONT: "Arial" 50 0x0000FF00
\      ("Arial" - font name; 50 - size; 0x0000FF00 - color)
\   OSD-POS:  400 200
\      (400 - horizontal; 200 - vertical)
\   OSD: 2000 "Hi! Now %hh%:%mm%!"
\      (2000 - time in msec to show message)
\   S" Hi! Now %hh%:%mm%!" EVAL-SUBST OSD 2000 PAUSE OSD-CLEAR
\      (Same as above, but for advanced users)
\ ###################################################

WINAPI: GetWindowDC      user32.dll
WINAPI: ReleaseDC      user32.dll
WINAPI: RedrawWindow      user32.dll
WINAPI: TextOutA      gdi32.dll
WINAPI: SetBkMode      gdi32.dll
WINAPI: SetTextColor      gdi32.dll
WINAPI: SelectObject      gdi32.dll
WINAPI: CreateFontA      gdi32.dll

100   VALUE   osd-x
50   VALUE   osd-y
50   VALUE   osd-size
0x0000FF00      VALUE   osd-color

CREATE osd-font 64 ALLOT
S" Arial" osd-font ZPLACE

: OSD ( a u -- )
   GetDesktopWindow GetWindowDC >R
   1 R@ SetBkMode DROP
   osd-color R@ SetTextColor DROP
   osd-font 0 0 0 0 1 0 0 0 0 0 0 0 osd-size CreateFontA
   R@ SelectObject ROT ROT
   SWAP osd-y osd-x R@ TextOutA DROP
   R@ SelectObject DROP
   R> GetDesktopWindow ReleaseDC DROP
;

: OSD-CLEAR ( -- )
   133 0 0 GetDesktopWindow RedrawWindow DROP
;

: OSD-PAUSED ( n a u -- ) OSD PAUSE OSD-CLEAR ;

: OSD-POS ( x y -- ) TO osd-y TO osd-x ;

: OSD-FONT ( a u nsize nclr -- )
   TO osd-color
   TO osd-size
   63 MIN osd-font ZPLACE
;

: OSD: number, eval-string, POSTPONE OSD-PAUSED ; IMMEDIATE
: OSD-POS: number, number, POSTPONE  OSD-POS ; IMMEDIATE
: OSD-FONT: eval-string, number, number, POSTPONE OSD-FONT ; IMMEDIATE

\ EOF osd.spf \\ vim: ft=forth:ts=8:noet:fenc=cp1251


:<---------------
Last edited by Mitry on Sat, 02 Oct 2004, 05:48, edited 1 time in total.
Mitry
 
Posts: 9
Joined: Thu, 23 Sep 2004, 02:26

Postby Mitry » Sun, 26 Sep 2004, 01:54

Вдогонку:

Mitry wrote:
Code: Select all
: OSD-PAUSED ( n a u -- )
   ROT >R
   OSD
   R> PAUSE
   OSD-CLEAR
;



Все намного проще :)

Code: Select all
: OSD-PAUSED ( n a u -- ) OSD  PAUSE  OSD-CLEAR ;
Mitry
 
Posts: 9
Joined: Thu, 23 Sep 2004, 02:26

Postby Nicholas_Nemtsev » Tue, 28 Sep 2004, 09:12

Mitry wrote:Кстати, возник вопрос о использовании WINAPI:
Как я понял, при вызове функции из DLL, она (DLL) каждый раз
загружается заново. Можно ли как-то загрузить DLL, вызвать
init из одной задачи, а затем вызывать ее ф-ции из других
задач, ну и потом, естественно, deinit?

Не, dll загружается один раз. user32 и gdi32 в других местах в кроне используется и выгружать их совсем не нужно.
А что касается OSD - это здорово!
Правда, ещё не пробовал :)
Nicholas Nemtsev
User avatar
Nicholas_Nemtsev
Site Admin
 
Posts: 857
Joined: Thu, 01 Jul 2004, 22:25
Location: Псков

Postby Prisoner » Fri, 01 Oct 2004, 01:44

Плохо, что при перерисовке объекта поверх которого выведена строка, последняя частично или полностью пропадает - канва и ее свойства... интересно, можно ли создавать окно с прозрачностью 100% и на него выводить строки? Это даст возможность писать в окно как в файл (при программинге соответствующих действий), что очень удобно, скажем для просмотра логов прямо на рабочем столе - каждая i(ая) строка становится на место i+1(ой)... в общем стек.
Prisoner
 
Posts: 3
Joined: Tue, 28 Sep 2004, 02:02

Postby Mitry » Sat, 02 Oct 2004, 05:53

Если кто-то использует osd.spf , обновите, пожалуйста, свою версию.
В предыдущем своем постинге я внес исправления (см выше).
Mitry
 
Posts: 9
Joined: Thu, 23 Sep 2004, 02:26

Postby Nicholas_Nemtsev » Mon, 04 Oct 2004, 10:32

Немного причесал плагин.
Изменения:
1. Заменил VALUE на USER-VALUE переменные.
2. Соответственно, добавил инициализацию
3. Поменял местами параметры у слова OSD и OSD:
Проверьте работоспособность.
Code: Select all
\ File:      osd.spf
\ Author:   dMitry Alexandrow
\ Version:   $Id: osd.spf,v 1.1 2004/09/25 21:41:59 mitry Exp $
\ Description:  OnScreenDisplay - simplest variant
\ Usage:
\   OSD-FONT: "Arial" 50 0x0000FF00
\      ("Arial" - font name; 50 - size; 0x0000FF00 - color)
\   OSD-POS:  400 200
\      (400 - horizontal; 200 - vertical)
\   OSD: "Hi! Now %hh%:%mm%!" 2000
\      (2000 - time in msec to show message)
\   S" Hi! Now %hh%:%mm%!" EVAL-SUBST OSD 2000 PAUSE OSD-CLEAR
\      (Same as above, but for advanced users)
\ ###################################################

WINAPI: GetWindowDC      user32.dll
WINAPI: ReleaseDC      user32.dll
WINAPI: RedrawWindow      user32.dll
WINAPI: TextOutA      gdi32.dll
WINAPI: SetBkMode      gdi32.dll
WINAPI: SetTextColor      gdi32.dll
WINAPI: SelectObject      gdi32.dll
WINAPI: CreateFontA      gdi32.dll

USER-VALUE   osd-x
USER-VALUE   osd-y
USER-VALUE   osd-size
USER-VALUE   osd-color
USER-VALUE   osd-font

: ?OSD-INIT
    osd-font 0=
   IF
       64 ALLOCATE THROW TO osd-font
\      100 TO osd-x
\      50 TO osd-y
      50 TO osd-size
      0x0000FF00 TO osd-color
      S" Arial" osd-font ZPLACE
   THEN
;   

: OSD ( a u -- )
   ?OSD-INIT
   GetDesktopWindow GetWindowDC >R
   1 R@ SetBkMode DROP
   osd-color R@ SetTextColor DROP
   osd-font 0 0 0 0 1 0 0 0 0 0 0 0 osd-size CreateFontA
   R@ SelectObject ROT ROT
   SWAP osd-y osd-x R@ TextOutA DROP
   R@ SelectObject DROP
   R> GetDesktopWindow ReleaseDC DROP
;

: OSD-CLEAR ( -- )
   133 0 0 GetDesktopWindow RedrawWindow DROP
;

: OSD-PAUSED ( a u n -- ) >R OSD R> PAUSE OSD-CLEAR ;

: OSD-POS ( x y -- ) TO osd-y TO osd-x ;

: OSD-FONT ( a u nsize nclr -- )
   ?OSD-INIT
   TO osd-color
   TO osd-size
   63 MIN osd-font ZPLACE
;

: OSD: eval-string, number, POSTPONE OSD-PAUSED ; IMMEDIATE
: OSD-POS: number, number, POSTPONE  OSD-POS ; IMMEDIATE
: OSD-FONT: eval-string, number, number, POSTPONE OSD-FONT ; IMMEDIATE

\ EOF osd.spf \\ vim: ft=forth:ts
Nicholas Nemtsev
User avatar
Nicholas_Nemtsev
Site Admin
 
Posts: 857
Joined: Thu, 01 Jul 2004, 22:25
Location: Псков

Postby VK » Mon, 04 Oct 2004, 10:52

это... спохватился: а вот OSD-COLOR: не имеет смысл тоже сделать настраиваемым? ИМХО - надо...
CU
VK
User avatar
VK
 
Posts: 680
Joined: Wed, 14 Jul 2004, 19:17

Postby Nicholas_Nemtsev » Mon, 04 Oct 2004, 10:57

Не понял. Вроде и слова такого нет. Там osd-color в OSD-FONT устанавливается.
Nicholas Nemtsev
User avatar
Nicholas_Nemtsev
Site Admin
 
Posts: 857
Joined: Thu, 01 Jul 2004, 22:25
Location: Псков

Postby VK » Mon, 04 Oct 2004, 11:09

А... Да, пардон... Что-то я еще "не проснулся"... Снимаю вопрос про колор...
CU
VK
User avatar
VK
 
Posts: 680
Joined: Wed, 14 Jul 2004, 19:17

Postby VK » Mon, 04 Oct 2004, 11:47

Хе... Нет, все-таки у меня есть вопрос. Вот я пишу:

OSD-FONT: "Courier New" 20 0x00FF3333

Получаю синий цвет с кодом #3333FF. А вот для того, чтобы получить красный (#FF3333), я должен написать:

OSD-FONT: "Courier New" 20 0x003333FF

Так и задумано? Коды цветов надо набирать "шиворот навыворот"?
CU
VK
User avatar
VK
 
Posts: 680
Joined: Wed, 14 Jul 2004, 19:17

Postby Nicholas_Nemtsev » Mon, 04 Oct 2004, 11:56

Это внутренний формат такой (младший байт - R, второй - G, третий - B). В памяти, кстати эти байты как надо расположены - от младшего к старшему. Можно, конечно, переставлять эти байты.
Nicholas Nemtsev
User avatar
Nicholas_Nemtsev
Site Admin
 
Posts: 857
Joined: Thu, 01 Jul 2004, 22:25
Location: Псков

Postby VK » Mon, 04 Oct 2004, 12:07

смотри сам. можно просто в доке к плагину указать - как правильно задавать цвет.

ну, или, наоборот, привести саму систему задания цветов в понятный для юзера вид (если во всех программах цвет называется #AABBCC, то логично было бы его так и задавать).

что решаешь?
CU
VK
User avatar
VK
 
Posts: 680
Joined: Wed, 14 Jul 2004, 19:17

Postby Nicholas_Nemtsev » Mon, 04 Oct 2004, 14:22

Code: Select all
...
: BGR>RGB ( n -- n1)
   SP@ C@ >R
   SP@ DUP 2+ C@ SWAP C!
   SP@ R> SWAP 2+ C!
;
...
: OSD-FONT ( a u nsize nclr -- )
   ?OSD-INIT
   BGR>RGB TO osd-color
   TO osd-size
   63 MIN osd-font ZPLACE
;

Вот ещё один пример перестановки байт
Code: Select all
: BGR>RGB1 ( n -- n1)
   DUP  0x0000FF AND 16 LSHIFT
   OVER 0xFF0000 AND 16 RSHIFT OR
   SWAP 0x00FF00 AND OR
;

Может быть кто-то предложит короче? :)
Nicholas Nemtsev
User avatar
Nicholas_Nemtsev
Site Admin
 
Posts: 857
Joined: Thu, 01 Jul 2004, 22:25
Location: Псков

Next

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: Bing [Bot] and 3 guests