Panel을 상속받아 그위에 Image 객체를 얹어 컴포넌트를 만들었습니다.
그런데, 이 컴포넌트를 동적으로 생성한뒤에, 마우스에 대한 이벤트들.
예를들어 마우스로 드래그 한다던가, 클릭한다던가 하는..
그런 이벤트들을 처리할려고 했더니, 전혀 먹히질 않았습니다.
처음엔 Panel과 Image의 크기를 똑같이 정해 주었죠. 그런데, 우연히 Image 밑
에 깔리는 Panel을 더 크게 해주었더니, 그 Panel 부분에 대해서는 이런 이벤트
들을 인식하더군요. 한마디로 Image의 Parent인 Panel에 대해서만 이벤트를 잡
아 내더군요. 이럴때에 Image 부분에서도 이벤트를 잡아낼 방법은 없을까요?
그리고 또 한가지..
이렇게 만든 컴포넌트를 다른 사람에게 인스톨 시켰는데, 쓸려고 했더니, 컴파
일 할때, Image에 로드할 image 파일이 없다는 메시지가 뜨더군요.
이미 컴포넌트로 만들었는데.. 그걸 쓸때마다.. 그걸 읽어오는 것인가요?
컴포넌트로 만들었다면.. 당연히 그런 정보들은 컴포넌트 안에 담겨 있어야 할
것 같은데. 제가 컴포넌트 만들때 옵션 같은 것을 지정하지 않은 것인가요?
고수님들의 조언을 부탁드립니다.
패널에 이미지 캑체를 넣어쓰게 되면 Image 객체가 패널을 가리게 되어
이벤트가 Image객체로 가게 되며,
패널에는 제대로 발생하기 않게 된답니다.
방법은 패널내에서 사용하게 되는 Image객체의 이벤트 각각을 패널 이벤트의
각각의 이벤트에 연결 시켜 주는 방법을 생각해 볼 수 있습니다.
다음의 컴포넌트는 개인적으로 사용하는 것입니다. Image객체를 사용하지 않고
패널에 직접 비트맵을 그려주는 방법을 사용하였기 때문에,
원하시는 컴포넌트가 될 것라 생각되어 첨부합니다. 참조해 주시기 바랍니다.
그리고, 컴포넌트 자체에는 프로퍼티 값이 저장되지 않는 것이 디폴트라는 것
을 명심해 주시기 바랍니다.
//-----------------------------------------------------------------
// Made By 유수..
// NeoLib Package - NeoPanel 컴포넌트
//-----------------------------------------------------------------
unit NeoPanel;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls;
type
TBackBitmapStyle = (biNoBitmap, biCenter, biStretched, biTiled, biRight);
TNeoPanel = class(TPanel)
private
{ Private declarations }
FBitmap: TBitmap; // 깜박거림을 방지하기 위해
FBackBitmap: TBitmap;
FBackBitmapStyle: TBackBitmapStyle;
FFitToImgSize: Boolean;
procedure SetBackBitmap(const Value: TBitmap);
procedure SetBackBitmapStyle(const Value: TBackBitmapStyle);
procedure SetFitToImgSize(const Value: Boolean);
protected
{ Protected declarations }
procedure Draw;
procedure DrawBack(Canvas: TCanvas; Rect: TRect);
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Paint; override;
published
{ Published declarations }
property BackBitmap: TBitmap read FBackBitmap write SetBackBitmap;
property BackBitmapStyle: TBackBitmapStyle read FBackBitmapStyle write SetBackBitmapStyle;
property FitToImgSize: Boolean read FFitToImgSize write SetFitToImgSize;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('NeoLib', [TNeoPanel]);
end;
{ TNeoPanel }
constructor TNeoPanel.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FBackBitmap := TBitmap.Create;
FBitmap := TBitmap.Create;
end;
destructor TNeoPanel.Destroy;
begin
FBitmap.Free;
FBackBitmap.Free;
inherited Destroy;
end;
procedure TNeoPanel.Draw;
begin
with FBitmap do
begin
Width := Self.Width;
Height := Self.Height;
Canvas.Font := Font;
Canvas.Brush.Color := Color;
DrawBack(Canvas, Canvas.ClipRect);
BitBlt(Self.Canvas.Handle, 0, 0, Width, Height, Canvas.Handle, 0, 0, SRCCOPY);
end;
end;
procedure TNeoPanel.DrawBack(Canvas: TCanvas; Rect: TRect);
var
i, j: Integer;
begin
with Canvas do
begin
if FBackBitmap.Empty or (FBackBitmapStyle = biNoBitmap) then
begin
FillRect(Rect);
end
else
case FBackBitmapStyle of
biCenter:
begin
FillRect(Rect);
i := (ClientWidth - FBackBitmap.Width) div 2;
j := (ClientHeight - FBackBitmap.Height) div 2;
BitBlt(Handle, i, j,
FBackBitmap.Width, FBackBitmap.Height, FBackBitmap.Canvas.Handle, 0, 0, SRCCOPY);
end;
biTiled:
for i := Rect.Top div FBackBitmap.Height to Rect.Bottom div FBackBitmap.Height do
for j := Rect.Left div FBackBitmap.Width to Rect.Right div FBackBitmap.Width do
BitBlt(Handle, j * FBackBitmap.Width - Rect.Left, i * FBackBitmap.Height - Rect.Top, FBackBitmap.Width,
FBackBitmap.Height, FBackBitmap.Canvas.Handle, 0, 0, SRCCOPY);
biStretched:
StretchBlt(Handle, -Rect.Left, -Rect.Top, ClientWidth, ClientHeight,
FBackBitmap.Canvas.Handle, 0, 0, FBackBitmap.Width, FBackBitmap.Height,
SRCCOPY);
biRight:
begin
FillRect(Rect);
i := (ClientWidth - FBackBitmap.Width);
BitBlt(Handle, i, 0,
FBackBitmap.Width, FBackBitmap.Height, FBackBitmap.Canvas.Handle, 0, 0, SRCCOPY);
end;
end
end;
end;
procedure TNeoPanel.Paint;
begin
if not FBackBitmap.Empty then Draw
else inherited;
end;
procedure TNeoPanel.SetBackBitmap(const Value: TBitmap);
begin
FBackBitmap.Assign(Value);
RePaint;
end;
procedure TNeoPanel.SetBackBitmapStyle(const Value: TBackBitmapStyle);
begin
FBackBitmapStyle := Value;
RePaint;
end;
procedure TNeoPanel.SetFitToImgSize(const Value: Boolean);
begin
FFitToImgSize := Value;
if FBackBitmap.Empty then Exit;
if FFitToImgSize then
begin
Width := FBackBitmap.Width;
Height := FBackBitmap.Height;
end;
end;
end.
박인재 께서 말씀하시기를...
> Panel을 상속받아 그위에 Image 객체를 얹어 컴포넌트를 만들었습니다.
>
> 그런데, 이 컴포넌트를 동적으로 생성한뒤에, 마우스에 대한 이벤트들.
>
> 예를들어 마우스로 드래그 한다던가, 클릭한다던가 하는..
>
> 그런 이벤트들을 처리할려고 했더니, 전혀 먹히질 않았습니다.
>
> 처음엔 Panel과 Image의 크기를 똑같이 정해 주었죠. 그런데, 우연히 Image 밑
>
> 에 깔리는 Panel을 더 크게 해주었더니, 그 Panel 부분에 대해서는 이런 이벤트
>
> 들을 인식하더군요. 한마디로 Image의 Parent인 Panel에 대해서만 이벤트를 잡
>
> 아 내더군요. 이럴때에 Image 부분에서도 이벤트를 잡아낼 방법은 없을까요?
>
>
> 그리고 또 한가지..
>
> 이렇게 만든 컴포넌트를 다른 사람에게 인스톨 시켰는데, 쓸려고 했더니, 컴파
>
> 일 할때, Image에 로드할 image 파일이 없다는 메시지가 뜨더군요.
>
> 이미 컴포넌트로 만들었는데.. 그걸 쓸때마다.. 그걸 읽어오는 것인가요?
>
> 컴포넌트로 만들었다면.. 당연히 그런 정보들은 컴포넌트 안에 담겨 있어야 할
>
> 것 같은데. 제가 컴포넌트 만들때 옵션 같은 것을 지정하지 않은 것인가요?
>
>
> 고수님들의 조언을 부탁드립니다.
>
>
>
>
>