1. Получи 30.000 рублей. Для получения денег необходимо принять участие в конкурсе авторов codeby. С условиями и призами можно ознакомиться на этой странице ...

    Внимание! Регистрация авторов на конкурс закрыта.

    Скрыть объявление
  2. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление

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

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

  1. Dock1100

    Dock1100 :-]

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

    Dock1100 :-]

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

    Dock1100 :-]

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

    Dock1100 :-]

    Репутация:
    0
    Регистрация:
    9 ноя 2009
    Сообщения:
    665
    Симпатии:
    1
    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;
     
Загрузка...

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