Witam,
Mam następujący problem: tworzę sobie listę obiektów klasy TImage, w ten sposób, że kliknięcie buttona tworzy obiekt na (powiedzmy) całą formę, następnie sobie na tym obiekcie rysuję (tylko linie na cavasie), a po zakończeniu rysunek jest przycinany tylko do tej przestrzeni ile zajmuje. Kolejne obiekty oczywiście nakładają się jeden na drugi.
I teraz sprawa jest taka: chciałbym żeby te nowotworzone obiekty były przezroczyste (żeby te pod spodem "prześwitywały"). Od razu mówię, że transparent:True nie przynosi efektu.
Czy można prosić o poradę w tej sprawie?
a staje się cokolwiek przezroczyste?
bo jak masz np. tło o kolorze białym które ma się stać przezroczyste to dajesz:
Image1.Transparent := True;
Image1.Picture.Bitmap.Mask(clWhite);
jeśli nie masz ustawione maski to za kolor przezroczysty ustawia się kolor piksela w lewym dolnym rogu
Ustawienie koloru przezroczystości czy to przez maskę czy przez img.Picture.Bitmap.TransparentColor w ogóle uniemożliwia rysowanie (?).
Wrzucę może to co mam:
onClik buttona:
img:=TImage.Create(Self);
img.Parent:=Self;
img.Top:=50;
img.Left:=0;
img.Width:=Form1.Width-100;
img.Height:=Form1.Height-100;
// img.Transparent:=True;
// img.Picture.Bitmap.Mask(clWhite);
img.Canvas;
img.OnMouseDown:=imgMouseDown;
img.OnMouseMove:=imgMouseMove;
img.OnMouseUp:=imgMouseUp;
W imgMouseDown i imgMouseMove standard, czyli odpowiednio
img.Canvas.MoveTo(x,y);
img.Canvas.LineTo(x,y);
a w imgMouseUp:
{******
obinanie
****}
imgList.Add(img);
to dołóż jeszcze coś takiego:
img.Picture.Bitmap.Width := img.Width;
img.Picture.Bitmap.Height := img.Height;
może pomoże ;)
W sumie jak się tak przyglądnąć, to efekt jest taki że w trakcie rysowania (tzn kliknąłem, trzymam i przesuwam), to obrazek spod spodu jest widoczny.
Ale mnie by chodziło bardziej o to, że jak mi button utworzy nowy obiekt, to żeby on już był przezroczysty (i przed rysowaniem, i w trakcie, i po).
To ciekawe że nie jest.. bo u mnie jakoś jest ;)
To ja może obnażę cały swój kod :P
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
img: TImage;
imgList:TList;
//klik:Boolean;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
img:=TImage.Create(Self);
img.Parent:=Self;
img.Top:=50;// Form1.Top;//+100;
img.Left:=0; //Form1.Left;//+100;
img.Width:=Form1.Width-100; //Form1.ClientWidth;
img.Height:=Form1.Height-100; //Form1.ClientHeight;
img.Picture.Bitmap.TransparentColor:=clWhite;
img.Transparent:=True;
//img.Picture.Bitmap.Mask(clWhite);
img.Picture.Bitmap.Width:=img.Width;
img.Picture.Bitmap.Height:=img.Height;
// img.Canvas;
img.OnMouseDown:=Image1MouseDown;
img.OnMouseMove:=Image1MouseMove;
img.OnMouseUp:=Image1MouseUp;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
imgList:=TList.Create;
end;
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
img.Canvas.MoveTo(x,y);
end;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if ssLeft in Shift then
img.Canvas.LineTo(x,y);
end;
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var i,j:Integer;
koniec_petli:Boolean;
begin
koniec_petli:=False;
// obetnij to prawego końca obiektu
for i:=img.Picture.Width downto 0 do
if koniec_petli then break else
for j:=0 to img.Picture.Height do
if img.Canvas.Pixels[i,j] = clBlack then
begin
img.Width:=i+1;
koniec_petli:=True;
break;
end;
koniec_petli:=False;
imgList.Add(img);
end;
end.
Może ja po prostu czegoś nie dostrzegam, albo coś pomijam :(
Nie wiem czy masz.. ale by sie przydało... do kodu projektu przed Application.Run dodać
Application.MainForm.DoubleBuffered := True;
to nie będzie migać, u mnie wszystko działa jakoś :)
a poza tym.. mógłbyś już zadbać o to by przy zamykaniu aplikacji usuwać te Image'sy z pamięci ;)
DoubleBuffered jest.
Nie wiem, co jest w takim razie nie tak:( Jestem już tak zdesperowany, że wrzucam screen'y:P
Na tym kliknąłem button pierwszy raz i coś nabazgrałem (na razie ok)
A teraz kliknąłem button drugi raz chcąc mieć nowy image ponad tamtym, ale widzieć ten spod spodu, a tu lipa:P
lol to ciekawe .. u Ciebie jakby ta przezroczystość się nie włączała.. ale u mnie (po skopiowaniu słowo w słowo tego kodu co podałeś) działa wszystko dobrze ;P
tu masz ten program skompilowany i jego źródło:
www.arthan.yoyo.pl/else/canvas0.rar
[glowa] Hmmm dziwne, bo ja na serio nawet u ciebie tego nie widzę:P
Kurdę ja chce rysować jak na kalkomanii, coś takiego jak warstwy (spod których przecież widać te co są pod spodem) w photoshopie czy gimpie... Czemu Delphi tego nie potrafi :P
Delphi potrafi.. i robi...
Moje zrzuty ekranu wyglądają tak:
Po pierwszym kliknięciu i nabazgraniu czegoś:
http://www.arthan.yoyo.pl/else/screen1.jpg
Po drugim kliknięciu i kolejnych bazgrołach:
http://www.arthan.yoyo.pl/else/screen2.jpg
chyba masz jakiegoś dziwnego kompa :/
O ja pierdziele, Mistrzu! U ciebie to działa idealnie tak jak chciałem....
Ale czemu u mnie nie ;-( Sprawdziłem na dwóch kompach... Może to wina XP?
Eh, chyba sobie odpuszczę:(