-1

다른 프로세스의 창 안에 트리보기 항목을 열거 할 수 있습니다. Treeview의 노드에서 드래그 앤 드롭 작업을 프로그래밍 방식으로 시작하고 제어하는 ​​창으로 항목을 드래그 할 수있게하고 싶습니다. 궁극적으로 각 트리 뷰 항목의 DataObject에 액세스하려고합니다.트리 프로세스 항목을 다른 프로세스로 끌어 오는 창 메시지 보내기

드래그 - 드롭 시퀀스를 시작하고 완료하려면 PostMessage 또는 다른 방법을 사용할 수 있습니까? 마우스의 소유권을 획득하지 않고 (즉, 사용자의 마우스 위치를 방해하지 않고) 수행 할 수 있습니까?

treeview 항목이 축소 된 트리보기 폴더 ( 폴더가없는 경우)에도 동일한 작업을 완료 할 수 있습니까?

+0

트리 뷰는 드래그 드롭을 구현하지 않습니다. 'IDataObject'를 만들지 말자. 부모 윈도우에 드래그하기를 원한다. -'TVN_BEGINDRAG'하지만 모든 드래그 드롭은 맞춤 구현되어야한다. - https://msdn.microsoft.com/en-us/library/windows/desktop/ hh298388 (v = vs.85) .aspx. 너 진짜 목표는 뭐니? – RbMm

+0

실제 목표 : * 궁극적으로 각 트리보기 항목의 DataObject * – ThunderFrame

+0

에 액세스하려고하지만 '각 트리보기 항목의 데이터 개체'에서 이해할 수있는 항목은 무엇입니까? 트리 뷰는 이것을 구현하지 않는다 – RbMm

답변

1

TreeView 자체에는 IDataObject이 없습니다.

사용자가 TreeView 노드를 드래그하려고 할 때 (TreeView가 TNV_BEGINDRAG을 통해 응용 프로그램에 알릴 때)를 감지하면 응용 프로그램이 적절한 IDataObject을 만들고 다음에 전달할 수있는 것을 감지하는 것은 TreeView 소유 응용 프로그램의 책임입니다. DoDragDrop() 함수는 OLE 드래그 작업을 시작하여 프로세스 경계를 ​​넘어 데이터를 전달할 수 있습니다.

나무 노드에 대해 IDataObject을 검색하거나 직접 드래그 작업을 시작하기 위해 TreeView (또는 앱)에 보낼 수있는 창 메시지가 없습니다. 당신이 당신의 말에 할 수있는 유일한 방법은이다에 대한 중 하나는 사용자가 일반적으로 노드를 끌어입니다 생각

  1. simulate mouse input TreeView의 자체에, 그래서.

  2. TVN_BEGINDRAG을 수동으로 시뮬레이션하십시오. 이 경우 VirtualAllocEx()WriteProcessMemory()을 사용하여 적절한 NMTREEVIEW 구조를 TreeView 소유 프로세스의 메모리 주소 공간 내에 할당 한 다음 TVN_BEGINDRAG을 TreeView의 부모 창에 보내서 NMTREEVIEW 구조체를 가리켜 야합니다. 먼저 TVM_HITTESTTVM_GETITEM과 같은 것을 사용하여 TVN_BEGINDRAG이 앱에보고해야하는 정보를 검색하는 것을 의미합니다 (특히 트리 노드의 HTREEITEM 핸들과 LPARAM 값).

은 주위 트리 노드를 드래그하고 그에 따라 행동하려고하는 사용자를 생각으로 소유하는 응용 프로그램을 속일 것이다. 그러나 실제 OLE 드래그 작업을 시작하는 동작은 여전히 ​​진행 중이므로 사용자는 마우스를 응용 프로그램 창 위로 이동하고 마우스 단추를 놓아야합니다 (프로그래밍을 수행하려면 마우스 입력을 시뮬레이트해야 함) 따라서 IDataObject은 정상적으로 창에 놓입니다.

+0

고마워. Treeview가 같은 프로세스에 있지만 제어하지 않으면 옵션 2가 더 간단 해 집니까? 부모 노드를 먼저 확장하지 않고 축소 된 부모 노드 내부로 노드를 드래그하는 데 사용할 수 있습니까? – ThunderFrame

+0

@ThunderFrame 옵션 2는'VirtualAllocEx()'로 메모리를 할당 할 필요가없고'(Read/Write) ProcessMemory()'로 읽고 쓸 수 있기 때문에 더 간단 해집니다. 비 시각적 노드가 "끌 수"있는지 여부는 TreeView 소유자의 구현에 따라 다릅니다. –