Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2009, 05:53   #1
Саня
Пользователь
 
Регистрация: 08.01.2007
Сообщений: 30
Вопрос Перекрытие нескольких TImage

Создаю программно несколько компонентов TImage и вывожу изображение на канву. Почти все перекрывают друг друга.
Проблемы:
1. Свободные части Image тоже окрашиваются. Хотя нужно чтобы они оставались прозрачными.
2. При перекрытии, на события реагирует только самый верхний Image, причём той зоной, которая должна быть прозрачной.

Подскажите пожалуйста, возможно ли избавиться от этих недостатков, если ДА, то как? Ну или посоветуйте, как это воплотить в жизнь(с каким компонентом или что-либо другое).
Я не волшебник, я только учусь!

Последний раз редактировалось Саня; 04.02.2009 в 08:06.
Саня вне форума Ответить с цитированием
Старый 04.02.2009, 08:06   #2
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

Св-во transparent в true у имиджа поставили?
SERG1980 вне форума Ответить с цитированием
Старый 04.02.2009, 09:32   #3
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

вот тут глянь : http://www.delphikingdom.com/asp/ans...?IDAnswer=1891
неточно по твоей проблеме - но модернизировать можно ...

Или вот :
Цитата:
Функция RectInRegion

Описание:
function RectInRegion(Region: HRgn; var Rect: TRect): Bool;
Опpеделяет, лежит ли какая-либо часть пpямоугольника Rect внутpи указанной области.
Паpаметpы:
Region: Идентификатоp области.
Rect: Стpуктуpа TRect.
Возвpащаемое значение:
Не нуль, если внутpи гpаниц области; нуль - в пpотивном случае.
функция находится в файле gdi32.dll
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Старый 04.02.2009, 10:29   #4
Саня
Пользователь
 
Регистрация: 08.01.2007
Сообщений: 30
По умолчанию

Цитата:
Сообщение от SERG1980 Посмотреть сообщение
Св-во transparent в true у имиджа поставили?
С этим уже разобрался (кажется). Надо было рисовать не Image1.Canvas, а на Bitmap.Canvas, тогда и transparent нормально себя чувствует.
Я не волшебник, я только учусь!
Саня вне форума Ответить с цитированием
Старый 04.02.2009, 10:39   #5
Саня
Пользователь
 
Регистрация: 08.01.2007
Сообщений: 30
По умолчанию

Цитата:
Сообщение от Kotofff Посмотреть сообщение
вот тут глянь : http://www.delphikingdom.com/asp/ans...?IDAnswer=1891
неточно по твоей проблеме - но модернизировать можно ...

Или вот :
Вы меня не поняли.
Image1 это прямоугольник. Правильно? У меня на форме они накладываются один на другой со смещением. Так вот если я хочу кликнуть по нижнему (он виден) клик обрабатывает тот, который сверху (он его перекрывает прозрачной областью). Так есть возможность обработать такой клик нормально, т.е. как клик на нижнем Image? Или надо писать свой компонент?
Я не волшебник, я только учусь!
Саня вне форума Ответить с цитированием
Старый 04.02.2009, 10:55   #6
0nni
Форумчанин
 
Аватар для 0nni
 
Регистрация: 24.07.2008
Сообщений: 279
По умолчанию

Обрабатывай NC_HITTEST для каждого TImage (А лучше создай наследника), с его помощью можно сделать "пустые" области.
Сказал и загрустил от бесспорности своей правоты.
0nni вне форума Ответить с цитированием
Старый 04.02.2009, 11:43   #7
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

Цитата:
Сообщение от Саня Посмотреть сообщение
Вы меня не поняли.
Image1 это прямоугольник. Правильно? У меня на форме они накладываются один на другой со смещением. Так вот если я хочу кликнуть по нижнему (он виден) клик обрабатывает тот, который сверху (он его перекрывает прозрачной областью). Так есть возможность обработать такой клик нормально, т.е. как клик на нижнем Image? Или надо писать свой компонент?
А как вы прописываете событие OnClick для имиджа. если можно приведите код. А лучше полный исходник если не секрет.
Не очень понятно вот эта фраза
Цитата:
клик обрабатывает тот, который сверху (он его перекрывает прозрачной областью)
. Если вы кликаете по прозрачной области верхнего то у вас и будет вызываться обработчик верхнего

Последний раз редактировалось SERG1980; 04.02.2009 в 11:49.
SERG1980 вне форума Ответить с цитированием
Старый 04.02.2009, 11:59   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А если так: По клику проверяем если цвет куда мыша попала = транспаренту то переслать клик контролу под ним.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.02.2009, 06:38   #9
Саня
Пользователь
 
Регистрация: 08.01.2007
Сообщений: 30
По умолчанию

Вот примерно то, о чем я спрашиваю:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure ClickImages(Sender:TObject);
  end;

var
  Form1: TForm1;

implementation


{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  Img1,Img2:TImage;
begin
  //Создаем 1-й Image.
  Img1:=TImage.Create(Form1);
  with Img1,Img1.Canvas do
  begin
    Name:='Image1';
    Top:=50;
    Left:=50;
    Height:=50;
    Width:=100;
    Transparent:=true;
    Parent:=Form1;
    OnClick:=ClickImages;
    Pen.Color:=clRed;
    Pen.Style:=psSolid;
    Pen.Width:=30;
    Brush.Style:=bsSolid;
    Brush.Color:=clWhite;
    Rectangle(0,0,100,50);
  end;
  //Создаем 2-ой Image.
  Img2:=TImage.Create(Form1);
  with Img2,Img2.Canvas do
  begin
    Name:='Image2';
    Top:=35;
    Left:=65;
    Height:=50;
    Width:=100;
    Transparent:=true;
    OnClick:=ClickImages;
    Parent:=Form1;
    Pen.Color:=clBlack;
    Pen.Style:=psSolid;
    Pen.Width:=30;
    Brush.Style:=bsSolid;
    Brush.Color:=clWhite;
    Rectangle(0,0,100,50);
  end;
  Button1.Enabled:=false;
end;

procedure TForm1.ClickImages(Sender: TObject);
begin
  //Для проверки выводит Name того Image, на котором кликнули.
  ShowMessage(TImage(Sender).Name);
end;

end.
Заметно, да? При клике в прозрачную область черного прямоугольника, клик обрабатывается как событие Image2. Так можно ли сделать так, чтобы при клике на красном прямоугольнике сквозь чёрный, "выскакивало имя" не Image2, а Image1, т.е. имя красного прямоугольника?
Я не волшебник, я только учусь!
Саня вне форума Ответить с цитированием
Старый 05.02.2009, 06:45   #10
Саня
Пользователь
 
Регистрация: 08.01.2007
Сообщений: 30
По умолчанию

Цитата:
Сообщение от 0nni Посмотреть сообщение
Обрабатывай NC_HITTEST для каждого TImage (А лучше создай наследника), с его помощью можно сделать "пустые" области.
А у меня есть к Вам вопрос: каким образом можно сделать "пустые" области, чтобы они не реагировали на события?
Я не волшебник, я только учусь!
Саня вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TImage maxvodo.dll Мультимедиа в Delphi 3 24.10.2008 21:29
TImage в TImage One.Love Общие вопросы Delphi 15 22.09.2008 19:37
TImage Killbrum Помощь студентам 8 27.08.2008 22:40
Timage RealSHELS Общие вопросы Delphi 7 05.05.2008 20:12
TImage Andrey9392 Компоненты Delphi 6 06.04.2007 10:43