Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Прозрачное окно / 9 сообщений из 9, страница 1 из 1
16.10.2006, 09:47
    #34056209
Прозрачное окно
Доброго времени суток!
Нужно используя только WinApi на C++ реализовать POPUP окно с прозрачным фоном. Может кто подскажет, как это сделать?
...
Рейтинг: 0 / 0
16.10.2006, 10:01
    #34056244
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прозрачное окно
Денис ФадинДоброго времени суток!
Нужно используя только WinApi на C++ реализовать POPUP окно с прозрачным фоном. Может кто подскажет, как это сделать?

Насколько я помню, POPUP окно имеет теже корни, что и обычное. Может помогут следующие делфевские исходники:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
 unit  UnitMain;

 interface 

 uses 
  Windows, Messages, Graphics, Controls, Forms, ExtCtrls, Classes;

 type 
  TFormMain =  class (TForm)
    ImageFormMain: TImage;
    Timer: TTimer;
     procedure  FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
     procedure  FormCreate(Sender: TObject);
     procedure  TimerTimer(Sender: TObject);
   private 
     { Private declarations } 
   public 
     { Public declarations } 
   end ;

 var 
  FormMain: TFormMain;
  R: HRgn;

 implementation 

 {$R *.dfm} 

 procedure  TFormMain.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
 begin 
   If  ssLeft  In  Shift  Then 
   Begin 
    ReleaseCapture;
    SendMessage(Handle,WM_NCLBUTTONDOWN,HTCAPTION, 0 );
   End ;
 end ;

 procedure  TFormMain.FormCreate(Sender: TObject);
 Var 
  X1,X,Y: Integer;
 begin 
  X1 := - 1 ;
  R := CreateRectRgn( 0 , 0 , 0 , 0 );

  ImageFormMain.Picture.LoadFromFile('1.bmp');
  FormMain.BorderStyle := bsNone;
  FormMain.Height := ImageFormMain.Picture.Bitmap.Height;
  FormMain.Width := ImageFormMain.Picture.Bitmap.Width;

   With  ImageFormMain.Picture.Bitmap  Do 
     For  Y :=  0   To  Height- 1   Do 
       For  X :=  0   To  Width- 1   Do 
         If  Canvas.Pixels[X,Y] <> Canvas.Pixels[ 0 , 0 ]  Then 
           Begin   If  X1=- 1   Then  X1 := X;  End 
         Else 
           If  X1>- 1   Then 
           Begin 
            CombineRgn(R,R,CreateRectRgn(X1,Y,X- 1 ,Y+ 1 ),RGN_OR);
            X1 := - 1 ;
           End ;
  SetWindowRgn(Handle, R, True);
  SetWindowLong(Handle, GWL_EXSTYLE, WS_EX_LAYERED);
 end ;

 procedure  TFormMain.TimerTimer(Sender: TObject);
 begin 
  If  Timer.Tag =  255   Then  Timer.Tag := - 255 ;
  If  Timer.Tag >  0   Then 
   SetLayeredWindowAttributes(Handle,  0 , Timer.Tag, LWA_ALPHA)
  Else 
   SetLayeredWindowAttributes(Handle,  0 , -Timer.Tag, LWA_ALPHA);
 Timer.Tag := Timer.Tag+ 1 ;

 end ;


...
Рейтинг: 0 / 0
16.10.2006, 10:07
    #34056259
Прозрачное окно
Akh Денис ФадинДоброго времени суток!
Нужно используя только WinApi на C++ реализовать POPUP окно с прозрачным фоном. Может кто подскажет, как это сделать?

Насколько я помню, POPUP окно имеет теже корни, что и обычное. Может помогут следующие делфевские исходники:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
 unit  UnitMain;

 interface 

 uses 
  Windows, Messages, Graphics, Controls, Forms, ExtCtrls, Classes;

 type 
  TFormMain =  class (TForm)
    ImageFormMain: TImage;
    Timer: TTimer;
     procedure  FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
     procedure  FormCreate(Sender: TObject);
     procedure  TimerTimer(Sender: TObject);
   private 
     { Private declarations } 
   public 
     { Public declarations } 
   end ;

 var 
  FormMain: TFormMain;
  R: HRgn;

 implementation 

 {$R *.dfm} 

 procedure  TFormMain.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
 begin 
   If  ssLeft  In  Shift  Then 
   Begin 
    ReleaseCapture;
    SendMessage(Handle,WM_NCLBUTTONDOWN,HTCAPTION, 0 );
   End ;
 end ;

 procedure  TFormMain.FormCreate(Sender: TObject);
 Var 
  X1,X,Y: Integer;
 begin 
  X1 := - 1 ;
  R := CreateRectRgn( 0 , 0 , 0 , 0 );

  ImageFormMain.Picture.LoadFromFile('1.bmp');
  FormMain.BorderStyle := bsNone;
  FormMain.Height := ImageFormMain.Picture.Bitmap.Height;
  FormMain.Width := ImageFormMain.Picture.Bitmap.Width;

   With  ImageFormMain.Picture.Bitmap  Do 
     For  Y :=  0   To  Height- 1   Do 
       For  X :=  0   To  Width- 1   Do 
         If  Canvas.Pixels[X,Y] <> Canvas.Pixels[ 0 , 0 ]  Then 
           Begin   If  X1=- 1   Then  X1 := X;  End 
         Else 
           If  X1>- 1   Then 
           Begin 
            CombineRgn(R,R,CreateRectRgn(X1,Y,X- 1 ,Y+ 1 ),RGN_OR);
            X1 := - 1 ;
           End ;
  SetWindowRgn(Handle, R, True);
  SetWindowLong(Handle, GWL_EXSTYLE, WS_EX_LAYERED);
 end ;

 procedure  TFormMain.TimerTimer(Sender: TObject);
 begin 
  If  Timer.Tag =  255   Then  Timer.Tag := - 255 ;
  If  Timer.Tag >  0   Then 
   SetLayeredWindowAttributes(Handle,  0 , Timer.Tag, LWA_ALPHA)
  Else 
   SetLayeredWindowAttributes(Handle,  0 , -Timer.Tag, LWA_ALPHA);
 Timer.Tag := Timer.Tag+ 1 ;

 end ;




Спасибо за ответ, но я думаю что создание региона посредством просмотра картинки по пикселам работает достаточно долго, а у меня в приладе это встречается повсюду.
...
Рейтинг: 0 / 0
16.10.2006, 10:15
    #34056277
Dmitrii K.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прозрачное окно
...
Рейтинг: 0 / 0
16.10.2006, 10:16
    #34056279
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прозрачное окно
Денис ФадинСпасибо за ответ, но я думаю что создание региона посредством просмотра картинки по пикселам работает достаточно долго, а у меня в приладе это встречается повсюду.

Картинка тут не причем. Ключевые моменты в организации (полу)прозрачной области CreateRect и CombineRgn. Задавать, есстественно, можно не только размерами в 1 пиксель. Для полупрозрачного окна можно использовать только один CreateRect.
...
Рейтинг: 0 / 0
16.10.2006, 13:30
    #34057008
Прозрачное окно
AkhКартинка тут не причем. Ключевые моменты в организации (полу)прозрачной области CreateRect и CombineRgn. Задавать, есстественно, можно не только размерами в 1 пиксель. Для полупрозрачного окна можно использовать только один CreateRect.

Я думаю, что в моем случае одним CreateRectRgn не обойтись. Мне нужно получить возможность создания окно со сколько угодно разными прозрачными областями, совершенно произвольной формы.
Например, нужно поместить на окно некий контрол, также имеющий прозрачные области, так, чтобы вся остальная часть данного окна стала прозрачной. Таких контролов на окне может быть несколько.
...
Рейтинг: 0 / 0
16.10.2006, 13:32
    #34057018
Прозрачное окно
Dmitrii K.WS_EX_TRANSPARENT ?

http://msdn2.microsoft.com/de-de/library/61fe4bte.aspx

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/createwindowex.asp

Работает больно стремно! Сколько раз не пробовал, так и не смог получить окончательно адекватную функциональность.
...
Рейтинг: 0 / 0
16.10.2006, 13:43
    #34057079
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прозрачное окно
Денис ФадинЯ думаю, что в моем случае одним CreateRectRgn не обойтись. Мне нужно получить возможность создания окно со сколько угодно разными прозрачными областями, совершенно произвольной формы.
Например, нужно поместить на окно некий контрол, также имеющий прозрачные области, так, чтобы вся остальная часть данного окна стала прозрачной. Таких контролов на окне может быть несколько.

Вообщем, не знаю. Этот пример я просто потестил, только ради интереса. Раз не подходит, значит не обессудь.
...
Рейтинг: 0 / 0
16.10.2006, 14:19
    #34057254
Прозрачное окно
AkhВообщем, не знаю. Этот пример я просто потестил, только ради интереса. Раз не подходит, значит не обессудь.

Спасибо и на этом!
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Прозрачное окно / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]