|
잠깐시간을 내서 해봤습니다.(전부터 가끔 올라오던 질문이라...)
아마 아래와 같은 구조이어야 할것입니다.
상속은 거의 필수 개념이라고 생각하구요...
그리는부분,마우스 체크부분만 간단히 넣었습니다.
사각형,원 두개했는데,계속 추가하면되겠죠?
또 그때마다 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);
:
: 이렇게 했거던여..
:
: 첨에 생각했던건.. 사각영역 안에 마우스를 클릭하믄.. 선택될라구 했는데..
: 생각해보니까. 도형이 겹칠 수도 있고..
: 뭐가 앞에 있는 도형인지두 생각해야 겠고...
: 만약에 뒤에 있던 도형을 클릭했을때.. 앞에 있던 도형을 뒤로 미뤄야 할꺼고..
: 겹치는게 여러개일 경우...
: 하여간 머리가 복잡해 지내여..
:
: 혹시 이런 플그램 해보신분 있음.. 어떻게 설계하셨는지.?
:
:
|