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)로
: : :
: : : 드래그오버 메세지를 발생시켜 주고 싶은데.. 어떻게 방법이 없을까요..?;;