|
Вопрос # 370/ вопрос открыт / |
|
Есть форма, на которой TImage с иконкой 32bpp. Если фон формы сделать прозрачным, то 32-битная тень исчезнет. Как сделать, чтобы форма не отображалась, а изображение (с альфа каналом), которое на ней находится, было видно.
 |
Вопрос задал: Иван-488 (статус: Посетитель)
Вопрос отправлен: 3 марта 2007, 21:35
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: ANBsoft
Этот пример делает овальную форму, дальше думаю можно будет разобраться.
Приложение: Переключить в обычный режим- var
- FRgn,ERgn:HRGN;
-
- procedure TFormStart.FormCreate(Sender: TObject);
- begin
- FRgn:=CreateRectRgn(0,0,Width,Height);
- ERgn:=CreateEllipticRgn(-20,-45,Width+20,Height+45);
- CombineRgn(FRgn,FRgn,ERgn,RGN_AND);
- SetWindowRgn(Handle,FRgn,True);
- end;
-
- procedure TFormStart.FormDestroy(Sender: TObject);
- begin
- DeleteObject(FRgn);
- DeleteObject(ERgn);
- end;
-
-
 |
Ответ отправил: ANBsoft (статус: Студент)
Время отправки: 4 марта 2007, 10:03
|
Ответ #2. Отвечает эксперт: Роман
Здравствуйте, Иван!Вот вам примерчик.MaskBmp-альфаканал,белый цвет будет прозрачным,и соотверственно в этих местах форма будет прозрачной.
Приложение: Переключить в обычный режим- unit Unit1;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs;
-
- type
- TForm1 = class(TForm)
- procedure FormCreate(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
- var
- Form1: TForm1;
- plg:array[0..5] of TPoint;
- ap:TPoint;
- implementation
-
- {$R *.dfm}
- function BitmapToRgn(Image: TBitmap): HRGN;
- var
- TmpRgn: HRGN;
- x, y: integer;
- ConsecutivePixels: integer;
- CurrentPixel: TColor;
- CreatedRgns: integer;
- CurrentColor: TColor;
- begin
- CreatedRgns := 0;
- Result := CreateRectRgn(0, 0, Image.Width, Image.Height);
- inc(CreatedRgns);
-
- if (Image.Width = 0) or (Image.Height = 0) then
- exit;
-
- for y := 0 to Image.Height - 1 do
- begin
- CurrentColor := Image.Canvas.Pixels[0,y];
- ConsecutivePixels := 1;
- for x := 0 to Image.Width - 1 do
- begin
- CurrentPixel := Image.Canvas.Pixels[x, y];
-
- if CurrentColor = CurrentPixel then
- inc(ConsecutivePixels)
- else
- begin
-
- if CurrentColor = clWhite then
- begin
- TmpRgn := CreateRectRgn(x - ConsecutivePixels, y, x, y + 1);
- CombineRgn(Result, Result, TmpRgn, RGN_DIFF);
- inc(CreatedRgns);
- DeleteObject(TmpRgn);
- end;
- CurrentColor := CurrentPixel;
- ConsecutivePixels := 1;
- end;
- end;
-
- if (CurrentColor = clWhite) and (ConsecutivePixels > 0) then
- begin
- TmpRgn := CreateRectRgn(x-ConsecutivePixels, y, x, y+1);
- CombineRgn(Result, Result, TmpRgn, RGN_DIFF);
- inc(CreatedRgns);
- DeleteObject(TmpRgn);
- end;
- end;
- end;
-
- procedure TForm1.FormCreate(Sender: TObject);
- var
- MaskBmp: TBitmap;
- begin
- MaskBmp := TBitmap.Create;
- try
- MaskBmp.LoadFromFile('D:1.bmp');
- Height := MaskBmp.Height;
- Width := MaskBmp.Width;
-
- SetWindowRgn(Self.Handle, BitmapToRgn(MaskBmp), True);
- finally
- MaskBmp.Free;
- end;
- end;
-
- end.
-
 |
Ответ отправил: Роман (статус: 5-ый класс)
Время отправки: 4 марта 2007, 12:39
|
Мини-форум вопроса
Всего сообщений: 4; последнее сообщение — 20 марта 2007, 16:37; участников в обсуждении: 2.
|
Иван-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 (статус: Посетитель), 20 марта 2007, 16:37 [#4]:
Посмотрите на рисунок справа. Тень от значка является альфа-каналом -- пиксели снаружи более прозрачные, а внутри - менее (так сказать с разным AlphaBlendValue). При перемещении формы тень должна меняться, в зависимости от того, что находится под формой. Как этого добиться без Handl'a экрана.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|