On-line: Andrey, Dr. Oldwarez, гостей 0. Всего: 2 [подробнее..]
АвторСообщение



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 06.12.06 09:37. Заголовок: MiniGUI Прозрачная форма


Может кому надо!

Пример формирования прозрачной формы.
Работает в 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


Спасибо: 0 
Цитата Ответить
Ответов - 26 , стр: 1 2 All [только новые]


модератор




Пост N: 364
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 06.12.06 11:49. Заголовок: Re:


SerLog пишет:

 цитата:
Может кому надо


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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 502
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 07.12.06 18:32. Заголовок: Re:


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 195
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.12.06 17:29. Заголовок: Re:


Подскажите пожалуйста как реализовать следующую вещь:

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

Спасибо: 0 
ПрофильЦитата Ответить



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 27.12.06 10:42. Заголовок: Re:


Dima пишет:

 цитата:
Интерестно а можно ли сделать прозрачные кнопки ?
Выглядит очень даже ни чего ;)
Скажем как вот тут


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

Спасибо: 0 
Цитата Ответить
администратор




Пост N: 566
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 27.12.06 11:08. Заголовок: Re:


ММК пишет:

 цитата:
У тебя нет такой коллекции? :))


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

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 127
Зарегистрирован: 08.11.05
ссылка на сообщение  Отправлено: 27.12.06 11:31. Заголовок: Re:


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

Спасибо: 0 
ПрофильЦитата Ответить



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 27.12.06 15:26. Заголовок: Re:


Dima пишет:

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


Идею ты понял правильно :))Пришли мне "кнопку" , т.е. три ( можешь две) вмпэшки.
Первая , когда она ( кнопка) прозрачная, а вторая когда на нее н"нажимаешь"
Так же делается и меню.
Тебе пример на мыло?

Спасибо: 0 
Цитата Ответить
администратор




Пост N: 567
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 27.12.06 15:40. Заголовок: Re:


ММК пишет:

 цитата:
Пришли мне "кнопку"


Ищу такие кнопки уже час........пока не вижу
Иконок как га#на а кнопок нет ;)


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 568
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 27.12.06 15:50. Заголовок: Re:


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

Спасибо: 0 
ПрофильЦитата Ответить



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 28.12.06 12:41. Заголовок: Re:


Dima пишет:

 цитата:
вытащил от туда кнопки , которые тебе и отправил.
Жду примера или тут или на мыло ;)


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

Спасибо: 0 
Цитата Ответить
администратор




Пост N: 572
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 28.12.06 12:54. Заголовок: Re:


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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 573
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 28.12.06 13:14. Заголовок: Re:


Скрины , разница очевидна ;)
Из viaopen
[реклама вместо картинки]
Твой пример
[реклама вместо картинки]

Спасибо: 0 
ПрофильЦитата Ответить



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 28.12.06 15:24. Заголовок: Re:


Dima пишет:

 цитата:
Скрины , разница очевидна ;)


Точно , а у меня на мониторе не видать :(


Спасибо: 0 
Цитата Ответить
moderator


Пост N: 18
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 29.12.06 09:46. Заголовок: Re:


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 82
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 04.01.07 22:00. Заголовок: Re:


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


Спасибо: 0 
ПрофильЦитата Ответить
модератор




Пост N: 401
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 05.01.07 00:02. Заголовок: Re:


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


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 83
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 05.01.07 09:39. Заголовок: Re:


Petr Chornyj <myorg63@mail.ru>

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 576
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 05.01.07 14:13. Заголовок: Re:


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 84
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 05.01.07 14:40. Заголовок: Re:


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 доступ к хэндлам окон все таки как то организован.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 577
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 05.01.07 15:14. Заголовок: Re:


Вот собственно пример......не работает прозрачность.....

#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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 85
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 05.01.07 15:24. Заголовок: Re:


Dima пишет:

 цитата:
@ 3, 4 BUTTON oBtn1 PROMPT "TEST" OF oDlg SIZE 40, 12 ;
ACTION ( hdc:=odlg:getdc(),SETTRANSPARENT(hdc,255))



Почему getdc(), это наверное возвращает контекст устройства, а не хэндл окна

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 30
Зарегистрирован: 27.04.06
ссылка на сообщение  Отправлено: 05.01.07 15:25. Заголовок: Re:


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

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 31
Зарегистрирован: 27.04.06
ссылка на сообщение  Отправлено: 05.01.07 15:28. Заголовок: Re:


то есть oDlg:hWnd

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 86
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 05.01.07 15:29. Заголовок: Re:


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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 578
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 05.01.07 15:35. Заголовок: Re:


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


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 579
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 05.01.07 15:46. Заголовок: Re:


По ходу еще вопрос ;)
Прозрачным становистя все что внутри этого окна в том числе и элементы управления (в моем случае кнопки)
Можно ли сделать так что бы прозрачность не затрагивала кнопки или скажем затрагивала только кнопки ?

ЗЫ
Прошу извинить за возможно тупые вопросы .......на FW не писал , просто пока "балуюсь"

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 26 , стр: 1 2 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 119
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет