안녕하세요.
항상 질문만 올리게 되네요. 저도 많은 내공을 쌓아서 답변이 많아지는 날을
위해 항상 노력 중입니다.
제가 해야되는 작업은 mdi폼에 배경그림을 넣고 공지사항이 있으면
그림을 숨기고 공지사항을 표시하는 작업입니다.
mdi배경에 그림을 넣는 소스를 받아서 해보니 그림의 크기가 배경의 그림크기보다 작을 경우 stretch 속서을 true로 설정해도 안되더라구요.
혹, mdi에서 client크기(image 컴포넌트 크기)에 맞게 그림을 확대/축소하는 방법을 아시면 도움 주십시오.
다시 한번 설명드리면,
mdi폼에 image컴포넌트를 올리고 그림을 로드하면 디자인 화면에서는 그림이
작아도 풀화면으로 나오는데 실행을 하면 그림이 원래크기로 줄어들어 버립니
다. 어떻게 하면 좋을지 고수님들의 도움바랍니다.
아래 내용은 뉴스그룹에 소개되었던 MDI메인 폼에
이미지를 삽입하는 팁입니다.
보시고 도움 되시길 바랍니다.
unit Unit1;
interface
uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
FOldDefWndProc : Pointer;
FNewDefWndProc : Pointer;
procedure ClientWndProc ( var Msg: TMessage );
public
{ Public declarations }
end;
var Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.ClientWndProc;
var
ClientDC : HDC;
MemDC : TBitmap;
MemDCX : Integer;
MemDCY : Integer;
begin
case Msg.Msg of
WM_PAINT : begin
ClientDC := GetDC ( ClientHandle );
MemDC := TBitmap.Create;
MemDC.LoadFromFile ( 'C:\ATHENA.BMP' );
MemDCX := 0;
MemDCY := 0;
repeat
repeat
BitBlt ( ClientDC, MemDCX, MemDCY, MemDC.Width,
MemDC.Height, MemDC.Canvas.Handle, 0, 0, SRCCOPY );
Inc ( MemDCX, MemDC.Width );
until MemDCX >= ClientWidth;
MemDCX := 0;
Inc ( MemDCY, MemDC.Height );
until MemDCY >= ClientHeight;
ReleaseDC ( ClientHandle, ClientDC );
MemDC.Free;
end;
end;
with Msg do
Result := CallWindowProc ( FOldDefWndProc, ClientHandle, Msg, wParam, lParam );
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FNewDefWndProc := MakeObjectInstance ( ClientWndProc );
FOldDefWndProc := Pointer(SetWindowLong(ClientHandle,
GWL_WNDPROC,
LongInt ( FNewDefWndProc ) ) );
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
SetWindowLong (ClientHandle, GWL_WNDPROC, LongInt FOldDefWndProc));
FreeObjectInstance ( FNewDefWndProc );
end;
end.