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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.02.2009, 00:37   #1
h4muk
 
Регистрация: 27.02.2009
Сообщений: 7
По умолчанию проблема копирования из image.canvas в переменную TBitMap

Доброго времени суток.
Мне необходимо подсвечивать картинки при наведении мыши. Делаю путем замены бэкграунда:

Код:
procedure TForm1.ImageMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
  var _bitmap, _back:TBitMap; _rec1:Trect;
begin
 _bitmap:=TBitMap.Create; _back:=TBitMap.Create;
 _rec1:=Bounds(0,0,85,68);
 _bitmap.Canvas.CopyRect(_Rec1,(Sender as TImage).canvas,_Rec1); \\!!!!!!
 _bitmap.Transparent := True;
 _bitmap.TransparentColor:= _bitmap.canvas.pixels[1, 1];
 _back.LoadFromResourceName(HInstance, 'background');
  (Sender as TImage).Canvas.CopyRect(_Rec1,_back.canvas,_Rec1);
  (Sender as TImage).Canvas.CopyRect(_Rec1,_bitmap.canvas,_Rec1);
 _bitmap.Free; _back.Free;
end;
Компилятор ошибок не выдает, а после выполнения строки с !!!!!! в _bitmap.canvas вместо картинки, на которую наведена мышь белый прямоугольник.

Может быть кто подскажет почему так происходит?

Последний раз редактировалось rpy3uH; 27.02.2009 в 08:13.
h4muk вне форума Ответить с цитированием
Старый 27.02.2009, 05:35   #2
CahekG
Пользователь
 
Регистрация: 25.02.2009
Сообщений: 28
По умолчанию

Для работы _bitmap ему надо задать его размеры
Код:
_bitmap.Width:=100;_bitmap.Height:=100;
А вообще вы используете как источник для _bitmap канву Image1
Код:
_bitmap.Canvas.CopyRect(_Rec1,(Sender as TImage).canvas,_Rec1);
Потом вы меняете содержимое Image1.
Мышь продолжает двигаться и событие вызывается неоднократно и при следующем вызове Image1 там будет не исходная картинка
Поэтому исходную картинку надо было загружать из ресурса, с которого будет восстанавливаться Image1 после снятия подсветки

Вообще лучше создать свой Component, например как показано ниже на основе Timage
И добавить в него два события вход на объект Image и покидание объекта (вызываемые однократно)
Код:
unit MyImage;

interface

uses
  SysUtils, Classes, Controls, ExtCtrls,Messages;

type
  TMyImage = class(TImage)
  private
    { Private declarations }
  procedure CMMouseEnter(var AMsg: TMessage); message CM_MOUSEENTER;
  procedure CMMouseLeave(var AMsg: TMessage); message CM_MOUSELEAVE;
  protected
    { Protected declarations }
   FOnEnterMouse: TNotifyEvent;
   FOnLeaveMouse: TNotifyEvent;
  public
    FMouseInImage: Boolean;
    { Public declarations }
  published
    property OnEnterMouse:TNotifyEvent read FOnEnterMouse write FOnEnterMouse;
    property OnLeaveMouse:TNotifyEvent read FOnLeaveMouse write FOnLeaveMouse;
    { Published declarations }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Additional', [TMyImage]);
end;


procedure TMyImage.CMMouseEnter(var AMsg: TMessage);
begin
if Assigned(FOnEnterMouse) then    OnEnterMouse(Self);
end;

procedure TMyImage.CMMouseLeave(var AMsg: TMessage);
begin
  if Assigned(FOnLeaveMouse) then  OnLeaveMouse(Self);
end;

end.
А уже в реакции на эти события например организовать вкл/выкл подсветки
(причем в данном случае ресурс MouseIn будет содержать рисунок подсвеченной кнопки)
А чтоб для всех Image использовать только один MouseIn надо пользоваться _bitmap.canvas.CopyMode:= и оперировать в переменных получаю нужные эффекты,
а (Sender as TImage).Canvas.CopyRect( ... выполнять один раз, иначе будет мельтешить)
Код:
procedure TForm1.MyImage1EnterMouse(Sender: TObject);

var _bitmap:TBitMap; _rec1:Trect;
begin

_bitmap:=TBitMap.Create;
_rec1:=Bounds(0,0,193,185);
_bitmap.Canvas.CopyRect(_Rec1,(Sender as TImage).canvas,_Rec1);
_bitmap.Transparent := True;_bitmap.TransparentColor:= _bitmap.canvas.pixels[1, 1];

_bitmap.LoadFromResourceName(HInstance, 'MouseIn');
(Sender as TImage).Canvas.CopyRect(_Rec1,_bitmap.canvas,_Rec1);
_bitmap.Free;


end;



// нам надо восстановить исходное изображение
procedure TForm1.MyImage1LeaveMouse(Sender: TObject);
begin

 (Sender as TImage).Picture._back.LoadFromResourceName(HInstance, 'Original');
end;

Последний раз редактировалось CahekG; 27.02.2009 в 09:49.
CahekG вне форума Ответить с цитированием
Старый 27.02.2009, 09:44   #3
h4muk
 
Регистрация: 27.02.2009
Сообщений: 7
По умолчанию

Спасибо за ответ. Использовать EnterMouse и LeaveMouse действительно будет правильным.

Вот что получилось. Может кому пригодится

Код:
var
_bitmap, _back:TBitMap;
procedure TForm1.ImageEnterMouse(Sender: TObject);
var _rec1:TRect;
begin
_bitmap:=TBitMap.Create;  _back:=TBitMap.Create;
_bitmap.Width:=85;_bitmap.Height:=68;
_rec1:=Bounds(0,0,85,68);
_bitmap.Canvas.CopyRect(_Rec1,(Sender as TImage).canvas,_Rec1);
_bitmap.TransparentColor:= _bitmap.canvas.pixels[1, 1];
_bitmap.Transparent := True;
_back.LoadFromResourceName(HInstance, 'background');
(Sender as TImage).Canvas.CopyMode:=cmsrcand;
(Sender as TImage).Canvas.CopyRect(_Rec1,_back.canvas,_Rec1);
(Sender as TImage).Transparent:=true;
(Sender as TImage).Picture.Bitmap.TransparentColor:=_bitmap.TransparentColor;
(Sender as TImage).Canvas.CopyRect(_Rec1,_bitmap.canvas,_Rec1);
end;

procedure TForm1.ImageLeaveMouse(Sender: TObject);
begin
_bitmap.Transparent := false;
(Sender as TImage).Transparent:=false;
(Sender as TImage).Canvas.CopyMode:=cmSrccopy;
(Sender as TImage).Canvas.CopyRect(_Rec1,_bitmap.canvas,_Rec1);
_bitmap.Free;
_back.Free;
end;

Последний раз редактировалось h4muk; 28.02.2009 в 08:30.
h4muk вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с Image Vitalik55 Мультимедиа в Delphi 9 05.12.2008 12:03
TBitmap odi_noki Мультимедиа в Delphi 17 25.10.2008 09:53
TBitmap в многопоточном приложении Sergey_nl Мультимедиа в Delphi 3 09.07.2007 00:34
Запрет копирования pinhead Win Api 11 10.01.2007 07:01
передать переменную ar4i Общие вопросы Delphi 10 04.12.2006 14:30