![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сделать определенную область в image прозрачной [D7, WinXP]
Grol © (2005-11-02 18:04:00)Вообщем из темы наверное все понятно. Но могу пояснить. На форме есть Image1 и Image2. Image2 соответственно поверх Image1. В Formcreate закрашиваю их цветом. ДЛя Image2 создал процедуру MouseMove, там отлавливаю координаты мышки и рисую круг относительно этих координат в Image2. Мне нужно сделать так, чтоб тот круг, который я рисую в Image2 был прозрачным на сквозь, так, чтоб было видно Image1, который находится под Image2. Короче там в проекте все есть. :) Спасибо...
GrayFace (2005-11-15 10:44:00) [1]> Вот код создания дырки в форме
DeleteObject(EllRg) не хватает.
Так. Для сабжа надо всего лишь рисовать круг... Например так:
Image1 - светящаяся картинка, невидимый.
Circle,b:TBitmap;
b.Width:=2*r; (r - радиус)
b.Height:=2*r;
b.TransparentColor:=clTrans; (clTrans - цвет, которого нет в Image1)
OnMouseMove:
Image2.Canvas.CopyRect(Rect(lx-r,ly-r,lx+r,ly+r), Image2.Picture.Bitmap.Canvas, Rect(lx-r,ly-r,lx+r,ly+r));
with Circle, Canvas do
begin
Brush.Color:=clTrans;
FillRect(ClipRect);
Brush.Color:=clBlack;
Ellipse(ClipRect);
Transparent:=true;
TransparentColor:=clBlack;
end;
with b do
begin
CopyRect(ClipRect, Image1.Picture.Bitmap.Canvas, Rect(x-r,y-r,x+r,y+r));
Draw(0,0, Circle);
end;
Image2.Canvas.Draw(x-r, y-r, b);
lx:=x;
ly:=y;
Мерцание будет, но мало.
Antonn (2005-11-15 10:32:00) [2]злобная танька © (15.11.05 9:40) [19]
но еще лучше просто BitBlt.
угу, но разница в скорости со stretchbit не особо заметно. Да и вопросов меньше при использовании canvas.copyrect, там аргументов меньше :)
злобная танька (2005-11-15 09:40:00) [3]
> злобная танька © (15.11.05 09:06) [18]
гм посмотрела в TCanvas да действительно для данного примера copyRect будет ловчее. но еще лучше просто BitBlt. CopyRect использует ф-цию stratchBlt я подозреваю шо она медленнее работает плюс сам метод что то там делает ерунду всякую.
злобная танька (2005-11-15 09:06:00) [4]
> Antonn © (15.11.05 05:17) [17]
почему?
Antonn (2005-11-15 05:17:00) [5]
> вызывать только метод draw
лучше только canvas.copyrect()
злобная танька (2005-11-14 22:07:00) [6]у.. не знаю. у меня ничего не мерцает..
а вобще от мерцаниев можно избавиться если производить все операции с картинками на каком-нибудь TBitmap в памяти а для имейджа где это всё должно по идее отображаться вызывать только метод draw и рисовать на него то что в итоге получилось. при таком подходе может мерцать только на очень тупых компах типо как у нас в инстетуте.
Grol (2005-11-14 21:43:00) [7]Да работает, только вот эти вредные капризные мерцания...эх у меня аж в глазах заребило. Что делать как от них избавиться?
злобная танька (2005-11-13 21:40:00) [8]ЗЫ
не совсеми картинками работает точнее даже только с BMP. т.е. в имейдж должен быть загружен bmp.
злобная танька (2005-11-13 21:39:00) [9]
> grol © (13.11.05 21:30) [10]
ну шо?
работаит?
grol (2005-11-13 21:30:00) [10]PAVIA я понял тебя, спасибо тебе.
Ладно...:) скажу зачем это мне нужно, т.е дыра в Image. Мне нужно сделать как бы эффекта фонарика. То есть я вожу по верхнему Imagu мышкой и у меня вырисовывается круг, круг прозрачный, и видно нижний Image. А верхнюю картинку я затемнил в Photoshope и вставил в верхний Image. Но проблема состоит в том, что когда верхний Image делаешь transparent, то появляются мерцания. :((( А в OpenGL я программировать не умею. Вот такая проблема :( Просто я думаю, что через регионы проблема решиться.
PAVIA (2005-11-13 19:06:00) [11]Ты меня немного не понял.
Берем первый image загружаем рисунок.
на него кладем второй image.
в form OnCreate
image2.Transparent:=true; //разрешаем прозрачность
image2.Picture.Bitmap.TransparentColor:=clWhite ;//устанавливаешь прозрачный цвет к примеру белый. И все что ты на рисуешь эти цветом, то и будет прозрачным.
Grol (2005-11-13 18:40:00) [12]Спасибо, ща заценю...:)))
злобная танька (2005-11-13 12:40:00) [13]не уверена шо поняла задачу автора но может это прокатит:
var
Form1: TForm1;
Over, Under: TBitmap;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
over := TBitmap.Create;
over.Width := IMG.Width;
over.Height := IMG.Height;
under := TBitmap.Create;
under.Assign(IMG.Picture.Bitmap);
over.Canvas.Brush.Color := clBlack;
over.Canvas.FillRect(Rect(0,0, IMG.Width, IMG.Height));
IMG.Canvas.Draw(0, 0, Over);
end;
procedure TForm1.IMGMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
over.Canvas.Brush.Color := clBlack;
over.Canvas.FillRect(Rect(0,0, IMG.Width, IMG.Height));
over.Canvas.Brush.Color := clWhite;
over.Canvas.Ellipse(X - 20, Y - 20, X + 20, Y + 20);
BitBlt(IMG.Canvas.Handle, 0, 0, IMG.Width, IMG.Height,
Under.Canvas.Handle, 0, 0, SRCCOPY);
BitBlt(IMG.Canvas.Handle, 0, 0, IMG.Width, IMG.Height,
over.Canvas.Handle, 0,0, SRCAND);
BitBlt(over.Canvas.Handle, 0, 0, IMG.Width, IMG.Height,
over.Canvas.Handle, 0,0, SRCINVERT);
BitBlt(IMG.Canvas.Handle, 0, 0, IMG.Width, IMG.Height,
over.Canvas.Handle, 0,0, SRCPAINT);
IMG.Repaint;
end;
злобная танька (2005-11-13 11:53:00) [14]
> Grol © (12.11.05 19:42) [3]
канвас это не окно. а функция SetWindowRgn устанавливает регион окна, как видно из названия :)
злобная танька (2005-11-13 11:51:00) [15]
> 2Wish (13.11.05 11:21) [6]
по ходу имеется ввиду шо при перекрытии формы или панели чем-нибудь картинка на канве стираеца а имейдж "перерисовывается".
2Wish (2005-11-13 11:21:00) [16]2 Grol?
Что значит "перерисовывается"? Canvas он и в африке Canvas, что на Image рисуй, что на форме.
Grol (2005-11-12 23:35:00) [17]Да это точно должен быть Image, так как он перерисовывается, а мне это и нужно.
TStas (2005-11-12 20:14:00) [18]А это точно обязательно должен быть имадж? Можно ведь вместо него в онпайт формы написать БрашКопи и указать прозрачный цвет.
Grol (2005-11-12 19:42:00) [19]Недавно разобрался с регионами и вот тут проблема одна. Сначало дам код, а потом поясню:
procedure TForm1.FormCreate(Sender: TObject);
var
EllRG:HRGN;
RectRG:HRGN;
begin
EllRG:=CreateEllipticRgn(0,0,Width,Height);
RectRG:=CreateRectRgn(0,0,Width,Height);
CombineRgn(RectRG,RectRG,EllRG,RGN_xor);
SetWindowRgn(Handle,RectRG,True);
end;
Вот код создания дырки в форме, но мне то нужно, чтоб дырка была в [B]Image[/B]. На форме [B]Image[/B] уже имеется. Что я сделал...вместо [B]Handle[/B] в процедуре [B]SetwindowRgn[/B] подставил Image1.Canvas.Handle-->не получилось сделать дырень. Потом написал так [B]Image1.Picture.Bitmap.Handle[/B]-->все равно не получилось. А как тогда это можно сделать?
Grol (2005-11-03 03:20:00) [20]PAVIA спасибо. Я попробовал, то что Вы мне сказали, действительно, область внутри мною рисуемого круга стала прозрачной на Image2, но мне нужно немного другое. Мне необходимо, чтоб область в круге была прозрачной на сквозь, так чтоб можно было видеть, что находится за Image2 (как будто дырка в Image2), а область, которая не в круге (все пространство Image2, кроме круга) была не прозрачной. Короче, если выражаться простым русским языком, мне необходимо сделать сквозное отверстие в Image2 (как будто пуля прошла через Image2 :))))