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
[123] [팁] TCanvas Object의 개요와 사용방법
박지훈.임프 [cbuilder] 18934 읽음    2001-07-26 15:06
이 팁은 담비님(천리안 FREKBS)님이 99년 3월 31일에 천리안 프로그래머포럼에 올리신 것입니다.
담비님으로부터는 전제하여 올리는 데 대해 허락을 받았습니다.
좋은 정보를 공유하도록 허락해주신 담비님께 감사드립니다.

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

출처 : http://www.inprise.co.jp/tips/cbuilder/cb012/index.html

TCanvas Object의 개요와 사용방법에 관하여 간단한 예를 제시하여
소개하였다.

TCanvas Object
--------------

TCanvas Object는 Windows의 Device Context를 Capsule화한 묘화 (措畵)의 실체이다.
(묘화는 그림등을 그리는것, painting을 의미한다.)
TCanvas는, Windows의 묘화(措畵) Program에 필요하고, Device Context의 취득과
개방과 같은 복잡한 절차를 은폐하고, 확실게 안전한 그리기 수단을 제공한다.
TCanvas는, TForm, TBitmap, TPrinter등의 그리기 대상의 Canvas Property로서
제공된다.
Canvas는, Pen, Brush, Font Property를 가지고있다. Pen은 선이 그려지는 style을
결정한다. 이 property의 영향을 받는것은 Arc, LineTo 등이다.선의 색은 Pen->Color
preperty에 지정한다. 선의 폭은 Pen->Width property에, Pen->Style property은
선의 Style을 지정한다.  그러나, Windows의 제한으로 인해 Pen->Width에 2 이상을
지정한 경우는, psSolid와 psClear 이외의 pen->Style은 무시된다. Pen->Mode
property는, 선이 그려지는 방법을 규정한다. 예로, Pen->Mode를 pmXOR로 하는경우
화면에 그려지게될 프로그램에대한 미확정의 선그리기가 실현되게된다.

  bool FDown=False;
  int FSX, FSY, FEX, FEY;

  //---------------------------------------------------------------------------
  void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
        TShiftState Shift, int X, int Y)
  {
       Canvas->Pen->Color = clYellow;
       Canvas->Pen->Mode = pmXor;
       FDown = True;
       FSX = X;
       FSY = Y;
       FEX = X;
       FEY = Y;
  }
  //---------------------------------------------------------------------------
  void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button,
        TShiftState Shift, int X, int Y)
  {
       FDown = False;
       Canvas->Pen->Color = clBlack;
       Canvas->Pen->Mode = pmCopy;
       Canvas->MoveTo(FSX, FSY);
       Canvas->LineTo(FEX, FEY);
  }
  //---------------------------------------------------------------------------
  void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
        int X, int Y)
  {
       if( FDown ){
         Canvas->MoveTo(FSX, FSY);
         Canvas->LineTo(FEX, FEY);
         Canvas->MoveTo(FSX, FSY);
         Canvas->LineTo(X,Y);
         FEX = X;
         FEY = Y;
       }
  }


Brush는 도형의 채워지는 style을 결정한다. 이 property의 영향을 받는것은,
FillRect, FloodFill 등의 그리기method이다. 또, Rectangle과 Pie는 현재의 Pen으로
윤곽을 그리고, 도형내부를 Brush로 채워지는 style을 결정하는 method도 있다.
채워지는 style의 색은, Brush->Color property로 지정한다. 채워지는 style의
pattern은 Brush->Style로 지정한다. Brush->Bitmap은, 사용자정의의 pattern을
8X8의 Bitmap으로 지정할수 있다. Brush->Bitmap property는 Bitmap에대한 참조를
지정하기때문에, Bitmap의 확보 및 개방은 호출측에서하며,  사용이 완료된
Brush->Bitmap property에는, NULL을 지정해야만한다.
    {
        Graphics::TBitmap* Bitmap = new Graphics::TBitmap();
        Bitmap->LoadFromFile( "Brush.bmp" );
        Canvas->Brush->Bitmap = Bitmap;
        Canvas->FillRect(Rect(0, 0, 100, 100));
        Canvas->Brush->Bitmap = NULL;
        delete Bitmap;
    }

Font property는, TextOut과 TextRect로 그려지는 문자열의 style을 결정한다.
Font->Name은 Font의 이름을 지정한다. Font의 색은 Font->Color property로,
normal, italic, underlined, bold등의 특성은 Font->Style property로 지정한다.
Font의 크기는 Font->Size property로 지정한다. 이 값은 point의 수이다.
pixel단위로 지정하는 경우에는 Font->Height property를 사용한다. Font->Size
property와 Font->Height property의 관계는 다음식으로 나타낼수도 있다.
    Font->Height = -Font->Size * Font->PixelsPerInch / 72;

Font->Height가 음수인 때는 문자의 높이에 내부적인 유도가 포함된다. 그래서,
Font->Size는 양수가 된다. 보통, Font->Height에 양수를 지정하면, 내부 유도가
없이 높이를 지정하게되고, Font->Size는 음수가 되게된다.

문자열의 출력에는, 통상 문자열 영역을 현재의 배경에 포함한다. 배경은, TCanvas의
Brush property를 사용하여 설정한다.
   Canvas->Brush->Color = clHighlight;

또, 배경을 투명하게 할 경우에는 아래와 같이 기술한다.
   Canvas->Brush->Style = bsClear

TCanvas의 그리기 method에는, 기본적으로 도형의 그리기 이외에 Bitmap과 meta file
의 그리기method가 있다. Draw method는, 지정한 위치에 Bitmap과 Icon, meta file을
표시하기때문이다. 이들 Graphic Object를 특정 영역에 맞추고자 하는경우에는
StretchDraw method를 사용한다.
각 Canvas로부터 이미지를 Copy하는데는, CopyRect method를 사용한다.
CopyRect는, 지정한 Canvas의 특정영역의 내용을 Canvas의 지정한 영역에 그려낸다.
Canvas에 그려진 내용을 Component Object에 보관하는데는 TBitmap의
Canvas->CopyRect method를 사용한다. 아래는 Form에 그려진 내용을 Bitmap에
보관하는 예이다.
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        Graphics::TBitmap* Bitmap = new Graphics::TBitmap();
        Bitmap->Width = ClientWidth;
        Bitmap->Height = ClientHeight;
        Bitmap->Canvas->CopyRect( ClientRect, Canvas, ClientRect );
        Bitmap->SaveToFile("c:\\tmp\\form.bmp");
        delete Bitmap;
    }

TCanvas는, Device Context를 은폐시킨 Object이다. 따라서, Device Context의
Pallet가 가지는 Handle property를 할당해서 사용하여, 직접 GDI 함수를 호출하는
경우도 있다. 아래는, Windows API의 CreateFontIndirect 함수를 사용하여,
TFont에는 지정하지 않는 형태로서 Font를 생성하여, Form에 그리는 예이다.
LogFont 구조체의 IfEscapement에 300을 지정하고 30도의 기울기를 가지는 문자를
그려낸다.
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        HANDLE OrgFont, MyFont;
        LOGFONT LogFont;

        LogFont.lfHeight = 20;
        LogFont.lfWidth = 0;
        LogFont.lfEscapement = 300;
        LogFont.lfOrientation = 0;
        LogFont.lfWeight = FW_NORMAL;
        LogFont.lfItalic = 0;
        LogFont.lfUnderline = 0;
        LogFont.lfStrikeOut = 0;
        LogFont.lfCharSet = SHIFTJIS_CHARSET;
        LogFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
        LogFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
        LogFont.lfQuality = DEFAULT_QUALITY;
        LogFont.lfPitchAndFamily = DEFAULT_PITCH : FF_DONTCARE;
        strcpy( LogFont.lfFaceName, "Times New Roman" );

        MyFont = CreateFontIndirect( &LogFont );
        OrgFont = SelectObject( Canvas->Handle, MyFont );
        Canvas->TextOut( 100, 100, Edit1->Text );
        SelectObject( Canvas->Handle, OrgFont );
        DeleteObject( MyFont );
    }

TCanvas의 이런 주요한 특성을 이용하는 경우에는, C++Builder에서 제공되지 않는
Graphic API를 Capsule화하는 경우도 있다.

+ -

관련 글 리스트
123 [팁] TCanvas Object의 개요와 사용방법 박지훈.임프 18934 2001/07/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.