Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > TImage


Автор: RapMan 14.8.2008, 21:59
Доброе время суток!
У меня есть TImage и есть пару областей в виде кругов (circle), когда я кликаю на ету область окриваеться другая форма Form2. Как ето сделать?
Зарание благодарен

Автор: mr.Anderson 14.8.2008, 22:11
Обрабатывай OnClick на нужной области и все.

Добавлено через 5 минут и 44 секунды
ЗЫ если круглые области нарисованы с помощью TCanvas, то обрабатывай клик на самом изображении, а при клике смотри, куда тыкнули - на цветной пиксел (закрашенная круглая область) или же на прозрачный/другого цвета, и в зависимости от этого делай, что тебе нужно.

Автор: RapMan 14.8.2008, 22:35
область - не видима, то что OnClick или OnMouseDown/OnMouseUp я сам понимаю, но как проверить  или я в областе кликнул или нет? можно ето проверить используя множины и оператор in ?

Автор: VICTAR 14.8.2008, 23:26
Цитата(RapMan @  14.8.2008,  23:35 Найти цитируемый пост)
но как проверить  или я в областе кликнул или нет? 

PtInRegion

Автор: RapMan 15.8.2008, 08:20
спасибо! smile 

Автор: mr.Anderson 15.8.2008, 10:44
Ааа, вон что требовалось. Тогда в вопрос не въехал, извините за некорректный ответ.

Автор: RapMan 15.8.2008, 14:55
продолжение вопроса  smile 
у меня есть TBitMap в которий загружен рисунок, как мне получить HRND чтобы потом определять или мышка на етой области или нет?


Автор: VICTAR 16.8.2008, 00:38
Для начала нужно создать этот самый регион. 
Про регионы можно почитать в drkb.

Автор: RapMan 16.8.2008, 09:40
ето я понимаю, но как ето сделать?
Вот что я хочу реализовать:
У меня есть рисунок,  загружаю его в TBitMap делаю Transparent и на все что не Transparent сделать RGN и потом проверять или я нахожусь на етой области (рисунки могут бить разние)
Зарание Спасибо

Автор: VICTAR 16.8.2008, 11:57
По-моему функция из drkb
Код

function BitmapToRgn(Image: TBitmap): HRGN;
var
  TmpRgn: 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;
end;

зы неплохо бы ее оптимизировать

Автор: RapMan 16.8.2008, 12:54
Спасибо!!!! smile  я уже переделаю

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)