Клик под прозрачную часть Timage

09.11.2009
665
1
23
Киев
#1
Имеются много TImage, как сделать если я нажимаю на прозрачную часть TImage1, то клик отсылался TImage2, если клик попал на прозрачную часть TImage2 то клик отсылался следующему компоненту(необезательно TImage) котолый лежыт под TImage2 и тд.
Как это сделать(была идея создать масив с TImage и обрабатывать нажатия, но как быть если под рисунком что-то другое, или может както можно получить всё обекты на форме с их типами(не TObject или TComponent, а TButton или TImage или Tpanel)?)?
 
09.11.2009
665
1
23
Киев
#3
Помогли, просто сразу за них забыл, да и у TImage нету свойства Handle, токо у его канвы, а потом взял TCustomControl и вышло.
 
09.11.2009
665
1
23
Киев
#4
Image - битмап, белій - прозрачный, чорный- непрозрачный
(процедуру нашол внете и дописал пару строчек)
Код:
procedure BitmapToRgn(Image: TBitmap; RegionHandle : THandle);
var
TmpRgn,Result: 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;
SetWindowRGN(RegionHandle, Result, true);
end;