MDIClient 윈도우에 그리기를 하고 싶으신 것 같군요.
이 윈도우는 Delphi에서도 그렇고, MFC에서도 기본적으로는 잡아 주지를 않습니다.
이 윈도우는 MDIForm을 생성하면 그 클라이언트 영역과 동일하게 Windows에서
자동적으로 만들어주는 윈도우입니다.
그런 고로, 그리기를 하기 위해서는 WM_PAINT 메시지 핸들러에서 그려야 하는데
직접 만든 윈도우가 아니므로 그냥 델파이에서 OnPaint 이벤트로 잡아주지 못합니다.
그러나 MDIClient의 핸들은 얻을 수 있습니다.
MDIForm에 ClientHandle이라는 프로퍼티를 이용하시면 됩니다.
MDIClient의 핸들은 얻었지만 이것은 핸들일 뿐이므로 OnPaint 이벤트 핸들러같은
형식으로 바로 접근할 수는 없고, 이걸 이용하여 MDIClient윈도우의 윈도우 프로시저
자체를 치환하여야 합니다.
치환할 윈도우 프로시저는 다음과 같은 방법으로 만들 수 있습니다.
참고로 이 내용들은 모두 Power of Delphi 제 6권의 내용을 거의 그대로 인용한 것입니다.
(나이렉스 인터내셔날 여러분께 진심으로 감사드립니다.)
TMDIForm = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
FPOldWndProc: Pointer;
FPNewWndProc: Pointer;
procedure NewWndProc(var Msg: TMessage);
public
{ Public declarations }
end;
...
procedure TMDIForm.NewWndProc(var Msg: TMessage);
begin
case Msg.Msg of
WM_PAINT: begin
... // 그리기함... API로만 하지 않아도 됨. 일반적인 코딩 가능함
end;
end;
with Msg do begin
Result := CallWindowProc(FPOldWndProc, ClientHandle, Msg, wParam, lParam);
end; // 원래의 윈도우 프로시져를 호출해준다.
end;
procedure TMDIForm.FormCreate(Sender: TObject);
begin
FPNewWndProc := MakeObjectInstance(NewWndProc);
FPOldWndProc := Pointer(SetWindowLong(ClientHandle, GWL_WNDPROC,
Longint(FPNewWndProc));
end;
procedure TMDIForm.FormDestroy(Sender: TObject);
begin
SetWindowLong(ClientHandle, GWL_WNDPROC, Longint(FPOldWndProc));
FreeObjectInstance(FPNewWndProc);
end;
휴~
이상입니다.
수고하세요.
================================================================================
유동훈 wrote:
> Mdiform에서 한가운데 이미지를 띠우려고 하는데 어떻게 해야 할지 잘 모르겠네요..
>
> 처음에 Normal 로 변경했다가 실행하면 보이는데 클릭시 다시 MDIForm으로 변경해서
> MDIChild폼을 띠워다가 종료하면서 다시 Normal로 변경하는데 잘 안되네요,..
>
> 이미지 띠우는 법좀 가르쳐 주시면 감사하게 습니다..