|
둥이네 님이 쓰신 글 :
: 드래그 작업시.어느 판넬에서 에서 다른 판넬로 드래그 하는 부분에..
: 중간 이동 경로를 나타 낼려고 합니다.
: MouseMovie 동안... 작은 투명한 상자를 옮겨야 하는데...
: 아무래도 사각형을 그렸다가 지웠다가 하는건 너무 비효율 적이라는 생각이 듭니다.
:
: 그렇다고 투명 폼을 만들려고 하니..이거 또한 작은 가로세로 1cm 도 안되는 투명한 외각선 있는 사각형을 만들려고 하니 조금은 비효율 적이라는 생각이 드네요....
:
: 시각적으로 투명한 사각형이 이동하는 것을 보여주는게 어떻게 제일 좋을지 조언 부탁 드리겠습니다.
: 지금 생각으로 마우스 클릭시 투명폼을 생성해서
: 투명폼을 옮기는게 제일 좋을꺼 같은데..과연 이것이 효율적일지.. 조언좀 부탁 드리겠습니다.
:
: PS:Panel 에서 드래그는 어떻게 알수 있는지 조언 부탁 드립니다.
: DragOver ,DragDrop,EndDrag,StartDrag 다 해봤는데..
: 각각 함수에 ShowMessage 해서 확인해보니...아무것도 안보이네요..
: 마우스 Down,Up ,Move 만 보이던데..드래그 중인 이벤트는 어떻게 알아 내야하는지도 조언 부탁 드립니다.
: 한 판넬에서 다른 판넬로의 드래그를 확인해야 하는데 이걸 어떻게 확인할지...조언 부탁 드립니다.
:
: 마우스 up Event 가 드래그 후 다른 판넬이나 폼 위치에서도 생기던데..
: 이때 처리를 해야 하는지요...
:
: 제가 적고 나서도 너무 뒤죽 박죽인거 같습니다. ^^; 담부터는 한개의 질문만 올려야 겠네요..죄송합니다.
안녕하세요 만해입니다.
저희 회사 프로그램인 이지클릭의 경우에는( 광고성글 아니예요 ㅋㅋ~ ^^a;)
패널을 이동시키는 부분을 Application->OnMessage 이벤트를 오버 로딩 시켜서
메세지가 별로 해당 하는 부분을 처리 하는 방식을 이용 합니다.
그러니깐 소스의 일부를 보여 드리면요 다음과 같습니다.
switch (Msg.message)
{
case WM_MOUSEWHEEL :
여기에 해당 이벤트에서 처리 해야할 내용을 입력
break;
case WM_LBUTTONDOWN:
break;
case WM_LBUTTONUP:
break;
case WM_MOUSEMOVE:
break;
case WM_RBUTTONDOWN:
break;
}
그리고 해당하는 컨트롤을 알아 내는 방식은 getCursorPos함수로 포인터를 가져온다음에
그 포인터에 존재하는 Control을 알아 내는 방식을 이용합니다.
제 개인적으로는 저 방식이 나쁘진 않는데 별로 맘에 안들어서
Panel의 이벤트를 오버 로딩 하는 방식을 사용하고 싶은데 기존에 만들어진 소스를 제가 아직 다 파악 못해서
아직 바꾸기엔 좀 이르네요 ㅋ~
그리고 선택된 Panel을 드래그 하는것은 WM_LBUTTONDOWN이벤트에서
마우스를 눌렀다고 프로그램에서 인식 하게 하고, 그리고 WM_MOUSEMOVE 이벤트에서 그 태그값이 온이면
해당 컨트롤을 움직이게 되어 있습니다.
그리고 WM_RBUTTONUP이벤트 일때 태그값 초기화 시키는 방식을 이용하고 있습니다.
참고만 하세요 이게 정답은 아니니깐요 분명히 더 좋은 방법은 존재 합니다.
그리고 포인터를 가져와서 컨트롤을 가져 올려면
GetCursorPos(&p);
if (FindControl(WindowFromPoint(p)) == NULL)
return NULL;
이런식으로 현재 마우스 포지션이 전체 윈도우에서 어디에 있는지를 변환 시키고 난 다음에
컨트롤을 가져 와야 합니다.
참고만 하시고요 좋은 방법 찾으셔서 좋은 프로그램 만드세요
주저리 주저리 말만 많네요 ㅋ~
|