powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Прозрачное окно
9 сообщений из 9, страница 1 из 1
Прозрачное окно
    #34056209
Доброго времени суток!
Нужно используя только WinApi на C++ реализовать POPUP окно с прозрачным фоном. Может кто подскажет, как это сделать?
...
Рейтинг: 0 / 0
Прозрачное окно
    #34056244
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
Прозрачное окно
    #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
Прозрачное окно
    #34056277
Dmitrii K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Прозрачное окно
    #34056279
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Денис ФадинСпасибо за ответ, но я думаю что создание региона посредством просмотра картинки по пикселам работает достаточно долго, а у меня в приладе это встречается повсюду.

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

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

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

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


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