C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[151] [팁] TImage Component의 개요와 사용방법
박지훈.임프 [cbuilder] 11795 읽음    2001-07-31 18:07
이 팁은 담비님(천리안 FREKBS)님이 1999년 04월 13일에 천리안 프로그래머포럼에 올리신 것입니다.
담비님으로부터는 전제하여 올리는 데 대해 허락을 받았습니다.
좋은 정보를 공유하도록 허락해주신 담비님께 감사드립니다.
───────────────────────────────────────

안녕하세요! 담비입니다.

출처 : http://www.inprise.co.jp/qanda/cbuilder/c0003051.html

C++ Builder의 Image 컴포넌트는 일종의 placeholder 컴포넌트이다.
이 컴포넌트를 사용하면, 폼상에서 비트맵이나 메타파일 등의 화상 오브젝트를 포함
하는 영역을 지정할 수 있다. 이미지의 사이즈는 수동으로 설정하거나,
Image 컴포넌트가 실행시에 화상의 사이트에 맞추어 조정하도록 설정할 수 있다.
화상을 생성하기 위해서 필요로 하는 비트맵을 보관 유지하기 위해서도 사용할
수 있다.

초기 화상의 설정
────────
Image  컴포넌트가 항상 특정 화상을 보관 유지하는 경우, 설계시에 Picture
프로퍼티를 설정할 수 있다. 실행시에 파일로부터 컴포넌트에 화상을 로드할 수도
있다. 또 그래픽 어플리케이션에서는, Image 컴포넌트를 사용해 유저가 draw 가능한
영역을 제공하는 것도 할 수 있다. draw용의 공백의 비트맵을 준비하려면 실행시에
그 비트맵을 작성한다.

설계시에 이미지를 읽어들이기
──────────────
1. 그래픽 호환 컴포넌트를 폼에 추가한다.
2. 컴포넌트의 사이즈를 자동적으로 그래필에 맞추도록, 그래픽을 읽어들이기 전에
    컴포넌트의 AutoSize 프로퍼티를 true로 설정한다.
3. 오브젝트 인스펙터에서 Picture Editor를 사용하는 프로퍼티를 선택한다.
4. Picture의 값을 지정하기 위해 더블클릭의 기능을 대신해주는 생략기호 [...]
    단추를 클릭하면 Picture Editor가 열린다.(폼안에 있는 Image 컴포넌트를
    더블클릭해도 Picture Editor가 열린다.)
5. [Load...(L)] 버튼을 선택하여 [Load Picture] 다이얼로그 박스를 연다.
6. [Load picture] 다이얼로그 박스를 사용해 표시하고 싶은 이미지를 선택하고
    [Open]을 선택한다. 선택한 이미지가 Picture Editor에 표시된다.
7. [OK]를 선택하면 선택한 이미지가 표시되고 [Picture Editor] 다이얼로그 박스는
    닫는다.
    폼상의 컴포넌트 내부에 이미지가 표시된다.

Note : 그래픽을 Image 컴포넌트로 읽어들일 때 Image 컴포넌트의 Stretch프로퍼티를
        true로 설정하면, 그래킥이 컴퍼넌트에 맞도록 자동적으로 크기가 변경된다.
        (Stretch는, 크기에 영향을 미치지 않는다.)

실행시의 draw용의 영역의 제공
───────────────
Image 컴포넌트를 사용해 공백의 비트 맵을 배치함으로서 실행시에 유저가 draw할 수
있는 영역을 제공할 수 있다.

1. Image 컴포넌트를 포함하는 폼의 OnCreate 이벤트에 핸들러를 attach한다.
2. 비트맵 오브젝트를 작성한다.
3. Image 컴포넌트의 Picture->Graphic 프로퍼티에 비트맵 오브젝트를 할당한다.

비트맵을 화상의 Graphic 프로퍼티에 할당함으로서 비트맵의 소유권이 화상 오브젝트
에 주어진다. 화상 오브젝트가 폐기될 때에 비트맵이 자동적으로 폐기되므로
비트맵 오브젝트를 폐기하는 코드를 따로 지정할 필요는 없다.
화상에는 다른 비트맵을 할당할수도 있으며, 그 시점에서 예전의 비트맵은 폐기되고,
새로운 비트맵이 제어의 대상이 되어진다.

다음에 나타난 코드는 Form1의 OnCreate 이벤트에 attach되는 코드로서 폭 200픽셀
X 높이 200픽셀의 공백의 비트맵을 작성하고 폼의 이미지 컴포넌트 내에 배치한다.

//---------------------------------------------------------------------------
class TForm1 : public TForm
{
  __published:
    TImage *Image1;
    void __fastcall FormCreate(TObject *Sender);
  private:
  public:
    __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate( TObject *Sender );
{
  Graphic::TBitmap *Bitmap1;        //비트맵을 보존하기 위함 임시 변수

  Bitmap1 = new Graphic::TBitmap;   //비트맵 오브젝트를 작성한다.
  Bitmap1->Width = 200;             //폭의 초기값을 지정한다.
  Bitmap1->Height = 200;            //높이의 초기값을 지정한다.

  //비트맵을 이미지 컴포넌트에 할당한다.
  Image1->Picture->Graphic = Bitmap1;
}

그래픽의 출력
───────
C++ Builder 어플리케이션으로부터 그래픽 이미지를 출력하는것은 간단한 작업이다.
출력에 필요한 지정은, 프린터를 호출하는 폼의 uses절에 Printers 유닛을 추가만
해주면 된다. Printers 유닛은 Printer라는 프린터 오브젝트를 선언한다.
이 오브젝트는 인쇄된 페이지를 표현하는 canvas를 가진다.
프린터의 canvas에 이미지를 카피한다.
프린터의 canvas는 다른 canvas와 같은 것을 사용할 수 있다.
특히 이것은 비트맵 등의 그래픽 오브젝트의 내용을 프린터에 직접 카피할 수 있는
것을 의미한다.
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
  __published:
    TButton *PrintButton;
    TImage  *Image1;
    void __fastcall PrintButtonClick(TObject *Sender);
  private:
  public:
    __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
void __fastcall TForm1::PrintButtonClick(TObject *Sender);
{
  //vcl\printers.hpp 를 반드시 인클루드한다.
  Printer()->BeginDoc();  //인쇄를 시작한다.

  //인쇄 페이지의 좌상단에  Image 를 그린다.
  Printer()->Canvas->Draw( 0, 0, Image1->Picture->Graphic );
  Printer()->EndDoc();    //인쇄를 종료한다.
}
//---------------------------------------------------------------------------

디바이스에 의존하지 않는 인쇄 처리
//---------------------------------------------------------------------------
void __fastcall TForm1::PrintBitmap( Graphics::TBitmap *Bitmap, int X, int Y )
{
  int infoSize, imageSize;
  ::GetDIBSizes( Bitmap->Handle, infoSize, imageSize );
  TBitmapInfo *info = (TBitmapInfo *)new Byte[infoSize];
  void *img = new Byte[imageSize];
  try {
    GetDIB( Bitmap->Handle, Bitmap->Palette, info, img );
    StretchDIBits( Printer()->Canvas->Handle,
      0, 0, X, Y,
      0, 0, info->bmiHeader.biWidth, info->bmiHeader.biHeight,
      img, info, DIB_RGB_COLORS, SRCCOPY );
  }
  catch(... ) {
  }
  delete img;
  delete info;
}
//---------------------------------------------------------------------------
#define STRETCHPRINT
void __fastcall TForm1::Print1Click(TObject *Sender)
{
    Printer()->BeginDoc();
#ifdef STRETCHPRINT
    PrintBitmap( Image->Picture->Bitmap, 800, 600 );
#else
    try {
      Graphics::TBitmap *Bitmap = new Graphics::TBitmap;
      Bitmap->Assign( Image->Picture->Graphic );
      Bitmap->Monochrome = true;
      Printer()->Canvas->Draw( 0, 0, Bitmap );
    } catch(... ) {}
    delete Bitmap;
#endif
    Printer()->EndDoc();
}
//---------------------------------------------------------------------------

파일로 화상을 보존하기
───────────
화상을 작성 또는 변경한 뒤, 화상을 다시 사용하기 위해 보존하고자 하는 경우가
많다.
C++ Builder의 Picture 오브젝트는 그래픽을 복수의 형식으로 보존하며,
개발자가 독자적인 그래픽 파일 형식을 작성한 형식으로 보존 할 수 있도록 등록할
수 있다.

Image 컴포넌트의 Picture 오브젝트의 SaveToFile 메소드를 호출한다.

SaveToFile 메소드는 파일명을 필요로한다.
새롭게 작성하는 화상에 파일명이 지정되지 않거나, 사용자가 기존의 화상을 다른
파일에 보존하는 경우가 있다.
어느쪽의 경우에도, 어플리케이션이 보존을 실행하기 전에 코드의 예에서 나타난
것처럼 유저로부터 파일명을 취득할 필요가 있다.
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
  __published:
    TButton *SaveButton;
    TButton *SaveAsButton;
    TImage *Image1;
    TSaveDialog *SaveDialog1;
    void __fastcall SaveButtonClick(TObject *Sender);
    void __fastcall SaveAsButtonClick(TObject *Sender);
  private:
  public:
    __fastcall TForm1(TComponent* Owner);
    String CurrentFile;
};
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
           : TForm(Owner)
{
  CurrentFile = "";
}
//---------------------------------------------------------------------------
void __fastcall  TForm1::SaveButtonClick(TObject *Sender);
{
  if( CurrentFile!= "" )
  {
    //파일명의 지정이 끝난 경우에는 보존한다.
    Image1->Picture->SaveToFile(CurrentFile);
  }
  else
  {
    //파일명이 지정되지 않은 경우, 파일명을 취득한다.
    SaveAszButtonClick(Sender);
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SaveAsButtonClick( TObject *Sender );
{
  if( SaveDialog1->Execute() )  //파일명의 취득
  {
    //사용자가 지정한 이름을 보존한다.
    CurrentFile = SaveDialog1->FileName;
    SaveButtonClick(Sender);  //그 후 통상적으로 보존한다.
  }
}
//---------------------------------------------------------------------------

클립보드에서의 그래픽의 사용법
───────────────
Windows의 클립보드를 사용해 어플리케이션에 그래픽을 복사하거나 오려내어
붙이거나. 다른 어플리케이션과 그래픽을 교환할 수 있다.
Delphi의 클립보드 오브젝트를 사용하면 그래픽을 포함한 다른 종류의 정보를
간단하게 취급할 수 있다.

클립보드로 Copy
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
  __published:
    TButton *CopyButton;
    TImage *Image1;
    void __fastcall CopyButtonClick( TObject *Sender );
  private:
  public:
    __fastcall TForm1( TComponent* Owner );
};
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
//vcl\clipbrd.hpp 를 반드시 인클루드한다.
void __fastcall TForm1::CopyButtonClick( TObject *Sender );
{
  Clipboard()->Assign( Image->Picture );
}
//---------------------------------------------------------------------------

+ -

관련 글 리스트
151 [팁] TImage Component의 개요와 사용방법 박지훈.임프 11795 2001/07/31
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.