本專案實作一套基於 VC++ 的樹狀策略編輯器,提供多文件視覺化介面,支援基本策略語句的拖曳排序、屬性編輯、檔案儲存與動態載入,適合規則引擎、工作流配置等場景。
CStrategyEditorApp (CWinApp)
├── CMainFrame (CMDIFrameWnd)
├── CStrategyDoc (CDocument) - 策略資料模型
│ └── CStrategyTree - 樹狀結構管理
└── CStrategyView (CTreeView) - 視覺化編輯介面
├── 拖曳處理 (TVN_BEGINDRAG, TVN_ENDDRAG)
├── 右鍵選單 (IDR_POPUP_MENU)
└── 屬性對話框 (CPropertyDlg)
void CStrategyView::OnBeginDrag(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
m_hDragItem = pNMTreeView->itemNew.hItem;
m_pDragImage = m_Tree.CreateDragImage(m_hDragItem);
m_pDragImage->BeginDrag(0, CPoint(0,0));
m_pDragImage->DragEnter(GetDesktopWindow(), pNMTreeView->ptDrag);
SetCapture();
*pResult = 0;
}
void CStrategyView::OnMouseMove(UINT nFlags, CPoint point)
{
if (m_pDragImage) {
ClientToScreen(&point);
m_pDragImage->DragMove(point);
CWnd* pDropWnd = WindowFromPoint(point);
HTREEITEM hDropItem = m_Tree.ScreenToClient(&point),
m_Tree.HitTest(point, &flags);
if (hDropItem && hDropItem != m_hDragItem)
m_Tree.SelectDropTarget(hDropItem);
}
CTreeView::OnMouseMove(nFlags, point);
}
void CStrategyDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring()) {
ar << m_strategyCount;
for (auto& stmt : m_statements) {
ar << stmt.type << stmt.order << stmt.parameters;
}
} else {
ar >> m_strategyCount;
for (int i=0; i> stmt.type >> stmt.order >> stmt.parameters;
m_statements.push_back(stmt);
}
UpdateAllViews(NULL);
}
}
