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

Тема в разделе "Delphi - Multimedia, Графика, Игры", создана пользователем Dock1100, 5 авг 2010.

  1. Dock1100

    Dock1100 :-]

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

    Dock1100 :-]

    Регистрация:
    9 ноя 2009
    Сообщения:
    678
    Симпатии:
    0
    Проблема решена, кому надо пишите в личку.
     
  3. Dock1100

    Dock1100 :-]

    Регистрация:
    9 ноя 2009
    Сообщения:
    678
    Симпатии:
    0
    Помогли, просто сразу за них забыл, да и у TImage нету свойства Handle, токо у его канвы, а потом взял TCustomControl и вышло.
     
  4. Dock1100

    Dock1100 :-]

    Регистрация:
    9 ноя 2009
    Сообщения:
    678
    Симпатии:
    0
    Image - битмап, белій - прозрачный, чорный- непрозрачный
    (процедуру нашол внете и дописал пару строчек)
    Код (Delphi):
    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;
     
Загрузка...

Поделиться этой страницей