Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 370

/ вопрос открыт /

Есть форма, на которой TImage с иконкой 32bpp. Если фон формы сделать прозрачным, то 32-битная тень исчезнет. Как сделать, чтобы форма не отображалась, а изображение (с альфа каналом), которое на ней находится, было видно.

Иван-488 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Иван-488 (статус: Посетитель)
Вопрос отправлен: 3 марта 2007, 21:35
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: ANBsoft

Этот пример делает овальную форму, дальше думаю можно будет разобраться.

Приложение:
  1. var
  2. FRgn,ERgn:HRGN;
  3.  
  4. procedure TFormStart.FormCreate(Sender: TObject);
  5. begin
  6. FRgn:=CreateRectRgn(0,0,Width,Height);
  7. ERgn:=CreateEllipticRgn(-20,-45,Width+20,Height+45);
  8. CombineRgn(FRgn,FRgn,ERgn,RGN_AND);
  9. SetWindowRgn(Handle,FRgn,True);
  10. end;
  11.  
  12. procedure TFormStart.FormDestroy(Sender: TObject);
  13. begin
  14. DeleteObject(FRgn);
  15. DeleteObject(ERgn);
  16. end;
  17.  
  18.  


Ответ отправил: ANBsoft (статус: Студент)
Время отправки: 4 марта 2007, 10:03

Ответ #2. Отвечает эксперт: Роман

Здравствуйте, Иван!Вот вам примерчик.MaskBmp-альфаканал,белый цвет будет прозрачным,и соотверственно в этих местах форма будет прозрачной.

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. procedure FormCreate(Sender: TObject);
  12. private
  13. { Private declarations }
  14. public
  15. { Public declarations }
  16. end;
  17.  
  18. var
  19. Form1: TForm1;
  20. plg:array[0..5] of TPoint;
  21. ap:TPoint;
  22. implementation
  23.  
  24. {$R *.dfm}
  25. function BitmapToRgn(Image: TBitmap): HRGN;
  26. var
  27. TmpRgn: HRGN;
  28. x, y: integer;
  29. ConsecutivePixels: integer;
  30. CurrentPixel: TColor;
  31. CreatedRgns: integer;
  32. CurrentColor: TColor;
  33. begin
  34. CreatedRgns := 0;
  35. Result := CreateRectRgn(0, 0, Image.Width, Image.Height);
  36. inc(CreatedRgns);
  37.  
  38. if (Image.Width = 0) or (Image.Height = 0) then
  39. exit;
  40.  
  41. for y := 0 to Image.Height - 1 do
  42. begin
  43. CurrentColor := Image.Canvas.Pixels[0,y];
  44. ConsecutivePixels := 1;
  45. for x := 0 to Image.Width - 1 do
  46. begin
  47. CurrentPixel := Image.Canvas.Pixels[x, y];
  48.  
  49. if CurrentColor = CurrentPixel then
  50. inc(ConsecutivePixels)
  51. else
  52. begin
  53.  
  54. if CurrentColor = clWhite then
  55. begin
  56. TmpRgn := CreateRectRgn(x - ConsecutivePixels, y, x, y + 1);
  57. CombineRgn(Result, Result, TmpRgn, RGN_DIFF);
  58. inc(CreatedRgns);
  59. DeleteObject(TmpRgn);
  60. end;
  61. CurrentColor := CurrentPixel;
  62. ConsecutivePixels := 1;
  63. end;
  64. end;
  65.  
  66. if (CurrentColor = clWhite) and (ConsecutivePixels > 0) then
  67. begin
  68. TmpRgn := CreateRectRgn(x-ConsecutivePixels, y, x, y+1);
  69. CombineRgn(Result, Result, TmpRgn, RGN_DIFF);
  70. inc(CreatedRgns);
  71. DeleteObject(TmpRgn);
  72. end;
  73. end;
  74. end;
  75.  
  76. procedure TForm1.FormCreate(Sender: TObject);
  77. var
  78. MaskBmp: TBitmap;
  79. begin
  80. MaskBmp := TBitmap.Create;
  81. try
  82. MaskBmp.LoadFromFile('D:1.bmp');
  83. Height := MaskBmp.Height;
  84. Width := MaskBmp.Width;
  85.  
  86. SetWindowRgn(Self.Handle, BitmapToRgn(MaskBmp), True);
  87. finally
  88. MaskBmp.Free;
  89. end;
  90. end;
  91.  
  92. end.
  93.  


Ответ отправил: Роман (статус: 5-ый класс)
Время отправки: 4 марта 2007, 12:39


Мини-форум вопроса

Всего сообщений: 4; последнее сообщение — 20 марта 2007, 16:37; участников в обсуждении: 2.
Иван-488

Иван-488 (статус: Посетитель), 16 марта 2007, 18:11 [#1]:

Уважаемые эксперты, вы меня не поняли! Мне нужно сделать прозрачной главную форму, но если делать это через Transparen, то от значка, например, отсекается альфа-канал (это не только прозрачный цвет, но и множество полупрозрачных).
Для наглядности, посмотрите рисунок (справа то, чего и нужно добиться):
(файл удалён)
Роман

Роман (статус: 5-ый класс), 16 марта 2007, 19:11 [#2]:

Иван,а чем вам не нравится тот вариант который я предложил?MaskBmp - это реально альфа-канал,тоесть белым цветом рисуете то чего недолжно быть видно,а черным - то что должно остаться,и функция SetWindowRgn(Self.Handle, BitmapToRgn(MaskBmp), True) создаст форму нужной конфигурации,а цветной рисунок накладывается отдельно на форму(хоть на canvas,хоть на Timage или paintbox) и будет вам счастье,главное правильно нарисуйте альфа-канал который грузится в MaskBmp.Или же если нет то действуйте радикальнее: используйте TSkinForm или Varian Skin Factory, но и там принцип тотже что и в примере(!)-ЧЕРЕЗ АЛЬФА-КАНАЛ.
Роман

Роман (статус: 5-ый класс), 16 марта 2007, 19:17 [#3]:

...P.S...ВЫ В 2D ИГРАХ ВИДЕЛИ КАК РИСУЮТСЯ СПРАЙТЫ?...
Иван-488

Иван-488 (статус: Посетитель), 20 марта 2007, 16:37 [#4]:

Посмотрите на рисунок справа. Тень от значка является альфа-каналом -- пиксели снаружи более прозрачные, а внутри - менее (так сказать с разным AlphaBlendValue). При перемещении формы тень должна меняться, в зависимости от того, что находится под формой. Как этого добиться без Handl'a экрана.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:40
Выполнено за 0.02 сек.