|
MouseMove에서 Image1의 위치를 움직이면...( Image1->Top = Image1->Top-1; )
실제로 좌표를 바꾸는 순간에 Image의 위치가 움직여서 화면에 반영되지는 않습니다.
mage1MouseMove 함수가 빠져나온후에야
Image1에서 Paint 이벤트가 발생할것이며
그때에야 화면에 실제로 반영됩니다.
그러니 MouseMove 이벤트에서 For 문으로 10회 돌리면..
for문이 끝나고 난뒤에 화면이 갱신되므로..
한번에 움직이는것 처럼 보입니다.
만약 for문 돌리면서 image의 위치를 조정할때마다
갱신된 화면들 보고싶으면...
for문 안에 윈도우 Message 처리하도록 하면됩니다.
간단하게 Application->ProcessMessages(); 이 한줄을 넣으면 되죠
그러나 MouseMove 이벤트는 자주 일이나고 , 화면에 갱신되는 것은
(화면크기에 와 여러 조건에 따라 다르겠지만) 상당한 cpu자원이 요구됩니다.
다시 말해 화면갱신하는데.. 시간이 좀 걸린다는거죠
그래서 Application->ProcessMessages(); 를 for문가운데.. 넣으면
마우스 커서가 버벅 거리게 느껴질수도 있습니다.
뭐... 화면이 버벅거리는것을 더블버퍼링같은 방법으로 .. 개선할수는 있겠지만
mousemove에서 다른Image를 Move하도록 처리하는것은 좋은 방법이 아닌것 같습니다.
그럼....
허접 님이 쓰신 글 :
: 장성호님. 답변 감사드립니다.
: 정말 많은 도움을 주시네요. ^^
: 타이머 시간을 조정함에 따라 빠르게, 천천히 이미지가 변경되는걸 확인 했습니다.
: 뭐라 감사 드려야 할지... ㅠ.ㅜ
:
: 그리고, 아래는 제가 수정한 소스인데, 문제가 좀 있네요.
:
: void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
: {
: if ((0 < X) && (X < 156))
: {
: if ((0 < Y) && (Y < 11))
: {
: for ( ; ; )
: {
: if (Image1->Top > -220)
: {
: Image1->Top = Image1->Top-1;
: Sleep(1);
: }
: else
: break;
: }
: }
: }
: }
:
: 이렇게 했더니, 그림이 바뀌긴 합니다.
: 근데, 타이머를 썼을 때 처럼 그림이 순차적으로 이쁘게 변하는게 아니고 좀 이상하게 변하네요.
: 예를들어, 처음에 보여지는 화면이 아래와 같을 때,
:
: ////////////
: // 1 //
: // 2 //
: // 3 //
: // 4 //
: // 5 //
: ////////////
:
: 타이머를 쓰면
:
: ////////////
: // 2 //
: // 3 //
: // 4 //
: // 5 //
: // 6 //
: //////////// 이렇게 바뀌는게, 위 for문을 돌리면
:
: ////////////
: // 6 //
: // 7 //
: // 8 //
: // 9 //
: // 10 //
: //////////// 이렇게 건너 뛴다고 해야 하나요?
:
: 이런 현상이 발생합니다.
:
: for문을 잘못 쓴건지, 이유를 모르겠네요.
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
: 장성호 님이 쓰신 글 :
: : 여기서 자료 잘 찾으면 상당히 많은 정보를 얻을수 있어요
: :
: : GetCursorPos 와 ScreenToClient 함수를 이용해서..
: : Control에 대한 마우스 커서의 상대적인 위치를 알수잇어요
: :
: : ---------------샘플---------------------------------
: : void __fastcall TForm1::Timer1Timer(TObject *Sender)
: : {
: : TPoint pt;
: : GetCursorPos(&pt);
: : pt=Image1->ScreenToClient(pt);
: : if(pt.x>=Image1->Left && pt.x<=(Image1->Left+Image1->Width))
: : {
: : if(pt.y>=Image1->Top && pt.y<=(Image1->Top+Image1->Height))
: : {
: : ShowMessage("Image1 위에 마우스가 있음!");
: : }
: : }
: : }
: : //---------------------------------------------------------------------------
: :
: : 허접 님이 쓰신 글 :
: : : 장성호님.. 답변 감사드립니다.
: : : 그런데, getcursorpos를 이용해서 커서 좌표 알아내고 해봤는데, 잘 안되네요. ㅠ.ㅜ
: : : 기존 소스에서는 어떻게 방법이 없는건가요??
: : :
: : :
: : :
: : : 장성호 님이 쓰신 글 :
: : : : [기본원리]
: : : : Timer를 이용하세요
: : : : Timer로 원하는 시간 간격으로 ( 100ms ........) Mouse의 Position을 체크해서
: : : : Image12위에있으며... 내려주고
: : : : Image13위에 있으면 올려주고 그러면 되겠네요
: : : :
: : : : 그다음
: : : : [추가 고려사항]
: : : : Timer 이벤트는 시간 설정해 놓은 만큼 주기적으로 뜨는것은 아실테고
: : : : OnTimer 이벤트에서 MouseCursor가 어떻게 Image위에 있는지 아느냐가 문제겠죠?
: : : :
: : : : 1) GetCursorPos 를 이용
: : : : 이것은 GetCursorPos 라는 함수로 알수 있습니다.
: : : : 이 함수로 알수 있는 좌표는 Screen절대좌표이기때문에...
: : : : Image의 상대좌표로 봐꿔 줘야 겠죠
: : : : 그런다음 Image 위치와 크기를알고 있으므로 .. Mouse가 Image위이엤는지 없는지 알수 있겠죠?
: : : :
: : : : 2) 뭐 구현해 보지는 않았는데...
: : : : Button같은 경우 OnEnter 이벤트와 OnExit 이벤트가 있습니다.
: : : : 커서가 Enter된후 Exit가 일어나기 전까지는 Button위에 있다고 볼수잇겠죠?
: : : : Image12 ,Image13 대신 Image를 넣을수 있는 BitBtn같은것으로 바꿔서 해보는것도 대안이 될수 있을것 같구요
: : : : 또는 Image12 ,Image13 를 서브클래싱해서 Enter Exit 를 잡는방법도 있을것 같습니다.
: : : :
: : : :
: : : :
: : : :
: : : :
: : : : 허접 님이 쓰신 글 :
: : : : : 안녕하세요.
: : : : : 허접입니다.
: : : : : 왜이렇게 모르는게 많고 막히는게 많을까요. ㅠ.ㅜ
: : : : : 죽고싶네요. ㅠ.ㅜ
: : : : :
: : : : : 소스좀 봐주세요~
: : : : :
: : : : : void __fastcall TForm1::Image12MouseMove(TObject *Sender,
: : : : : TShiftState Shift, int X, int Y)
: : : : : {
: : : : : if (Image11->Top == 0)
: : : : : {
: : : : : }
: : : : :
: : : : : else Image11->Top += 10;
: : : : :
: : : : : }
: : : : : //---------------------------------------------------------------------------
: : : : :
: : : : : void __fastcall TForm1::Image13MouseMove(TObject *Sender,
: : : : : TShiftState Shift, int X, int Y)
: : : : : {
: : : : : if (Image11->Top == -220)
: : : : : {
: : : : : }
: : : : : else Image11->Top -= 10;
: : : : : }
: : : : :
: : : : : 현재 위와 같은 소스로 image12에 마우스 커서를 갖다대고 움직이면 이미지가 10씩 위로 올라가고,
: : : : : image13에 마우스 커서를 갖다대고 움직이면 이미지가 10씩 아래로 내려갑니다.
: : : : : 근데, 문제는....
: : : : : 해당 위치 (image12, image13) 위에서 마우스 커서를 움직여야만 그림이 위/아래로 10씩 움직인다는거죠.
: : : : : 해당 위치에 마우스 커서만 갖다 놓아도 그림이 위/아래로 10씩 움직이게 하고 싶거든요.
: : : : : for 문을 돌려서 해봤더니, 너무 빨리 for문이 돌아서 그런지.. 그냥 마지막에 보여져야 할 부분으로 이미지가 이동해 버립니다.
: : : : : 무슨 방법 없을까요?
: : : : : 도와주세요~ ㅠ.ㅜ
|