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
[53429] Re:Re:Re:Re:트리뷰의 DragOver 메세지 호출방법(?)
해바라기 [allyhejo] 1278 읽음    2008-05-16 15:00
매번 정성스런 답변 감사합니다. (__)

제가 질문을 성급하게 올려 무엇을 원하는지 전달이 제대로 되지 않았네요..

정확한 문제는 드래그앤드랍시 투명 윈도우를 만들어 마우스 포인터를 따라서 움직입니다.

투명윈도우 안에는 적절한 아이콘과 설명이 들어있는데요..

문제는, 마우스포인터가 트리뷰위에 올라와있는게 아니라 투명윈도우 위에 올라와 있어서

직접적으로 드래그오버 메세지를 받질 못하는 상황입니다.

그래서, 생각해낸 꼼수가...

메인윈도우에서 마우스메세지를 받은후 포인터가 트리뷰 안에 있으면서 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 메세지 호출방법(?) 해바라기 1278 2008/05/16
53434                     Re:Re:Re:Re:Re:트리뷰의 DragOver 메세지 호출방법(?) 장성호 1682 2008/05/16
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.