질답란 검색해서 ..코드를 얻어서 구현하기는 했습니다..
그런데...이미지가 계속 중복되어서 나오다라고요...ㅎㅎ
for 문을 없애면 child 폼의 잔상이 계속 남아 있구요....
mdi 폼의 중앙에 한번만 나오게 할수는 없을까요?
procedure TFMain.ClientWndProc(var message: TMessage);
var
DC: hDC;
Row, Col: Integer;
begin
with message do
begin
case Msg of
WM_ERASEBKGND:
begin
DC := TWMEraseBkGnd(message).DC;
if (Image1.Picture.Height <> 0) and (Image1.Picture.Width <> 0) then
begin
for Row := 0 to ClientHeight div Image1.Picture.Height do
for Col := 0 to ClientWidth div Image1.Picture.Width do
BitBlt(DC, Col*Image1.Picture.Width, Row*Image1.Picture.Height,
Image1.Picture.Width, Image1.Picture.Height,
Image1.Picture.Bitmap.Canvas.Handle, 0, 0, SRCCOPY);
end;
Result := 1;
end
else Result := CallWindowProc(FPrevClientProc, ClientHandle, Msg, wParam, lParam);
end;
end;
end;
전체를 그려주실게 아니라면 배경을 칠해줘야됩니다. 안그럼 이전 화면이 그대로 보이게 됩니다.
WM_ERASEBKGND 이 메세지 받았을때 기본적인 행위가 배경색으로 폼을 칠해주는겁니다. 안그럼 이전 화면의 잔상이 남기 때문에...
아래와 같이 해보세요...
<!--CodeS-->
var
Brush: HBRUSH;
begin
........
if (Image1.Picture........) then
begin
Brush := CreateSolidBrush(ColorToRGB(Self.Color));
FillRect(DC, ClientRect, Brush); // 배경 칠하기
DeleteObject(Brush);
BitBlt(DC, // 중앙에 한번만...
(ClientWidth - Image1.Picture.Width) div 2,
(ClientHeight - Image1.Picture.Height) div 2,
Image1.Picture.Width, Image1.Picture.Height,
Image1.Picture.Bitmap.Canvas.Handle, 0, 0, SRCCOPY);
end;
........
end;
<!--CodeE-->
^^ 항상 즐코하세요...