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
[20585] Re:캔버스에 그림을 그리고 난후에 개체를 어떤 식으로 개체선택하는 부분을 코딩해야할지..
방태윤 [nabty] 1032 읽음    2002-08-01 18:34
잠깐시간을 내서 해봤습니다.(전부터 가끔 올라오던 질문이라...)
아마 아래와 같은 구조이어야 할것입니다.
상속은 거의 필수 개념이라고 생각하구요...
그리는부분,마우스 체크부분만 간단히 넣었습니다.
사각형,원 두개했는데,계속 추가하면되겠죠?
또 그때마다 draw,mouse_check 부분을 상황에 맞게 다르게 구성주면 되겠지요...
제대로할려면 더 많은 메서드가 필요하겠지만..간단히 개념만^^

class obj
{
  public:
    TRect r;
    AnsiString name;
    obj(TRect rr,AnsiString nn){r=rr;name=nn;};
    ~obj(){};

    virtual void draw()=0;
    virtual bool mouse_check(TPoint)=0;

};
class box : public obj
{
  public:
    box(TRect r,AnsiString nn):obj(r,nn){};
    ~box(){};

    virtual void draw(){
      Form1->Canvas->Rectangle(r);
      DrawText(Form1->Canvas->Handle,name.c_str(),-1,&r,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
    };
    virtual bool mouse_check(TPoint o){
      return PtInRect(&r,o);
    };

};
class circle : public obj
{
  public:
    circle(TRect r,AnsiString nn):obj(r,nn){};
    ~circle(){};

    virtual void draw(){
      Form1->Canvas->Ellipse(r);
      DrawText(Form1->Canvas->Handle,name.c_str(),-1,&r,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
    };
    virtual bool mouse_check(TPoint o){
      return PtInRect(&r,o);
    };

};

TList*all;

void __fastcall TForm1::draw_all()
{
  for(int i=0;i<all->Count;i++){
    obj*o=(obj*)all->Items[i];
    o->draw();
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  all=new TList();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)  // 객체를 추가
{
  // box add
  all->Add(new box(TRect(100,100,200,300),"box1"));
  all->Add(new box(TRect(10,10,90,120),"box2"));
  // circle add
  all->Add(new circle(TRect(80,40,220,240),"원1"));
  all->Add(new circle(TRect(40,150,200,240),"원2"));
  draw_all();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
  int cur_index=-1;
  for(int i=all->Count-1;i>=0;i--){
    obj*o=(obj*)all->Items[i];
    if(o->mouse_check(TPoint(X,Y))){
      ShowMessage("find:"+o->name);
      cur_index=i;
      break;
    }
  }
  if(cur_index>=0){ //찾은경우
    all->Move(cur_index,all->Count-1); //찾은 객체를 최상위로 올리고
    draw_all(); //다시 그린다.
  }
}
//---------------------------------------------------------------------------


최수정 님이 쓰신 글 :
: 캔버스에 우선은 사각형, 원, 둥근 사각형 등의 그림을 그리고여.
: 그린 그림의 이름, 시작좌표(x,y), 끝좌표(x,y)를 구조체 배열에 저장했구요..
: struct shape1
: {
:   char *shape;
:   int StartX;
:   int StartY;
:   int EndX;
:   int EndY;
: };
: shape1 sh[100];
: sh[i].shape = "dsLine";
: sh[i].StartX = StrToInt(StrRes);
: sh[i].StartY = StrToInt(StrRes);
: sh[i].EndX = StrToInt(StrRes);
: sh[i].EndY = StrToInt(StrRes);
:
: 이렇게 했거던여..
:
: 첨에 생각했던건.. 사각영역 안에 마우스를 클릭하믄.. 선택될라구 했는데..
: 생각해보니까. 도형이 겹칠 수도 있고..
: 뭐가 앞에 있는 도형인지두 생각해야 겠고...
: 만약에 뒤에 있던 도형을 클릭했을때.. 앞에 있던 도형을 뒤로 미뤄야 할꺼고..
: 겹치는게 여러개일 경우...
: 하여간 머리가 복잡해 지내여..
:
: 혹시 이런 플그램 해보신분 있음.. 어떻게 설계하셨는지.?
:
:

+ -

관련 글 리스트
20582 캔버스에 그림을 그리고 난후에 개체를 어떤 식으로 개체선택하는 부분을 코딩해야할지.. 최수정 785 2002/08/01
20585     Re:캔버스에 그림을 그리고 난후에 개체를 어떤 식으로 개체선택하는 부분을 코딩해야할지.. 방태윤 1032 2002/08/01
20594         태윤님 정말정말 감사합니다..^___________^;;(혹시 VCL 라이브러리 책같은거 있나여..?)--냉무 최수정 759 2002/08/02
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.