Q&A

  • MDI폼에 이미지 넣기
질답란 검색해서 ..코드를 얻어서 구현하기는 했습니다..
그런데...이미지가 계속 중복되어서 나오다라고요...ㅎㅎ

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;
1  COMMENTS
  • Profile
    최용일 2005.09.01 11:18
    안녕하세요. 최용일입니다.

    전체를 그려주실게 아니라면 배경을 칠해줘야됩니다. 안그럼 이전 화면이 그대로 보이게 됩니다.

    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-->
    ^^ 항상 즐코하세요...