Форум » GUI » MiniGUI Прозрачная форма » Ответить

MiniGUI Прозрачная форма

SerLog: Может кому надо! Пример формирования прозрачной формы. Работает в Windows 2000 и выше. В Windows 98 обычная форма. Сделано на основе статьи http://ufps.chukotka.ru/~jm/gamedev.chat.ru/articles/a0036.html #include "minigui.ch" Function Main() nTra:=100 DEFINE WINDOW WinTr AT 0,0 WIDTH 300 HEIGHT 300 TITLE 'Прозрачное окно' ; MAIN NOSIZE NOMAXIMIZE @ 200,100 BUTTON But1 CAPTION "Нажми" HEIGHT 35 WIDTH 100; ACTION (IIF(nTra=100,nTra:=255,ntra:=100) , SetTransparent(hWnd,nTra) ) END WINDOW WinTR.Center hWnd=GetFormHandle('WinTR') SetTransparent(hWnd,nTra) ACTIVATE WINDOW WinTR RETURN #pragma BEGINDUMP #define _WIN32_IE 0x0500 #define HB_OS_WIN_32_USED #define _WIN32_WINNT 0x0400 #define WS_EX_LAYERED 0x80000 #define LWA_ALPHA 0x02 #define GWL_EXSTYLE (-20) #include <windows.h> #include "hbapi.h" #include<stdio.h> #include<string.h> #include<shellapi.h> HB_FUNC( SETTRANSPARENT) { typedef BOOL (__stdcall *PFN_SETLAYEREDWINDOWATTRIBUTES)(HWND,COLORREF,BYTE,DWORD); PFN_SETLAYEREDWINDOWATTRIBUTES pfnSetLayeredWindowAttributes = NULL; HINSTANCE hLib = LoadLibrary("user32.dll"); if (hLib != NULL) { pfnSetLayeredWindowAttributes = (PFN_SETLAYEREDWINDOWATTRIBUTES)GetProcAddress(hLib,"SetLayeredWindowAttributes"); } if (pfnSetLayeredWindowAttributes) { SetWindowLong((HWND) hb_parnl (1),GWL_EXSTYLE,GetWindowLong((HWND) hb_parnl (1),GWL_EXSTYLE) | WS_EX_LAYERED); pfnSetLayeredWindowAttributes((HWND) hb_parnl (1), 0, hb_parni (2), LWA_ALPHA); } if (!hLib) { FreeLibrary(hLib); } } #pragma ENDDUMP

Ответов - 26, стр: 1 2 All

gfilatov: SerLog пишет: Может кому надо Большое спасибо! Обратите внимание на новый пример (из поставки build 28) в папке Advanced\Transparency, имеющий подобную функциональность

Dima: Интерестно а можно ли сделать прозрачные кнопки ? Выглядит очень даже ни чего ;) Скажем как вот тут (нужно пару демок скачать) http://www.viaopen.com/downloads.html

Andrey: Подскажите пожалуйста как реализовать следующую вещь: Запустить логотип программы (как у всех по центру экрана) и в ней сделать бегунок загрузки. Желательно на чистом Харборе. Смотрел в котнрах GTWVW но он делает стандартное Windows-окно. Заранее спасибо за помощь.


ММК: Dima пишет: Интерестно а можно ли сделать прозрачные кнопки ? Выглядит очень даже ни чего ;) Скажем как вот тут Элементарно .. Дима :))) Только не знаю , как здесь, но в FWH ..:)) Вот только надо набор кнопочек. И чтоб в трех лицах :)) Т.е. одна , когда ее никто не трогает, вторая когда наводишь на нее курсор и , наконец , :)) Когда ее тискаешь :)) У тебя нет такой коллекции? :))

Dima: ММК пишет: У тебя нет такой коллекции? :)) Где то была но идею не совсем понял..... Ты имеешь в виду что нужно просто иметь готовые "прозрачные" BMP ? Примерчик могешь состряпать с прозрачной кнопкой как на http://www.viaopen.com/ ?

Владимир: М-да, выглягит очень даже ничего

ММК: Dima пишет: Где то была но идею не совсем понял..... Ты имеешь в виду что нужно просто иметь готовые "прозрачные" BMP ? Примерчик могешь состряпать с прозрачной кнопкой как на http://www.viaopen.com/ ? Идею ты понял правильно :))Пришли мне "кнопку" , т.е. три ( можешь две) вмпэшки. Первая , когда она ( кнопка) прозрачная, а вторая когда на нее н"нажимаешь" Так же делается и меню. Тебе пример на мыло?

Dima: ММК пишет: Пришли мне "кнопку" Ищу такие кнопки уже час........пока не вижу Иконок как га#на а кнопок нет ;)

Dima: ММК Вообщем я пошел другим путем ;) Слил демку с http://www.viaopen.com/ и вытащил от туда кнопки , которые тебе и отправил. Жду примера или тут или на мыло ;)

ММК: Dima пишет: вытащил от туда кнопки , которые тебе и отправил. Жду примера или тут или на мыло ;) Ну какие вытащил , такие я тебе и приделал. На всякий случай добавил круглую и пару мелких. Ну и картинку ... Короче выслал на мыло

Dima: Получил но они не фига не прозрачные...................

Dima: Скрины , разница очевидна ;) Из viaopen Твой пример

ММК: Dima пишет: Скрины , разница очевидна ;) Точно , а у меня на мониторе не видать :(

alkresin: Просто "прозрачных" bmp'шек нет, есть специальная техника их вырисовывания ( там употребляются такие непонятные мне слова, как Anti-Aliasing and Alpha-Blending ) - см. http://www.codeproject.com/buttonctrl/TransButtonDemo.asp

Петр: gfilatov пишет: Обратите внимание на новый пример (из поставки build 28) в папке Advanced\Transparency, имеющий подобную функциональность Что-то подобное есть и в Advanced\Circle. А поскольку SetLayeredWindowAttributes с LWA_ALPHA уже фигурирует в 3 примерах, я подумал что LWA_COLORKEY тоже заслуживает внимания #include "minigui.ch" PROCEDURE Main DEFINE WINDOW Form_1 ; AT 230, 335 ; WIDTH 450 ; HEIGHT 350 ; TITLE 'Transparency Sample #2' ; MAIN DEFINE LISTBOX ListBox_1 ROW 0 COL 1 WIDTH 440 HEIGHT 160 ITEMS { ' - 01 -' , ' - 02 -' , ' - 03 -' } BACKCOLOR {0,0,0} FONTCOLOR {0,255,0} FONTBOLD .T. VALUE 2 END LISTBOX DEFINE BUTTON Button_1 ROW 220 COL 170 WIDTH 250 HEIGHT 28 CAPTION "Set Black color transparency ON" ACTION SetColorTransparency (_HMG_MainHandle, 0) FLAT .T. END BUTTON DEFINE BUTTON Button_2 ROW 260 COL 170 WIDTH 250 HEIGHT 28 CAPTION "Set Black Color Transparency OFF" ACTION SetTransparency (_HMG_MainHandle, 255) FLAT .T. END BUTTON END WINDOW CENTER WINDOW Form_1 ACTIVATE WINDOW Form_1 Return #define GWL_EXSTYLE (-20) #define WS_EX_LAYERED 524288 #define LWA_COLORKEY 1 #define LWA_ALPHA 2 /* */ FUNCTION SetTransparency( hWnd, nAlpha ) LOCAL nRet, lRet := .F. IF nAlpha < 0 nAlpha := 0 ELSEIF nAlpha > 255 nAlpha := 255 ENDIF SetWindowLong( hWnd, GWL_EXSTYLE, C_OR( GetWindowLong( hWnd, GWL_EXSTYLE ), WS_EX_LAYERED ) ) nRet := SetLayeredWindowAttributes( hWnd, 0, nAlpha, LWA_ALPHA ) IF VALTYPE(nRet) == 'N' lRet := ( nRet > 0 ) ENDIF /* */ FUNCTION SetColorTransparency( hWnd, nColor ) LOCAL nRet, lRet := .F. SetWindowLong( hWnd, GWL_EXSTYLE, C_OR( GetWindowLong( hWnd, GWL_EXSTYLE ), WS_EX_LAYERED ) ) nRet := SetLayeredWindowAttributes( hWnd, nColor, 0, LWA_COLORKEY ) IF VALTYPE(nRet) == 'N' lRet := ( nRet > 0 ) ENDIF RETURN( lRet ) /* SetLayeredWindowAttributes WRAPPER. The SetLayeredWindowAttributes function sets the opacity and transparency color key of a layered window. Parameters: - hwnd Handle to the layered window. - crKey Pointer to a COLORREF value that specifies the transparency color key to be used. (When making a certain color transparent...). - bAlpha Alpha value used to describe the opacity of the layered window. 0 = Invisible, 255 = Fully visible - dwFlags Specifies an action to take. This parameter can be LWA_COLORKEY (When making a certain color transparent...) or LWA_ALPHA. */ DECLARE DLL_TYPE_BOOL SetLayeredWindowAttributes( ; DLL_TYPE_LONG hWnd, DLL_TYPE_INT crKey, DLL_TYPE_UINT bAlpha, DLL_TYPE_DWORD dwFlags ) ; IN USER32.DLL #pragma BEGINDUMP #define HB_OS_WIN_32_USED #define _WIN32_WINNT 0x0400 #include <windows.h> #include "hbapi.h" #include "hbapiitm.h" HB_FUNC ( SETWINDOWLONG ) { hb_retnl( SetWindowLong( (HWND) hb_parnl(1), hb_parni(2), hb_parnl(3) ) ); } HB_FUNC( C_AND ) { hb_retnl( hb_parnl(1) & hb_parnl(2) ) ; } HB_FUNC( C_OR ) { hb_retnl( hb_parnl(1) | hb_parnl(2) ) ; } HB_FUNC( C_NOT ) { hb_retnl( ~hb_parnl(1) ) ; } #pragma ENDDUMP

gfilatov: Петр Большое спасибо! Обязательно использую этот пример в следующем релизе. Как Вас представить в истории изменений?

Петр: Petr Chornyj <myorg63@mail.ru>

Dima: Пробнул в FW сделать прозрачную форму и не получилось.... Покажите на примере , как. Сиба ;)

Петр: C FW не работал - ничего определенного не скажу. Но функция HB_FUNC( SETTRANSPARENT) из примера SerLog должна работать ( в Win2000 and later конечно). Т.е. есть форма, на форме - кнопка. В обработчике кнопки пишем, к примеру, выполнить SetTransparent (hWnd, 125), где hWnd хендл окна, если не знаем hWnd заменяем pfnSetLayeredWindowAttributes((HWND) hb_parnl (1), 0, hb_parni (2), LWA_ALPHA); на pfnSetLayeredWindowAttributes( GetActiveWindow(), 0, hb_parni (2), LWA_ALPHA); Но наверное в FW доступ к хэндлам окон все таки как то организован.

Dima: Вот собственно пример......не работает прозрачность..... #include "FiveWin.ch" static oWnd,hdc function Main() local oDlg, lExit := .f., oBtn,obtn1 DEFINE dialog oDlg FROM 5, 15 TO 20, 50 TITLE "TEST" @ 3, 4 BUTTON oBtn1 PROMPT "TEST" OF oDlg SIZE 40, 12 ; ACTION ( hdc:=odlg:getdc(),SETTRANSPARENT(hdc,255)) @ 3, 12 BUTTON oBtn PROMPT "Cancel" OF oDlg SIZE 40, 12 ; ACTION (lExit := .t., oDlg:End()) ACTIVATE dialog oDlg CENTERED VALID lExit return nil //----------------------------------------------------------------------------// #pragma BEGINDUMP #define _WIN32_IE 0x0500 #define HB_OS_WIN_32_USED #define _WIN32_WINNT 0x0400 #define WS_EX_LAYERED 0x80000 #define LWA_ALPHA 0x02 #define GWL_EXSTYLE (-20) #include <windows.h> #include "hbapi.h" #include<stdio.h> #include<string.h> #include<shellapi.h> HB_FUNC( SETTRANSPARENT) { typedef BOOL (__stdcall *PFN_SETLAYEREDWINDOWATTRIBUTES)(HWND,COLORREF,BYTE,DWORD); PFN_SETLAYEREDWINDOWATTRIBUTES pfnSetLayeredWindowAttributes = NULL; HINSTANCE hLib = LoadLibrary("user32.dll"); if (hLib != NULL) { pfnSetLayeredWindowAttributes = (PFN_SETLAYEREDWINDOWATTRIBUTES)GetProcAddress(hLib,"SetLayeredWindowAttributes"); } if (pfnSetLayeredWindowAttributes) { SetWindowLong((HWND) hb_parnl (1),GWL_EXSTYLE,GetWindowLong((HWND) hb_parnl (1),GWL_EXSTYLE) | WS_EX_LAYERED); pfnSetLayeredWindowAttributes((HWND) hb_parnl (1), 0, hb_parni (2), LWA_ALPHA); } if (!hLib) { FreeLibrary(hLib); } } #pragma ENDDUMP

Петр: Dima пишет: @ 3, 4 BUTTON oBtn1 PROMPT "TEST" OF oDlg SIZE 40, 12 ; ACTION ( hdc:=odlg:getdc(),SETTRANSPARENT(hdc,255)) Почему getdc(), это наверное возвращает контекст устройства, а не хэндл окна

saulius: ACTION ( hdc:=odlg:getdc(),SETTRANSPARENT(hdc,255)) : hdc заменяем oDlg

saulius: то есть oDlg:hWnd

Петр: И еще SETTRANSPARENT(hdc,255) - при значении Alpha :=255 тяжело будет увидеть прозрачность

Dima: Виноват, все работает. Переделал кусок @ 3, 4 BUTTON oBtn1 PROMPT "TEST" OF oDlg SIZE 40, 12 ; ACTION ( chdc:=GetActiveWindow(),SETTRANSPARENT(chdc,125))

Dima: По ходу еще вопрос ;) Прозрачным становистя все что внутри этого окна в том числе и элементы управления (в моем случае кнопки) Можно ли сделать так что бы прозрачность не затрагивала кнопки или скажем затрагивала только кнопки ? ЗЫ Прошу извинить за возможно тупые вопросы .......на FW не писал , просто пока "балуюсь"



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