Q&A

  • mdi에 그림 넣기에서...
안녕하세요.
항상 질문만 올리게 되네요. 저도 많은 내공을 쌓아서 답변이 많아지는 날을
위해 항상 노력 중입니다.

제가 해야되는 작업은 mdi폼에 배경그림을 넣고 공지사항이 있으면
그림을 숨기고 공지사항을 표시하는 작업입니다.

mdi배경에 그림을 넣는 소스를 받아서 해보니 그림의 크기가 배경의 그림크기보다 작을 경우 stretch 속서을 true로 설정해도 안되더라구요.

혹, mdi에서 client크기(image 컴포넌트 크기)에 맞게 그림을 확대/축소하는 방법을 아시면 도움 주십시오.

다시 한번 설명드리면,
mdi폼에 image컴포넌트를 올리고 그림을 로드하면 디자인 화면에서는 그림이
작아도 풀화면으로 나오는데 실행을 하면 그림이 원래크기로 줄어들어 버립니
다. 어떻게 하면 좋을지 고수님들의 도움바랍니다.
2  COMMENTS
  • Profile
    구창민 2004.11.27 01:00
    안녕하세요..
    아래 내용은 뉴스그룹에 소개되었던 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.



  • Profile
    왕초보 2004.11.27 01:30
    답변감사드립니다.
    unit Unit1;

       interface

       uses   Windows, SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,  Forms, Dialogs, StdCtrls,
      Menus, ExtCtrls;

       type
         TForm1 = class(TForm)
         MainMenu1 : TMainMenu;
        Image1: TImage;
        N1: TMenuItem;
        N2: TMenuItem;
           procedure FormCreate(Sender: TObject);
           procedure FormDestroy(Sender: TObject);
        procedure N2Click(Sender: TObject);
        procedure FormActivate(Sender: TObject);
         private
           { Private declarations }
           FClientInstance : TFarProc;
           FPrevClientProc : TFarProc;
           procedure ClientWndProc(var Message : TMessage);
         public
           { Public declarations }
         end;

       var  Form1: TForm1;

       implementation
    uses
       Unit2;
       {$R *.DFM}

       procedure TForm1.ClientWndProc(var Message : TMessage);
       var
         DC : HDC;
         i, j : integer;
       begin
       with Message do
         case Msg of
           WM_ERASEBKGND : begin
                        DC := TWMEraseBkGnd(Message).DC;
                        for i := 0 to ClientHeight div Image1.Picture.Height do
                         for j := 0 to ClientWidth div Image1.Picture.Width do
                            BitBlt(DC, j * Image1.Picture.Width, i * Image1.Picture.Height, Image1.Picture.Width, Image1.Picture.Height,
                            Image1.Picture.Bitmap.Canvas.Handle, 0, 0, SRCCOPY);
                         Result := 1;
         end;
         else
          Result := CallWindowProc(FPrevClientProc, ClientHandle, Msg, wParam, lParam);
         end;

      end;

      procedure TForm1.FormCreate(Sender: TObject);
      begin
        FClientInstance := MakeObjectInstance(ClientWndProc);
        FPrevClientProc := Pointer(GetWindowLong(ClientHandle, GWL_WNDPROC));
        SetWindowLong(ClientHandle, GWL_WNDPROC, LongInt(FClientInstance));

    Image1.Picture.Bitmap := Form1.GetFormImage;  // <- 요부분

      end;
    end.

    이렇게하니까 되네요.
    폼 create에
       Image1.Picture.Bitmap := Form1.GetFormImage;
    문장을 추가하니까 되네요.



    • 누렁이
    • 2004.11.30 04:50
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 박규태
    • 2004.11.30 02:37
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 하얀까마귀
      2004.11.30 21:04
      이미지 전 안보이는데요. ㅠㅠ
    • 석주현
      2004.11.30 01:34
      그냥 아래와 같이 하시면 됩니다. 원하시는 게 이거인지 잘모르겠지만요. 물론 아래에 있는 '' 안에 있는...
    • 이승현
      2004.11.30 02:27
      냉무인데 클릭하시분 계시죵? 날씨가 점점 추워지네요. 감기조심들하세요.
    • 하수경
    • 2004.11.29 19:56
    • 5 COMMENTS
    • /
    • 0 LIKES
    • Crazy™
      2004.11.29 20:00
      dbEdit 의 프로퍼티에서 datasource와 DataField를 연결하신건지??? dbEdit가 그리드의 Dataset을 연결해 ...
    • 하수경
      2004.11.29 23:38
      연결만 하면 되는건 아니지 않나요?? OnCellClick이나 OnColEnter이벤트를 써야 할거 같은데.. 만약에 위...
    • KDDG_RNStone
      2004.11.30 00:24
      일단 DBEdit는 연결만 하면 되는게 맞는데요. 전 DBEdit 쓰시는건 권장해 드리고 싶지 않네요. 그냥 Edi...
    • Crazy™
      2004.11.30 19:50
      연결만 걸면 됩니다. 그리고 사용자의 실수를 막는방법은 많습니다. 머 가령 dbedit를 readonly로 놓는다...
    • 맹상영
      2005.02.10 22:13
      보통 사용자의 편의를 위해 디비그리드를 클릭하면 그 데이타를 텍스트에디터로 넘겨서 데이타수정을 합니...
    • 김민호
    • 2004.11.29 18:05
    • 0 COMMENTS
    • /
    • 0 LIKES
    • s
    • 2004.11.29 08:34
    • 0 COMMENTS
    • /
    • 0 LIKES
    • KDDG_RNStone
      2004.11.30 00:27
      묻기론 행이라고 물으시고는 그림을 해석하면 특정 열을 선택하는건데... 어떤게 맞는건지 모르겠네요. ...
    • 장수진
    • 2004.11.28 09:37
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 하얀까마귀
      2004.11.30 21:25
      안녕하세요 하얀까마귀 입니다. 음.. 뭘하실려는건지 잘 모르겟네요. 간단하게 몇자 쳐볼께요.. ...
    • 이두형
    • 2004.11.28 01:03
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 하얀까마귀
      2004.11.28 02:14
      안녕하세요 하얀까마귀 입니다. 정확하게는 뭐가 문제인지는 알지 못하지만요 mciDevice니까 아마 음악...
    • 이두형
      2004.11.28 02:40
      안녕하세요 하얀까마귀님 반갑습니다 ^^ MCIDevice가 음악 쪽이였군요.. SearchEye란 게임을 만들고 있...
    • 김정은
    • 2004.11.27 06:08
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 하얀까마귀
      2004.11.28 02:20
      안녕하세요 하얀까마귀 입니다. 우선 1번질문에 대해서..   관계로 묶는다는건 뭐 같이 삭제...
    • 박준영
    • 2004.11.27 02:56
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 하얀까마귀
      2004.11.28 02:24
      안녕하세요 하얀까마귀 입니다. 대충 의도가 뭔지는 알겠는데.. DB Server에서 그런 기능을 구현할수 있...
    • 모영철
      2004.11.27 19:18
      3-Tier로 하면 될거 같은데요.. 클라이언트에 직접 IP와 포트를 열고 들어오는것이 아니라.. 특정 포...
    • 권태훈
      2004.11.29 23:46
      비슷한 의견입니다만 직접접속에서 승인에 대한 구별을 dbserver에서 직접 할 수는 없겠습니다. 특정...
    • 하얀까마귀
      2004.11.27 03:45
      안녕하세요 하얀까마귀 입니다. 결론은 없습니다. ㅠㅠ 그건 그냥 이미지일뿐이거든요. Text데이타는...
    • 하얀까마귀
      2004.11.27 03:48
      안녕하세요 하얀까마귀 입니다. 출력 용지 사이즈는 그냥 코딩으로 실시간으로 바꾸셔도 되는걸로 알고...
    • 왕초보
    • 2004.11.27 00:33
    • 2 COMMENTS
    • /
    • 2 LIKES
    • 구창민
      2004.11.27 01:00
      안녕하세요.. 아래 내용은 뉴스그룹에 소개되었던 MDI메인 폼에 이미지를 삽입하는 팁입니다. 보시고 ...
    • 왕초보
      2004.11.27 01:30
      답변감사드립니다. unit Unit1;    interface    uses   Windows, S...
    • 선기천
    • 2004.11.26 09:29
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 하얀까마귀
      2004.11.26 22:14
      안녕하세요 하얀까마귀 입니다. 일단 플래쉬 플레이어인가? 그게 깔려야 겟죠? ACtiveX요 그리고 델파...
    • 선기천
      2004.11.27 08:35
      답변 감사합니다. Flash ActiveX는 어디서 구하죠? 혹시 예제 소스 없을까여?
    • 하얀까마귀
      2004.11.28 02:27
      안녕하세요 하얀까마귀 입니다.. 그건 어디서 구하는게 아니구. ㅠㅠ 그냥 웹에 들어가서 flash가 보...
    • Crazy™
      2004.11.26 18:48
      dll 또는 exe 파일을 호출하는 수밖에 없는듯 싶습니다. 웹사이트가서 flash에서 dll 또는 exe호출하는 글...
    • 하얀까마귀
      2004.11.26 22:19
      안녕하세요 하얀까마귀 입니다. 무슨말인지 잘 모르겠습니다.. ㅎㅎ 버튼 크기를 조정하셧으면 spaci...
    • 하얀까마귀
      2004.11.28 02:35
      안녕하세요 하얀까마귀 입니다. 인디에는 그러한 부분이 없습니다. 그러니까.. 저넘은 버퍼를 보내고...
    • 이정석
    • 2004.11.26 02:02
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 델피언
    • 2004.11.26 01:13
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이정관
      2004.11.26 01:30
      프로그램의 용량 때문에 Build with runtime packages를 사용해서 실행파일을 만들면 프로그램 용량이 줄...
    • 빠샤.
    • 2004.11.26 00:27
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이정관
      2004.11.26 02:08
      일단 C소스는 예전에 쓸려다가 못 쓴 거 찾았네요. www.kisa.or.kr에서 무료 제공합니다. 관심있으신...