Форум » [x]Harbour » Можно ли, не создавая никаких окон » Ответить

Можно ли, не создавая никаких окон

PSP: ни консольного, ни графического, напрямую работать с экраном? К примеру, перекрасить область на экране в известных координатах.

Ответов - 16

PSP: Как к Харбору прикрутить GetDC, к примеру? Кто может помочь?)

SergKis: PSP пишет Как к Харбору прикрутить GetDC, MiniGui c_winapimisc.c [pre2] ... HB_FUNC( GETDC ) { HB_RETNL( ( LONG_PTR ) GetDC( ( HWND ) HB_PARNL( 1 ) ) ); } ...[/pre2]

PSP: Ок, спасибо. Пошёл изучать)


PSP: Воспользовался библой BosTaurus. Вроде работает)

Dima: PSP А для чего это тебе ?

PSP: Индикатор доступности http-ресурса в сети, который не зависит от оконного менеджера винды и программ, которые "любят" быть наверху))

Andrey: PSP пишет: Индикатор доступности http-ресурса в сети Как сделаешь, поделись примером !

fil: Может имеет смысл посадить индикатор в TRAY ? Он там мигает разными цветами (в зависимости от ситуации) да и видео всегда

PSP: fil пишет: Может имеет смысл посадить индикатор в TRAY ? Это - касса. Трэя нет. Эксплорера тоже. Кассовая программа "наверху". Ничего другого там не будет.

PSP: Andrey пишет: Как сделаешь, поделись примером ! На вскидку - как-то так: [pre2] #include "hmg.ch" #include "BosTaurus.CH" #include "Inkey.ch" #require "hbtip" FUNCTION Main LOCAL hDC, sBTStruct LOCAL oHttp, lActive LOCAL n, d WHILE .T. oHttp := TIPClientHTTP():New( "http://www.yandex.ru", .F. ) IF ( lActive := oHttp:open() ) oHttp:close() END //IF n := Seconds() d := Date() WHILE Seconds() - n < 10 .and. d == Date() // пауза 10 сек. В эти 10 сек показывается "статусный квадрат". Учесть смену даты hDC := BT_CreateDC( , BT_HDC_DESKTOP, @sBTstruct ) IF lActive BT_DrawFillRectangle( hDC, 10, 10, 20, 20, { 73, 240, 17 }, { 73, 240, 17 }, 3 ) // зеленый квадрат ELSE BT_DrawFillRectangle( hDC, 10, 10, 20, 20, { 235, 16, 16 }, { 235, 16, 16 }, 3 ) // красный квадрат END // IF BT_DeleteDC( sBTstruct ) hb_ReleaseCPU() END // WILE hb_ReleaseCPU() END // WHILE RETURN [/pre2] Проверялось пока что только на обычном компе.

fil: Ежели кассовая прога сверху тогда можно встроить индикатор в ее окно. Напр. заголовок менять (ежели не POPUP) или на DC чего рисовать

Andrey: PSP пишет: На вскидку - как-то так: Спасибо ! Прикольно ! В коллекции пригодиться !

PSP: fil пишет: или на DC чего рисовать Так вот я и рисую на DC. Только не конкретного окна (что тоже имеет смысл, спасибо), а всего экрана.

ММК: fil пишет: тогда можно встроить индикатор в ее окно. Напр. заголовок В FWH есть примерчик индикатора- полупрозрачное окошко , всегда "наверху" , на несколько секунд. На нем можно разместить картинку , надпись или меню.... PS Это, как "идея " :) function DesktopAlert( oWnd ) local oDlg, oBrush, oFont local hLogo := FWLogoBitMap() local oBtnClose local oBtnDown local oFontBody DEFINE FONT oFont NAME "Verdana" BOLD DEFINE FONT oFontBody NAME "Verdana" SIZE 0, -9 DEFINE BRUSH oBrush GRADIENT { { 1, nRgb( 221, 236, 253 ), nRgb( 95, 131, 179 ) } } DEFINE DIALOG oDlg STYLE nOr( WS_POPUP, WS_BORDER ) BRUSH oBrush ; SIZE 328, 73 @ 0.6, 6 SAY "A desktop notification" OF oDlg TRANSPARENT FONT oFont @ 1.2, 6 SAY "ПОДКЛЮЧЕНО !" OF oDlg; TRANSPARENT FONT oFont SIZE 100,30 COLOR CLR_HGREEN @ 1.8, 6 SAY "Обед через 15 минут." OF oDlg; TRANSPARENT FONT oFontBody SIZE 100,30 COLOR CLR_WHITE @ 0.6, oDlg:nWidth-175 BTNBMP oBtnClose FILENAME "D:\fwh\bitmaps\16x16\cancel.bmp" ; SIZE 10, 10 OF oDlg NOBORDER ACTION oDlg:End() @ 0.6, oDlg:nWidth-185 BTNBMP oBtnDown FILENAME "D:\fwh\bitmaps\16x16\darrow.bmp" ; SIZE 10, 10 OF oDlg NOBORDER ACTION oDlg:End() oBtnClose:ltransparent:=.t. oBtnDown:ltransparent:=.t. ACTIVATE DIALOG oDlg ; ON INIT ( SetTransparent( oDlg ), oDlg:Shadow(), BuildTimer( oDlg ) ) ; ON CLICK oDlg:End() ; ON PAINT DrawBitmap( hDC, hLogo, 9, 9 ) ; VALID ( DeleteObject( hLogo ), .T. ) ; NOWAIT oBrush:End() oFont:End() oWnd:SetFocus() return nil //----------------------------------------------------------------------------// function BuildTimer( oDlg ) local oTimer local nStart := Seconds() oDlg:SetPos( ScreenHeight() - 80, ScreenWidth( 0 ) - 350 ) DEFINE TIMER oTimer OF oDlg ; INTERVAL 10; ACTION If( Seconds() - nStart > 5, oDlg:End(),) ACTIVATE TIMER oTimer return nil //----------------------------------------------------------------------------// #define GWL_EXSTYLE -20 #define WS_EX_LAYERED 524288 static function SetTransparent( oDlg ) SetWindowLong( oDlg:hWnd, GWL_EXSTYLE, nOr( GetWindowLong( oDlg:hWnd, GWL_EXSTYLE ), WS_EX_LAYERED ) ) SetLayeredWindowAttributes( oDlg:hWnd, 0, 180, 2 ) return nil

PSP: ММК Спасибо, учту) Проверю свой вариант в бою сначала. А там видно будет)

PSP: В процессе натурных испытаний выяснилось, что оно не работает на Windows Embedded XP и 7 (возможно где-то еще, не проверял). Проблема решилась заменой вызова BT_CreateDC(...) на BT_CreateDC( 0, BT_HDC_ALLCLIENTAREA, @sBTstruct ).



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