매번 정성스런 답변 감사합니다. (__)
제가 질문을 성급하게 올려 무엇을 원하는지 전달이 제대로 되지 않았네요..
정확한 문제는 드래그앤드랍시 투명 윈도우를 만들어 마우스 포인터를 따라서 움직입니다.
투명윈도우 안에는 적절한 아이콘과 설명이 들어있는데요..
문제는, 마우스포인터가 트리뷰위에 올라와있는게 아니라 투명윈도우 위에 올라와 있어서
직접적으로 드래그오버 메세지를 받질 못하는 상황입니다.
그래서, 생각해낸 꼼수가...
메인윈도우에서 마우스메세지를 받은후 포인터가 트리뷰 안에 있으면서 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)로
: : : :
: : : : 드래그오버 메세지를 발생시켜 주고 싶은데.. 어떻게 방법이 없을까요..?;;