• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы Dock1100
  • Дата начала
D

Dock1100

Имеются много TImage, как сделать если я нажимаю на прозрачную часть TImage1, то клик отсылался TImage2, если клик попал на прозрачную часть TImage2 то клик отсылался следующему компоненту(необезательно TImage) котолый лежыт под TImage2 и тд.
Как это сделать(была идея создать масив с TImage и обрабатывать нажатия, но как быть если под рисунком что-то другое, или может както можно получить всё обекты на форме с их типами(не TObject или TComponent, а TButton или TImage или Tpanel)?)?
 
D

Dock1100

Проблема решена, кому надо пишите в личку.
 
D

Dock1100

Помогли, просто сразу за них забыл, да и у TImage нету свойства Handle, токо у его канвы, а потом взял TCustomControl и вышло.
 
D

Dock1100

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;
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!