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
[53434] Re:Re:Re:Re:Re:트리뷰의 DragOver 메세지 호출방법(?)
장성호 [nasilso] 1682 읽음    2008-05-16 17:47
해보지는 않았지안 몇가지 가능성에 대해 생각나는데로 얘기해 봅니다.

생각 1.
    마우스 커서를 바꿔버립니다.
    현재도 마우스 커서가 Accept=true일때랑 Accept=false일때 다르게 나오잖아요

생각2.
    기존 방식대로 하되
    투명윈도우가 마우스 커서를 가리지 않도록 하는 방법은 어떤지요?

생각3
   기존 방식대로 하구요
   DragOver나 DragDrop이벤트를 투명윈도우 위에있는 Control에서 받아서
   아랫쪽에 있는 폼의 VritualTreeView 의 VritualTreeView DragOver  나 VritualTreeViewDragDrop을
    x,y좌표변환 호출해주면 될것 같습니다만....

기타..

3번째 방식이 가장 빠르고 편할듯....
그럼..

  

해바라기 님이 쓰신 글 :
: 매번 정성스런 답변 감사합니다. (__)
:
: 제가 질문을 성급하게 올려 무엇을 원하는지 전달이 제대로 되지 않았네요..
:
: 정확한 문제는 드래그앤드랍시 투명 윈도우를 만들어 마우스 포인터를 따라서 움직입니다.
:
: 투명윈도우 안에는 적절한 아이콘과 설명이 들어있는데요..
:
: 문제는, 마우스포인터가 트리뷰위에 올라와있는게 아니라 투명윈도우 위에 올라와 있어서
:
: 직접적으로 드래그오버 메세지를 받질 못하는 상황입니다.
:
: 그래서, 생각해낸 꼼수가...
:
: 메인윈도우에서 마우스메세지를 받은후 포인터가 트리뷰 안에 있으면서 WM_MOUSEMOVE, MK_LBUTTON
:
: 메세지를 받았을경우 강제로 트리뷰로 드래그오버 메세지를 호출하려고 했었지만.. 잘 안되는군요-_-;
:
: 간단할줄 알았던 작업이 잘 안풀리네요ㅠ_ㅠ
:
: 마우스포인터가 투명윈도우위에 떠있으면서 드래그오버 메세지를 호출할 꼼수가 없을까요..^ㅡ^;
:
: //---------------------------------------------------------------------------------------------
:
:
: 장성호 님이 쓰신 글 :
: : SendMessage로 하는것은  꼼수입니다.
: : 즉 정상적인 DragOver후에 Drop이벤트가 발생하지 않죠
: : 그냥 해당Control에서 DragOver 이벤트가 호출되도록만 한것 뿐입니다.
: :
: : 님께서 원하시는게 정확히 무엇인지 이해가 잘 안되구요
: :
: : VCL에서 DragDrop은 Controls 유닛에 있는
: : TDragObject라는 놈이 이벤트에 깊이 관계하는것 같습니다.
: :
: : 어떤 Control에서 Drag가 시작되면
: : Controls에 있는 DragInitControl 함수에서
: : 전역변수 DragControl 에 해당 Control이 설정되구
: : 그다음부터 TDragObject 에서  마우스 위치와 버튼클릭등을 확인하여 해당 Object에 메세지를 보내주는 방식으로
: : 동작합니다.
: :
: : DragInitControl , DoDragOver , DragMessage 등의 관련함수들이 모두 감쳐져 있구
: : 관련 변수도 감쳐져있으니 직접 구현은 좀 까다로울것 같습니다.
: :
: : 정상적인 방법을 잘 이해하고  원하는 기능을 거기에 맞춰 잘 구현하는것이 좋은방법일것 같네요
: :
: : VCL에서  DragDrop에 관해서 아래글을 읽으시면 좀 도움이 될것 같습니다.
: : http://www.delmadang.com/community/bbs_view.asp?bbsNo=3&bbsCat=42&indx=194787&keyword1=TDragObject&keyword2=
: :
: :
: : 그럼..
: :
: :
: : 해바라기 님이 쓰신 글 :
: : : 장성호님께서 답변해주신대로 구현을 하였습니다.
: : :
: : : 일단 DragOver 함수에 진입하기에는 성공했는데요..
: : :
: : : void  __fastcall CVTV_GroupTree::VTV_GroupTreeDragOver(TBaseVirtualTree *Sender, TObject *Source, TShiftState Shift,
: : :     TDragState State, const TPoint &Pt, TDropMode Mode, int &Effect, bool &Accept)
: : : {
: : :  /* ... 중략 ... */
: : :
: : :     if (nSelLevel != 0 && m_DragSrcNodeParent != Node && m_DragSrcNodeParent != Node->Parent)
: : :     {
: : :               Accept = true;
: : :               //Effect = crDrag;
: : :     }
: : : }
: : :
: : : Accept 의 값이 true인데도 드래그앤드랍이 허용이 되질 않네요..
: : : SendMessage를 하지 않고 정상적으로 DragOver 함수가 호출되어었을 경우엔 이상없이 잘 돌아 가는데요..
: : : 답변부탁드립니다 (^^;;)
: : :
: : :
: : :
: : :
: : :
: : : 장성호 님이 쓰신 글 :
: : : : VirtualTreeView1->BeginDrag(true,0);
: : : : 위와같이 코딩하고 마우스가 VirtualTreeView 위에 올라가면 dragover이벤트가 뜰것입니다.
: : : :
: : : : 그런데 마우스가 VirtualTreeView위에 있지 않으면서 VirtualTreeView에서 dragover이벤트가 뜨게 하려면
: : : :
: : : : CM_DRAG 메세지를  VirtualTreeView에 날리면 되는데 아래 예제를 참조하세요
: : : :
: : : : 예제는
: : : : Button1을 클릭했을때 Memo1이 drag모드로 들어가게 했구요
: : : : Button2를 클릭하면   1회성으로 Memo1에서 DragOver 이벤트가 발생하도록 했습니다.
: : : :
: : : : void __fastcall TForm1::Memo1DragOver(TObject *Sender, TObject *Source,
: : : :       int X, int Y, TDragState State, bool &Accept)
: : : : {
: : : :     Memo1->Lines->Add("Memo1DragOver");
: : : : }
: : : : //---------------------------------------------------------------------------
: : : :
: : : : void __fastcall TForm1::Button1Click(TObject *Sender)
: : : : {
: : : :     Memo1->Lines->Clear();
: : : :     Memo1->BeginDrag(true,1);
: : : : }
: : : : //---------------------------------------------------------------------------
: : : : Longint MyDragMessage(HWND Handle,TDragMessage Msg,TDragObject  *Source,void * Target, const TPoint Pos)
: : : : {
: : : :   TDragRec DragRec;
: : : :   Longint Result=0;
: : : :   if( Handle )
: : : :   {
: : : :     DragRec.Pos = Pos;
: : : :     DragRec.Target = Target;
: : : :     DragRec.Source = Source;
: : : :     DragRec.Docking= false;
: : : :     Result = SendMessage(Handle, CM_DRAG, Longint(Msg), Longint(&DragRec));
: : : :   }
: : : : }
: : : :
: : : : void __fastcall TForm1::Button2Click(TObject *Sender)
: : : : {
: : : :     // TDragMessage = (dmDragEnter, dmDragLeave, dmDragMove, dmDragDrop, dmDragCancel, dmFindTarget);
: : : :     TPoint pt;
: : : :     pt.x=Mouse->CursorPos.x;
: : : :     pt.y=Mouse->CursorPos.y;
: : : :     MyDragMessage(Memo1->Handle,dmDragMove,(TDragObject *)Memo1,Memo1,pt);
: : : :
: : : : }
: : : : //---------------------------------------------------------------------------
: : : :
: : : :
: : : : 그럼..
: : : :
: : : :
: : : :
: : : : 해바라기 님이 쓰신 글 :
: : : : : 메인 윈도우에서 마우스무브 상태를 감지한후, 특정 조건이 맞을때 트리뷰(VirtualTree View)로
: : : : :
: : : : : 드래그오버 메세지를 발생시켜 주고 싶은데.. 어떻게 방법이 없을까요..?;;

+ -

관련 글 리스트
53417 트리뷰의 DragOver 메세지 호출방법(?) 해바라기 1251 2008/05/15
53418     Re:트리뷰의 DragOver 메세지 호출방법(?) 장성호 1443 2008/05/15
53422         Re:Re:트리뷰의 DragOver 메세지 호출방법(?) 해바라기 1200 2008/05/15
53425             Re:Re:Re:트리뷰의 DragOver 메세지 호출방법(?) 장성호 1348 2008/05/16
53429                 Re:Re:Re:Re:트리뷰의 DragOver 메세지 호출방법(?) 해바라기 1279 2008/05/16
53434                     Re:Re:Re:Re:Re:트리뷰의 DragOver 메세지 호출방법(?) 장성호 1682 2008/05/16
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.