|
^^
지금 하시는 방법도 좋겠지만도요,현재 선택된 객체가 이동할때 다른 객체의 밑으로 들어가는 경우도(가려질때) 고려해야 할것 같습니다.
대부분이 사용하는 방법인 이동할때 외곽선만 그리는 방식으로 하시던가요.
아니면 이동중에도 꼭 객체의 모양이 그대로 유지해야 한다면 전체 객체를 다시 다 그려주는 방법이 제일 간단하리라 생각합니다.
후자의 방법이라면 저는 이렇게 하겠습니다.(제 생각일 뿐입니다^^)
mouse_down()
{
if 객체를 찾아서 객체를 선택하고 판단결과 move 작업이라면.
{
move_work=true;
old_x=X;
old_y=Y;
}
}
mouse_move()
{
if(!move_work) return;
if(old_x==X && old_y==Y) return;
int dx=X-old_x;int dy=Y-old_y;
old_x=X;old_y=Y;
현재 선택된 객체의 좌표를 dx,dy 만큼 이동시킨다.
그리고 모든객체를 다시그린다.
여기서 여유가 되면 움직인 부분의 좌표를 계산해서
변한부분만 clip area 를 정해주면 더 좋겠지요.
더 여유가 되면 객체가 clip area 내에 걸리는것만 체크해서 그려주게 하면 좋구요...
더 여유가 되신다면 다른 메모리상의 비트맵에 먼저 그린후 완료된 비트맵으로
화면을 갱신하면 더 좋구요.(객체가 여러개 겹쳐있을때 뻔적거리는거 방지)
}
mouse_up()
{
move_work=false;
물론 최종적으로 다시그려줌.
}
최수정 님이 쓰신 글 :
: 맨날 질문만 해서리.. 죄송 스러버여.. ^(_._)^ -->엽기토끼 인사버젼..헤~
:
: //------------------------ 마우스 무브 할때..^^ ---------------------
: r.left = sh[i].StartX;
: r.top = sh[i].StartY;
: r.right = sh[i].EndX;
: r.bottom = sh[i].EndY;
: //assert(PtInRect(&r,pt));
: if(PtInRect(&r,pt))
: {
: ::OffsetRect(&r,X,Y); -------------------->> 마우스가 움직일때 마다
: 좌표이동하믄서 그림그리는 부분 이구여..
:
: DrawShape(r.left , r.top , r.right , r.bottom); -->> 그리는 부분..
: // iROP2 = ::SetROP2(hWnd, R2_NOTXORPEN);
: // Image1->Canvas->ClipRect(Image1->Canvas->Handle);
:
: aaa=::InvalidateRect(Image1->Canvas->Handle, &Oldr, False);
: --->> 잔상없앨라구 쓴 api()함수인데여..
: 문제는 aaa= false 가 들어가여..
:
: //::SetROP2(hDC,iROP2);
: DrawShape(Oldr.left , Oldr.top , Oldr.right , Oldr.bottom);
: ----->> 글구 InvalidateRect()함수 쓰고..다시 그려 줘야 하나여.
: 몰겠어여..ㅠ.ㅠ
:
: Oldr.left = r.left;
: Oldr.top = r.top;
: Oldr.right = r.right;
: Oldr.bottom = r.bottom;
:
: //ShowMessage("들어왔음");
: }
:
: 마우스 이동할때 좌표이동해서 그려지는건 그려지는데염..
: 잔상이 안 없어져여..
:
: 바쁘신데 맨날 맨날 귀찮게 해드리네염.. ^^;;
:
|