#include "stdafx.h" #include "JDXZDlg.h" #ifndef EW_ROOT #define EW_ROOT 0 #endif #ifndef WM_ITEMCLICK #define WM_ITEMCLICK (WM_USER+0x109) #endif #ifndef WM_SELFINISH #define WM_SELFINISH (WM_USER+0x111) #endif namespace { void showCtrl(UINT id, bool bShow) { } } IMPLEMENT_DYNAMIC(CJDXZDlg, CDialog) CJDXZDlg::CJDXZDlg(CWnd* pParent /*=NULL*/) : CDialog(CJDXZDlg::IDD, pParent) { m_pWndTree = NULL; m_nAction = -1; } CJDXZDlg::~CJDXZDlg() { } void CJDXZDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_TREE1, m_wndModelTree); DDX_Radio(pDX, IDC_RADIO1, m_nXYZType); DDX_Text(pDX, IDC_EDIT1, m_dOper); } BEGIN_MESSAGE_MAP(CJDXZDlg, CDialog) ON_BN_CLICKED(IDOK, &CJDXZDlg::OnBnClickedOk) ON_NOTIFY(NM_CLICK, IDC_TREE1, &CJDXZDlg::OnNMClickTree1) ON_WM_CLOSE() ON_BN_CLICKED(IDCANCEL, &CJDXZDlg::OnBnClickedCancel) END_MESSAGE_MAP() void CJDXZDlg::SetFuncAction(int nAction) { m_nAction = nAction; } void CJDXZDlg::SetCopyFrom(CTreeCtrl* pTree) { m_pWndTree = pTree; if ( IsWindow(m_hWnd) ) { m_wndModelTree.DeleteItem(m_wndModelTree.GetRootItem()); ShowModelTree(); } } BOOL CJDXZDlg::GetSelectItems(CPtrArray& arItemSel) { arItemSel.Append(m_arItemSel); return !arItemSel.IsEmpty(); } void CJDXZDlg::SetUShapeData(UShapeData& data) { memcpy(&m_UShapeData,&data,sizeof(UShapeData)); } void CJDXZDlg::GetUShapeData(UShapeData& data) { memcpy(&data,&m_UShapeData,sizeof(UShapeData)); } BOOL CJDXZDlg::OnInitDialog() { CDialog::OnInitDialog(); CBitmap bmp; if (!bmp.LoadBitmap (IDB_BITMAPPRIV)) { AfxMessageBox(_T ("Can't load bitmap: %x\n"), IDB_BITMAPPRIV); ASSERT (FALSE); return FALSE; } BITMAP bmpObj; bmp.GetBitmap (&bmpObj); UINT nFlags = ILC_COLOR24 | ILC_MASK; m_Imagelist.Create (16, bmpObj.bmHeight, nFlags, 0, 0); m_Imagelist.Add (&bmp, RGB (255, 0, 0)); m_wndModelTree.SetImageList(&m_Imagelist,TVSIL_NORMAL); ShowModelTree(); return TRUE; } void CJDXZDlg::IteratorMakeTree(HTREEITEM hRootFr,HTREEITEM hRootTo) { CString sItem; int nImage = 0,nSelImage = 0; HTREEITEM hChild = m_pWndTree->GetChildItem(hRootFr); while(hChild != NULL) { sItem = m_pWndTree->GetItemText(hChild); m_pWndTree->GetItemImage(hChild,nImage,nSelImage); HTREEITEM hItem = m_wndModelTree.InsertItem(sItem,nImage,nSelImage,hRootTo); m_mapItemNewToOld.SetAt(hItem,hChild); IteratorMakeTree(hChild,hItem); m_wndModelTree.SelectItem(hRootTo); m_wndModelTree.Expand(hRootTo,TVE_EXPAND); hChild = m_pWndTree->GetNextSiblingItem(hChild); } } void CJDXZDlg::ShowModelTree() { if (m_pWndTree != NULL) { HTREEITEM hRootFr = m_pWndTree->GetRootItem(); HTREEITEM hRootTo = m_wndModelTree.InsertItem(_T("节点造族"),EW_ROOT,EW_ROOT); IteratorMakeTree(hRootFr,hRootTo); } } void CJDXZDlg::ItersectItemSel(HTREEITEM hParent) { HTREEITEM hChild = m_wndModelTree.GetChildItem(hParent); while(hChild != NULL) { if (m_wndModelTree.GetCheck(hChild)) { HTREEITEM hOld = NULL; if ( m_mapItemNewToOld.Lookup(hChild,(void*&)hOld) ) { m_arItemSel.Add(hOld); } } ItersectItemSel(hChild); hChild = m_wndModelTree.GetNextSiblingItem(hChild); } } void CJDXZDlg::OnBnClickedOk() { UpdateData(); m_arItemSel.RemoveAll(); HTREEITEM hRootNew = m_wndModelTree.GetRootItem(); ItersectItemSel(hRootNew); if (m_nOperType != (int)eMove && m_nOperType != (int)eRotate) { ShowWindow(SW_HIDE); GetParent()->EnableWindow(true); } GetParent()->SendMessage(WM_SELFINISH,(WPARAM)m_nAction,0); } void CJDXZDlg::CheckChildItem(HTREEITEM hParent,BOOL bCheck) { HTREEITEM hChild = m_wndModelTree.GetChildItem(hParent); while(hChild != NULL) { m_wndModelTree.SetCheck(hChild,bCheck); CheckChildItem(hChild,bCheck); hChild = m_wndModelTree.GetNextSiblingItem(hChild); } } void CJDXZDlg::OnNMClickTree1(NMHDR *pNMHDR, LRESULT *pResult) { CPoint point,ptcursor; ::GetCursorPos(&point); ptcursor = point; m_wndModelTree.ScreenToClient(&point); UINT uFlags; HTREEITEM hItem = m_wndModelTree.HitTest(point, &uFlags), hP(NULL); if (hItem != NULL) { CString sItem = m_wndModelTree.GetItemText(hItem); // 判断 uFlags if (uFlags == TVHT_ONITEMSTATEICON) // check框 { CheckChildItem(hItem, !m_wndModelTree.GetCheck(hItem)); hP = m_wndModelTree.GetParentItem(hItem); if (hP == m_wndModelTree.GetRootItem()) // 如果父节点是根节点,则不需要发消息 return; else { HTREEITEM hItemNew = NULL; if (m_mapItemNewToOld.Lookup(hItem, (void*&)hItemNew)) { GetParent()->SendMessage(WM_ITEMCLICK, (WPARAM)hItemNew, NULL); } } } } *pResult = 0; } void CJDXZDlg::OnClose() { ShowWindow(SW_HIDE); m_nAction = -1; GetParent()->EnableWindow(true); } void CJDXZDlg::OnBnClickedCancel() { GetParent()->EnableWindow(true); ShowWindow(SW_HIDE); m_nAction = -1; } CJDXZDlg::Type CJDXZDlg::GetOperType() { return (Type)m_nOperType; } void CJDXZDlg::EnableCtrl(UINT id, bool bShow) { CWnd *pWnd = GetDlgItem(id); if (pWnd) pWnd->ShowWindow(bShow ? SW_SHOW : SW_HIDE); } void CJDXZDlg::SetOperType(Type t) { m_nOperType = (int)t; UpdateData(false); if (t != eMove && t != eRotate) { EnableCtrl(IDC_RADIO1, false); EnableCtrl(IDC_RADIO2, false); EnableCtrl(IDC_RADIO3, false); EnableCtrl(IDC_STA_TXT1, false); EnableCtrl(IDC_EDIT1, false); } else { EnableCtrl(IDC_RADIO1, true); EnableCtrl(IDC_RADIO2, true); EnableCtrl(IDC_RADIO3, true); EnableCtrl(IDC_STA_TXT1, true); EnableCtrl(IDC_EDIT1, true); CWnd *pWnd = GetDlgItem(IDC_STA_TXT1); if (pWnd) pWnd->SetWindowText(t == eMove ? _T("米") : _T("度")); } GetParent()->EnableWindow(false); }