图元动态感知
当鼠标在AnyCAD三维控件中掠过图元上方的时候,图元会“高亮”显示,当鼠标移走的时候会回复之前的状态。在一般的窗体控件中会提供MouseEnter/MouseLeave事件。
在AnyCAD提供了图元选择消息,当图元选择的时候会被触发。现在,新版SDK利用同样的机制就可以捕获到“高亮”状态,并很容易的实现MouseEnter/Leave机制。
比如在MFC对话框中实现这样的功能,当鼠标掠过(在点击之前)曲线的时候显示出该线的长度信息:
1 #include <APISelectionChangeArgs.h> 2 #include <APISelectedIdSetQuery.h> 3 void CDialog3DDlg::OnSelectionChanged(const AnyCAD::API::SelectionChangeArgs& args) 4 { 5 auto sceneManager = m_Window3D.GetView().GetSceneManager(); 6 7 //Highlight event mode 8 if (args.IsHighlightMode()) 9 { 10 // get the object id 11 SelectedIdSetQuery query; 12 auto renderer = m_Window3D.GetView().GetRenderer(); 13 renderer.QueryHighlight(query); 14 if (query.GetIds().empty()) 15 { 16 m_Info = _T(""); 17 } 18 else 19 { 20 for (auto id : query.GetIds()) 21 { 22 23 m_Info.Format(_T("ID: %d, Length: %g米"), id.AsInt(), m_mapEdgeLength[id.AsInt()]); 24 break; 25 } 26 } 27 28 29 UpdateData(FALSE); 30 } 31 //Selection event mode 32 else 33 { 34 for (auto id : args.GetIds()) 35 { 36 auto sceneNode = sceneManager.FindNode(id); 37 if (sceneNode.IsValid()) 38 { 39 CString text; 40 text.Format(_T("ID: %d, Length: %g m"), id.AsInt(), m_mapEdgeLength[id.AsInt()]); 41 MessageBox(text); 42 } 43 break; 44 } 45 } 46 47 }
完整代码请查看C++SDK自带的例子