Q&A

  • MDI FORM의 배경화면 선택하기??????
MDI FORM의 배경그림을 넣고 실행후

IMAGE의 그림을 변경하면 그림이 바로 바뀌지 않고

최소화시킨후에 다시보면 바뀌는 군요.





IMAGE의 그림을 바꾸는 순간에 배경그림을 바꾼그림으로

보이게 하려면 어떻게 하면 되는지요?????

3  COMMENTS
  • Profile
    nilriri 2000.05.10 23:43
    repaint라는 이벤트를 사용하시면 될것같습니다.





    이병협 wrote:

    > MDI FORM의 배경그림을 넣고 실행후

    > IMAGE의 그림을 변경하면 그림이 바로 바뀌지 않고

    > 최소화시킨후에 다시보면 바뀌는 군요.

    >

    >

    > IMAGE의 그림을 바꾸는 순간에 배경그림을 바꾼그림으로

    > 보이게 하려면 어떻게 하면 되는지요?????

  • Profile
    이병협 2000.05.11 01:00
    이미 해보았지만 되지 않더군요



    mdiform의 client영역에 repaint라는 이벤트가 발생하지 않는것 같아요





    nilriri wrote:

    > repaint라는 이벤트를 사용하시면 될것같습니다.

    >

    >

    > 이병협 wrote:

    > > MDI FORM의 배경그림을 넣고 실행후

    > > IMAGE의 그림을 변경하면 그림이 바로 바뀌지 않고

    > > 최소화시킨후에 다시보면 바뀌는 군요.

    > >

    > >

    > > IMAGE의 그림을 바꾸는 순간에 배경그림을 바꾼그림으로

    > > 보이게 하려면 어떻게 하면 되는지요?????

  • Profile
    김일영 2000.05.11 07:05
    MDIForm의 Client 영역은 원래 WinControl의 형태로 잡혀 있질 않습니다.

    그래서 제어를 하려면, SetWindowLong을 써서 MDIForm.ClientHandle의

    윈도우 프로시저를 바꿔서 해야 합니다.

    제가 비슷한걸 해봤습니다. 참조하시죠.



    type

    TForm1 = class(TForm)

    MainMenu1: TMainMenu;

    Paint: TMenuItem;

    procedure FormCreate(Sender: TObject);

    procedure FormDestroy(Sender: TObject);

    procedure FormClose(Sender: TObject; var Action: TCloseAction);

    procedure PaintClick(Sender: TObject);

    private

    { Private declarations }

    FbTextShow: Boolean;

    FPOldWndProc: Pointer;

    FPNewWndProc: Pointer;

    procedure NewWndProc(var Msg: TMessage);

    public

    { Public declarations }

    end;



    procedure TForm1.NewWndProc(var Msg: TMessage);

    var

    ClientDC: HDC;

    ps: PAINTSTRUCT;

    begin

    case Msg.Msg of

    WM_PAINT: begin

    if FbTextShow then begin

    ClientDC := BeginPaint(ClientHandle, ps);

    Windows.TextOut(ClientDC, 50, 50, PChar('Test!'), 5);

    EndPaint(ClientHandle, ps);

    end;

    end;

    end;

    with Msg do begin

    Result := CallWindowProc(FPOldWndProc, ClientHandle, Msg, wParam, lParam);

    end; // 원래의 윈도우 프로시져를 호출해준다.

    end;



    procedure TForm1.FormCreate(Sender: TObject);

    begin

    FbTextShow := False;

    FPNewWndProc := MakeObjectInstance(NewWndProc);

    FPOldWndProc := Pointer(SetWindowLong(ClientHandle, GWL_WNDPROC,

    Longint(FPNewWndProc)));

    end;



    procedure TForm1.FormDestroy(Sender: TObject);

    begin

    SetWindowLong(ClientHandle, GWL_WNDPROC, Longint(FPOldWndProc));

    FreeObjectInstance(FPNewWndProc);

    end;



    procedure TForm1.PaintClick(Sender: TObject);

    var

    Rect: TRect;

    begin

    FbTextShow := not FbTextShow;

    Windows.GetClientRect(ClientHandle, Rect);

    InvalidateRect(ClientHandle, @Rect, True);

    SendMessage(ClientHandle, WM_PAINT, 0, 0);

    end;



    잘 되길 바랍니다.

    ==========================================================================

    이병협 wrote:

    > 이미 해보았지만 되지 않더군요

    >

    > mdiform의 client영역에 repaint라는 이벤트가 발생하지 않는것 같아요

    >

    >

    > nilriri wrote:

    > > repaint라는 이벤트를 사용하시면 될것같습니다.

    > >

    > >

    > > 이병협 wrote:

    > > > MDI FORM의 배경그림을 넣고 실행후

    > > > IMAGE의 그림을 변경하면 그림이 바로 바뀌지 않고

    > > > 최소화시킨후에 다시보면 바뀌는 군요.

    > > >

    > > >

    > > > IMAGE의 그림을 바꾸는 순간에 배경그림을 바꾼그림으로

    > > > 보이게 하려면 어떻게 하면 되는지요?????