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

C++빌더 Q&A
C++Builder Programming Q&A
[62762] Re:Panel에 그리기
장성호 [nasilso] 2229 읽음    2010-10-25 04:56
음...

먼저 코드에 대해 사족을 달면
1. Paint 할때마다 Canvas를 new 하고 delete할것이 아니라..
한번 new해서 계속 사용하는것이 좋지 않을까요?

2. TCanvas말고 TControlCanvas라는 놈이 있습니다.
  TCanva랑 거의 똑같은데..  dc관리를 알아서 해주는 놈이죠

3. TPanel에는 Canvas가 없는것이 아니라 숨겨져 있습니다.
    TCustomControl을 상속받은 놈은 다 Canvas라는 놈을 가지고 있죠..

참조 http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=546

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

개인적으로 무엇인가 그릴때..

간단한 것이면 TImage나 TPaintBox를 이용하고
복잡하고 지속적으로 써야할것이면 Component를 만들어서 씁니다.

문론 TPanel을 이용해서도 .. 간단히 그리는것 만드는데.. 전혀 문제없습니다.

다음과 김태선님의 "나만의 패널을 만들어 보자"라는 팁의 내용을 보면..
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=590

TPanel에 Paint라는 함수가 있는것을 알수가 있습니다.
그리고 또 TPanel을 교체식으로 기능을 추가해서 쓰는 방법도 있구요

위 방식을 이용하여
TPanel에 OnPaint이벤트를 만들어 보았구..
protected로 감춰져있던 Cavas를 public으로 open하였습니다.

class TPanel : public Extctrls::TPanel
{
  private:
    TNotifyEvent FOnPaint;

  protected:
    void __fastcall Paint(void)
    {
        inherited Paint();
        if(FOnPaint)
        {
            FOnPaint(this);
        }
    }

  public:
    __property Canvas; //protected인 프로퍼티를 public으로 변경

    __property TNotifyEvent OnPaint= {read=FOnPaint, write=FOnPaint}; //추가한 이벤트 
};

#define TPanel ::TPanel


  
자 이제 위 클래스를 이용하여 다음과 같이 코딩하시면됩니다.

void __fastcall TForm1::FormCreate(TObject *Sender)
{
    Panel1->OnPaint=Panel1Paint;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Panel1Paint(TObject *Sender)
{
    Panel1->Canvas->MoveTo(0,0);
    Panel1->Canvas->LineTo(100,100);
}
//---------------------------------------------------------------------------


그럼..

동철이 님이 쓰신 글 :
:
: void __fastcall TForm1::FormPaint(TObject *Sender)
: {
:         Graphics::TCanvas *PanCanvas = new Graphics::TCanvas;
:         PanCanvas->Handle = GetDC(Panel1->Handle);
:         PanCanvas->MoveTo(0, 0);
:         PanCanvas->LineTo(100, 100);
:         ReleaseDC(Panel1->Handle, PanCanvas->Handle);
:         delete PanCanvas;
: }

:
: 보통 Panel에 그림을 그릴 때 이런 방법을 사용하라고 하시더군요.
:
: 문제점 : 그런데 실행해보면 화면에 바로 안나타나고 폼을 이리저리 끌어보면 나타나네요.
: DC를 제대로 못 잡아주는 건지, 아니면 폼의 OnPaint 이벤트에 넣어서 그런건지 모르겠습니다.
:
: 문제점 더 : Panel부분만(정확히는 내가 패널위에 그려준 부분만) 다시 그려줬으면 하는데 Panel엔 OnPaint이벤트가 없지않습니까. 어떻게 해야 다시 그리도록 할 수 있겠습니까.

+ -

관련 글 리스트
62754 Panel에 그리기 동철이 1356 2010/10/23
62762     Re:Panel에 그리기 장성호 2229 2010/10/25
62827         Re:Re:장성호님, 의문점이 있는데요 동철이 1017 2010/10/30
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.