Плагин HintPlus.spf

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

Плагин HintPlus.spf

Postby dothen » Sat, 14 Apr 2018, 23:33

Плагин для Task Maker (tm.exe). К nnCron не подключать!
Умеет делать "активный" хинт, например таймер, часы, языковую панель ...
Работает без nnCron. Запускать можно из nnCron или из батника.

Code: Select all
\ Файл:       hintplus.spf
\ Автор:      dothen
\ Дата:       14.04.2018
\ Версия:     1.0
\ Описание:
\ Плагин для Task Maker (tm.exe). К nnCron не подключать!
\ Умеет делать "активный" хинт, например таймер, часы, языковую панель ...
\ Работает без nnCron. Запускать можно из nnCron или из батника (примеры в конце).
\ http://www.nncron.ru/help/RU/add_info/command_line.htm#oneliner

\ Двойной левый клик закрывает хинт.

\ "Взятие языка" выполняется по таймеру а не по фен-шую.


WINAPI: GetDC USER32.DLL
WINAPI: GetClassNameA USER32.DLL
WINAPI: GetKeyboardLayout USER32.DLL
WINAPI: GetForegroundWindow USER32.DLL
WINAPI: GetWindowThreadProcessId USER32.DLL

WINAPI: AttachConsole Kernel32.dll
WINAPI: FreeConsole Kernel32.dll
WINAPI: GetConsoleKeyboardLayoutNameA Kernel32.dll

S" plugins\kbd_layout.spf" INCLUDED

0 VALUE HINT-HWND
0 VALUE HINT-DC
0 VALUE MINUTES
0 VALUE SEC
0 VALUE HXT

CREATE hintbuf 256 ALLOT

: >hintbuf> ( a1 u1 -- a2 u2 ) hintbuf ZPLACE hintbuf ASCIIZ> ;
: (min>sec) ( min -- sec ) ABS 5999 MIN 60 * ; \ Максимум 99:59:00
: min>sec ( -- ) MINUTES (min>sec) TO SEC ;

: hh:mm:ss ( n n n -- a u )
    <#
        0 HOLD
        t:00 t:00 t00 0 0
    #>  1-
;

: sec>hh:mm:ss ( sec -- a u ) ABS 3600 /MOD SWAP 60 /MOD SWAP hh:mm:ss ;
: msgtext ( -- a u ) S" Прошло " MINUTES (min>sec) sec>hh:mm:ss S+ ;
: HClock ( -- a u ) GET-CUR-TIME Hour@ Min@ Sec@ hh:mm:ss ;

GET-CUR-TIME Sec@ VALUE cursec

: HTimer ( -- a u )
    SEC sec>hh:mm:ss
    cursec GET-CUR-TIME Sec@ DUP TO cursec <> IF SEC 1- TO SEC THEN
    SEC -2 =
    IF
      0x11105 S" Таймер" DROP msgtext DROP 0 MessageBoxA \ MB_RETRYCANCEL+MB_DEFBUTTON2+MB_SYSTEMMODAL+MB_SETFOREGROUND
      CASE
         4  OF min>sec ENDOF \ Повторить
         2  OF BYE ENDOF \ Отмена
      ENDCASE
    THEN
\ Даже когда висит MessageBoxA, каждую секунду вызывается HTimer.
;

: GET-WCLASS ( hwnd -- a u ) 256 PAD ROT GetClassNameA PAD SWAP ;

HERE 1+ S" En" S", 0 C, CONSTANT En
HERE 1+ S" Ru" S", 0 C, CONSTANT Ru
HERE 1+ S" $$" S", 0 C, CONSTANT $$

: HLang { \ hwnd -- a u }
    GetForegroundWindow TO hwnd
    hwnd GET-WCLASS S" ConsoleWindowClass" COMPARE
    IF
    hwnd WIN-KBLT
    ELSE
    0 SP@ hwnd GetWindowThreadProcessId DROP DUP
    AttachConsole DROP
    PAD GetConsoleKeyboardLayoutNameA DROP
    FreeConsole DROP
    PAD ASCIIZ> BASE @ >R HEX S>NUM R> BASE !
    THEN
    CASE
      ENU OF En ASCIIZ> ENDOF
      RUS OF Ru ASCIIZ> ENDOF
      DUP OF $$ ASCIIZ> ENDOF
    ENDCASE
;

\ Язык и время.
: HLClock ( -- a u )
    HLang PAD ZPLACE
    S"  " PAD +ZPLACE
    HClock PAD +ZPLACE
    PAD ASCIIZ>
;

SplashDialog REOPEN

0x00A3 CONSTANT WM_NCLBUTTONDBLCLK

 W: WM_NCLBUTTONDBLCLK BYE ;

: TextOutHint ( a u -- )
    SWAP 2 0 CommFontSize? 0= IF 8 ELSE 2/ THEN * +
    Center? IF vWidth @ 2/ ELSE 4 THEN
    SWAP ToPixels SWAP HINT-DC TextOutA DROP
;

 :NONAME { time event msg hwnd -- }
    HXT EXECUTE >hintbuf> TextOutHint
 ; WNDPROC: TimeOutProc2

 ' TimeOutProc2 ' TimeOutProc JMP

VM: CreatePopup
    POPUPMENU
      S" Стартовал в " HClock S+ 0 MENUITEM
      S" Close" MI_CLOSE MENUITEM
    END-MENU
;

M: Text ( a u -- )
    hintbuf ZPLACE
    hintbuf vText !
;

;CLASS


: (TimeSplash2) ( a u -- )
    SplashDialog NEW TO msg
    1 msg vTimeOut !
    msg Text
    msg Create
    msg Show
    msg BringBack
    msg handle @ TO HINT-HWND
    msg handle @ GetDC TO HINT-DC
\    msg Flip
    msg MoveToHome
    msg Run
    msg Delete
;

: Hint2 ( a u xt -- ) TO HXT (TimeSplash2) BYE ;

\ : Timer  ( n -- ) TO MINUTES min>sec S" $$:$$:$$" ['] HTimer Hint2 ;
\ : Clock  ( -- )   S" $$:$$:$$"    ['] HClock Hint2 ;
\ : Lang   ( -- )   S" $$"          ['] HLang Hint2 ;
\ : LClock ( -- )   S" $$ $$:$$:$$" ['] HLClock Hint2 ;

: Timer  ( n -- ) TO MINUTES min>sec HTimer ['] HTimer Hint2 ;
: Clock  ( -- )   HClock  ['] HClock Hint2 ;
: Lang   ( -- )   HLang   ['] HLang Hint2 ;
: LClock ( -- )   HLClock ['] HLClock Hint2 ;

: RGB>BGR 256 /MOD 256 /MOD 0xFF AND SWAP 256 * + SWAP 65536 * + ;
: HINT-POS   ( x y -- ) CommPos 2! ;
: HINT-SIZE  ( w h -- ) CommSize 2! ;
: HINT-COLOR ( bg fg -- ) RGB>BGR CommColorFont ! RGB>BGR CommColorBg ! ;
: HINT-FONT  ( a u n -- ) CommFontSize ! CommFont ZPLACE ;

0x00FFFF CONSTANT Aqua    \ (морская волна) (cyan)
0x000000 CONSTANT Black   \ (черный)
0x0000FF CONSTANT Blue    \ (голубой)
0xFF00FF CONSTANT Fuchsia \ (фуксия) (magenta)
0x808080 CONSTANT Gray    \ (серый)
0x008000 CONSTANT Green   \ (зеленый)
0x00FF00 CONSTANT Lime    \ (ярко-зеленый)
0x800000 CONSTANT Maroon  \ (темно-бордовый)
0x000080 CONSTANT Navy    \ (темно-синий)
0x808000 CONSTANT Olive   \ (оливковый)
0x800080 CONSTANT Purple  \ (фиолетовый)
0xFF0000 CONSTANT Red     \ (красный)
0xC0C0C0 CONSTANT Silver  \ (серебряный)
0x008080 CONSTANT Teal    \ (серо-зеленый)
0xFFFFFF CONSTANT White   \ (белый)
0xFFFF00 CONSTANT Yellow  \ (желтый)

\ Можно сразу изменить дефолтные атрибуты хинта.
Maroon Yellow HINT-COLOR
S" Courier New" 26 HINT-FONT




\EOF

\ Пример
#( test_hint1
NoActive SingleInstance
: TMName2 ( -- a u ) S" %TMName% S%QUOTE% plugins\hintplus.spf%QUOTE% INCLUDED" EVAL-SUBST ;
0 VALUE tmr
: TIMER ( n -- )
    TO tmr
    START-APP: %TMName2% Silver Black HINT-COLOR 200 100 HINT-POS %tmr% Timer
;
: LANG ( -- )
    START-APP: %TMName2% 200 150 HINT-POS Lang
;
: CLOCK ( -- )
    START-APP: %TMName2% 200 200 HINT-POS Clock
;
: LCLOCK ( -- )
    START-APP: %TMName2% S" Courier New" 30 HINT-FONT Black Lime HINT-COLOR 200 250 HINT-POS LClock
;

Action:
    2 TIMER
    1000 PAUSE
    LCLOCK
    1000 PAUSE
    LANG
    1000 PAUSE
    CLOCK
)#


\ Пример для запуска из батника:
\ start /min D:\Program\nnCron\tm.exe S" plugins\hintplus.spf" INCLUDED Lang

\ Темы:
\ эксперимент по портированию HINT
\ http://www.nncron.ru/forums/viewtopic.php?f=5&t=10144
\ Обратный отсчёт через HINT
\ http://www.nncron.ru/forums/viewtopic.php?f=5&t=11645
\ Языковая панель средствами nncron
\ http://www.nncron.ru/forums/viewtopic.php?f=5&t=13002
\ Вопрос - Ответ
\ http://www.nncron.ru/forums/viewtopic.php?f=5&t=10306&start=180#p28551

dothen
 
Posts: 187
Joined: Mon, 16 Mar 2015, 04:58

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 2 guests