#pragma once #include // for CTreeView #include "OpeningCheck.h" #include "resource.h" namespace NDoorWinCheck { class CDataTable; class CSplitFrame : public CFrameWnd { DECLARE_DYNCREATE(CSplitFrame) DECLARE_MESSAGE_MAP() public: virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext); CSplitterWnd m_wndSplit; }; class TreeItemData; class CDoorWinTreeView; class CGridView; // 数据 class CFrameData { public: CFrameData() : m_pGridView(NULL), m_pTreeView(NULL){m_pDataTable = new CDataTable;} ~CFrameData() {delete m_pDataTable;m_pDataTable = NULL;} public: CDataTable *m_pDataTable; CGridView *m_pGridView; CDoorWinTreeView *m_pTreeView; }; enum ETips {eConflictTip = 0, eNoFloorTip, eNoDataTip, eDataInOtherDWGTip, eNoLabelTip, eCorrespondingTip, eBlockData, eDocNotInProj, eTipNum}; // 门窗检查窗口 class CDoorWinFrame : public CFrameWnd { DECLARE_DYNCREATE(CDoorWinFrame) DECLARE_MESSAGE_MAP() public: CDoorWinFrame(); virtual ~CDoorWinFrame(); void SetGridView(CGridView *pGrid); void SetTreeView(CDoorWinTreeView *pTree); CDataTable* GetDataTable() {return m_dataCenter.m_pDataTable;} CFrameData* GetData(); ////////////////////////////////////////////////////////////////////////// // 幻灯片显示函数: //显示幻灯 static void ShowSlide(CStatic& st, CImageDC& imgdc, const TCHAR* sldName); void SetSlideItem(TreeItemData *pItemData); // 清空显示,和保存的数据 void ClearSlideItem(); void ShowSlide2d(CString &strStyle2d); void ShowSlide3d(CString &strStyle3d); // 更新原图 void UpdateDWG(TreeItemData *pItemData); void ReDrawWnd(); // 窗口更新。 // 提示信息 void SetTip (ETips eTip, bool bSet = true); CString GetTip(ETips eTip) const ; CString GetTip() const ; void SetConflictDataNum(int nNum) {m_nConflictDataNum = nNum;}; void SetNoLabelDataNum(int nNum) {m_nNoLabelDataNum = nNum;}; void ShowMessage(); void GetDataTip(CDataTable *pTable); void ClearData(); void ReadDWG(); // 读取DWG中的数据。 BOOL AddTip(UINT idControl, const TCHAR *str=NULL); public: virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd/*, UINT nID, CCreateContext* pContext = NULL*/); protected: virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext); virtual void PostNcDestroy(); // default to delete this. virtual BOOL PreTranslateMessage(MSG* pMsg); afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnClose(); afx_msg void OnShowWindow(BOOL bShow, UINT nStatus); afx_msg void OnDestroy(); afx_msg void OnSize(UINT nType, int cx, int cy); afx_msg BOOL OnEraseBkgnd(CDC* pDC); afx_msg void OnBtnSetClick(); afx_msg void OnBtnUpdate(); afx_msg void OnBtnFromDWG(); afx_msg void OnBtnChoseExtent(); afx_msg void OnPic2dClick(); afx_msg void OnPic3dClick(); afx_msg void OnPaint(); afx_msg LONG_PTR onAcadKeepFocus(UINT_PTR, LONG_PTR); afx_msg void OnSetFocus(CWnd* pOldWnd); afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor); protected: // 距离尺寸计算函数 CRect BtnSetRect() const; CRect Slide2dRect() const; CRect Slide3dRect() const; CRect SplitWndRect(const CRect &rectFrame) const; CRect TipRect(const CRect &rectFrame) const; CRect BtnUpdateRect(const CRect &rectFrame) const; CRect BtnFromDWGRect(const CRect &rectFrame) const; CRect BtnChoseRect(const CRect &rectFrame) const; protected: enum {IDC_BTN_UPDATE = 1, IDC_BTN_FROMDWG, IDC_BTN_EXTENT, IDC_BTN_SET, IDC_IMAGE_2D, IDC_IMAGE_3D, IDC_LABEL_MESSAGE}; CSize m_sizeSet; // 设置按钮的大小 CSize m_sizeBtnBottom; // 底部三个按钮的大小 CSize m_sizeSlide; // slide的宽高 int m_nLabelHei; //提示信息框高度 int m_nLeftBlank, m_nRightBlank, m_nTopBlank, m_nBottomBlank; // 上下左右的留空 // 行间距:上不按钮距离拆分窗口,拆分窗口距离提示信息,提示信息距离底部按钮 int m_nRowBlank1, m_nRowBlank2, m_nRowBlank3; // 列间距(水平方向):设置按钮==slide2d, slide2d==slide3d, 底部按钮之间 int m_nColBlank1, m_nColBlank2, m_nColBlank3; CButton m_btnSet; CSplitFrame *m_pSplitFrame; CEdit m_editTip; CButton m_btnUpdate, m_btnFromDwg, m_btnChoseExtent; CStatic m_pic3d; // 显示三维样式 CStatic m_pic2d; // 显示二维样式 CString m_cs2DStyle; // 2D CString m_cs3DStyle; // 2D CImageDC m_picSlide2d, m_picSlide3d; TreeItemData *m_pItemToSlide; // CButton m_btnImage; CFont font; CFrameData m_dataCenter; int m_nConflictDataNum; int m_nNoLabelDataNum; bool m_bTip[eTipNum]; CToolTipCtrl m_wndToolTip; }; // 树控件的每个选项需要关联一个数据,也用于Grid项, // (工程项,本图项,未创建工程,冲突项)、(楼层项)、(某类型)、(某编号)(某子项,代表一个具体的门窗) enum ETreeItemType {eProj = 0, eDWG, eNoProj, eConflict, eFloor, eSameStyle, eSameName, eOneItem, eOther}; class TreeItemData : public WRowData { protected: TreeItemData() {} // 保护型构造函数,防止外部创建该实例 virtual ~TreeItemData() {} // public: virtual ETreeItemType GetType()const = 0; virtual EEntType GetEntType() const {return eDoorTypeNum;} // 此处的2D3D相对并非绝对的2D、3D。对于不同的子类型,该函数代表不同的意义。 // 注意更新sProp和DWG virtual void SetSlideType2d(CString style) {} virtual void SetSlideType3d(CString style) {} void SetEntSlide(AcDbObjectId &id, SOpeningProp &sProp, CString strStyle, bool b2dOr3d); void SetWidItemSlide(CWidItem *pWidItem, CString strStyle, bool b2dor3d); void SetAryWidItemSlide(AryWidItemPtr &aryWidItem, CString strStyle, bool b2dOr3d); }; class TreeNullItemData : public TreeItemData { virtual ETreeItemType GetType()const {return eOther;} }; // 工程内 class TreeItemProj : public TreeItemData { public: virtual ETreeItemType GetType()const {return eProj;} CDataTable *pTable; BOOL bNeedFloor; // 是否需要分楼层 }; // 本图内 class TreeItemDWG : public TreeItemData { public: virtual ETreeItemType GetType()const {return eDWG;} CDataTable *pTable; // 本图 BOOL bNeedFloor; // 是否需要分楼层 BOOL bOnlyProj; // 是否仅仅需要本工程的数据 // ** }; // 本图未创建工程 class TreeItemNoProj : public TreeItemData { public: virtual ETreeItemType GetType()const {return eNoProj;} CDataTable *pTable; }; // 工程内冲突,工程外冲突,本图冲突 enum EConflictType {eConflictProj = 0, eConflictNoProj, eConflictDWG, eConflictProjDWG}; class TreeItemConflict : public TreeItemData { public: virtual ETreeItemType GetType()const {return eConflict;} CDataTable *pTable; EConflictType nType; // 工程内冲突,未创建工程的冲突,本图冲突, 工程内本图冲突 }; class TreeItemFloor : public TreeItemData { public: virtual ETreeItemType GetType()const {return eFloor;} CGroup *pFloor; // 某层内的所有门窗 }; // 门、窗、弧窗、... class TreeItemSameStyle : public TreeItemData { public: virtual ~TreeItemSameStyle() {ClearAryWidItemPtr(aryWidItemPtr);} virtual ETreeItemType GetType()const {return eSameStyle;} virtual EEntType GetEntType() const; virtual void SetSlideType2d(CString style); virtual void SetSlideType3d(CString style); AryWidItemPtr aryWidItemPtr; // 该类型所对应的所有的item }; // 单个名字的节点分为下面的情况:主编号 class TreeItemSameName : public TreeItemData { public: virtual ~TreeItemSameName() {} virtual ETreeItemType GetType()const {return eSameName;} virtual EEntType GetEntType() const; virtual void SetSlideType2d(CString style); virtual void SetSlideType3d(CString style); CWidItem widItem; // 该类型所对应的所有的item }; // 子编号 class GridItemOneItem : public TreeItemData { public: virtual ETreeItemType GetType()const {return eOneItem;} virtual EEntType GetEntType() const; virtual void SetSlideType2d(CString style); virtual void SetSlideType3d(CString style); EEntType eEntType; CItem *pItem; int nIndex; }; enum EGridColorIndex { eMainLabelColor = 0, // 主编号 eTypeColor, // 门窗类型编号 eFloorColor, // 楼层编号 eChangedColor, // 被修改的数据 eRemovedColor, // 被删除的数据 eRemovedTextColor, eOtherDWGColor, // 其他DWG图纸中的数据 eTempLabelColor, // 临时编号的数据 eOthersPropColor, // 不是自己的属性 eReadOnlyColor, // 只读的属性 eRedConflictColor, // 主编号,“冲突”红显 eColorItemNum // 总的编号的类型数 }; // 门窗属性显示表格 class CPropGrid : public WDGrid { DECLARE_DYNCREATE(CPropGrid) public: CPropGrid() : WDGrid(true, 100), m_nCurRow(-1) {} void RemoveAllItem(); void ReCreate(TreeItemData *pItemData); // 绘制 void CreateProj(TreeItemProj *pItem); void CreateDWG(TreeItemDWG *pItem); void CreateNoProj(TreeItemNoProj *pItem); void CreateConflict(TreeItemConflict *pItem); void CreateFloor(TreeItemFloor *pItem); void CreateOneStyle(TreeItemSameStyle *pItem); void CreateOneName(TreeItemSameName *pItem); WDGridTreeRow* AddNewRow(WDGridTreeRow *pParentRow); // 向列表中添加元素: bool AddSingleItem(CItem* pItem, int index, WDGridTreeRow *pParentRow, AryEShowItem &aryShowItem, int nEntIndex, CStringArray &aryProp); void AddSameNameItem(CWidItem* pWidItem, WDGridTreeRow *pParentRow, AryEShowItem &aryShowItem); void AddSameTypeItem(AryWidItemPtr &aryWidItemPtr, EEntType eEntType, WDGridTreeRow *pParent, AryEShowItem &aryShowItem, BOOL bShowType = TRUE); // 检测某类型是否具有某属性 static BOOL TestHasShowItem(EEntType eEntTyp, bool bText, EShowItem eShowItem); void SetFlagProp(DWORD dw) {m_flagShowProp = dw;} // 设置Grid列信息,通过它来设置列表的列。 void SetGridColumn(AryEtype &aryEtype, AryEShowItem &aryEShowItem); void UpdateDWG(); void RefreshGridContent(); // 每个Grid重新提取内容,更新 void RefreshGridTreeRow(WDGridTreeRow *pRow); // 更新 // 第二列之后,第一列和第二列是标签列 EShowItem GetShowItemIndex(int nCol); //add by lgy 20120301 为了保证修改grid单元格中类型,宽,高等项后 //要修改对应的新编号单元格的内容 CString GetItemSerial(const CString strType); protected: // 保护成员函数: BOOL EmptyGrid() const {return GetColNum() < 2;} // 检测是否有修改过的数据,eCorrespondingTip; bool HasModifiedData(); bool HasModifiedData(WDGridTreeRow *pRow); protected: // 虚函数 // 用来设置颜色 virtual void OnBeforeRefresh(WDGridCell&cell); // 准备combo中的数据 virtual void OnCellComboString(WDGridCell &cell,CComboBox&combo); // 详细的设置一些编辑属性 virtual bool OnBeforeEdit(WDGridCell&cell,bool &bModified); virtual bool OnModified(WDGridCell&cell,CString &text); virtual void OnDataChanged(); DECLARE_MESSAGE_MAP() virtual void OnCurChanged();//当前行列变化,子类一定要调整用基类 int m_nCurRow; DWORD m_flagShowProp; }; class CGridView : public CFormView { DECLARE_DYNCREATE(CGridView) protected: CGridView(); // Form Data public: //{{AFX_DATA(CInputView) enum { IDD = IDD_DLG_GRIDFORM }; //}}AFX_DATA void ReCreate(TreeItemData *pItemData); // 绘制 void UpdateDWG(); void RefreshGridContent(); // 每个Grid重新提取内容,更新 void RefreshGrid(); // Grid更新显示的颜色,内容不变 void Clear() {m_grid.RemoveAllItem();} void SelectRow(long i) {if (i < m_grid.GetRowNum()) m_grid.SelectRow(i);} // Implementation //modify by lgy 20120306 9.0中要求提取图纸之后记录之前修改的页面 CPropGrid m_grid; protected: virtual ~CGridView(); virtual void OnInitialUpdate(); // Generated message map functions //{{AFX_MSG(CInputView) afx_msg void OnSize(UINT nType, int cx, int cy); //}}AFX_MSG DECLARE_MESSAGE_MAP() //CPropGrid m_grid; }; class CDoorWinTreeView : public ::CTreeView { DECLARE_DYNCREATE(CDoorWinTreeView) public: CDoorWinTreeView(); ~CDoorWinTreeView(); // void SetDoorData(); void FillTreeView(); // 取得头分支的名字和扩展数据 // 0:第一分支名字;1:第二分支名字,2:第三分支名字;3:第四分支名字,如果不存在,返回空。 static CString GetHeadItemName(int nFlag); static CString GetHeadItemName1(int nFlag); static TreeItemData* GetHeadItemData(int nFlag); static TreeItemData* GetHeadItemData1(int nFlag); void ShowRootView() const; void Clear(); static void SortWidItemAry(AryWidItemPtr &aryWidItemPtr); static void SortAryItem(AryItemPtr &aryItemPtr); protected: void SetNewStyle(long lStyleMask, BOOL bSetBits); static HTREEITEM AddTreeItem(CItem *pItem, CTreeCtrl &tree, TV_INSERTSTRUCT &tvItem, HTREEITEM hParent); static HTREEITEM AddTreeItem(CTreeCtrl &tree, TV_INSERTSTRUCT &tvItem, CString &text, TreeItemData *pData, HTREEITEM hParent); static void AddWidItemAry(CTreeCtrl &tree, AryWidItemPtr widItem[eDoorTypeNum], HTREEITEM hItemParent); protected: virtual void OnDraw(CDC* pDC); virtual void OnInitialUpdate(); virtual void OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult); // msg afx_msg int OnCreate(LPCREATESTRUCT lpcs); protected: DECLARE_MESSAGE_MAP() }; // 门窗设置对话框 class CSetDlg : public GlwCAcUiDialog { public: CSetDlg(CWnd* pParent = NULL); ~CSetDlg() {} enum { IDD = IDD_DLG_DOORWIN_CHECK_SET}; int CurrSel() const; public: static BOOL CheckCurrDWG() {return m_bCheckCurrDWG;} static BOOL CheckCurrProj() {return m_bCheckCurrProj && !IsEmptyProject();} static BOOL CheckBlock() {return m_bCheckBlock;} static BOOL CheckText() {return m_bCheckText;} static BOOL AccordFloor() {return m_bAccordFloor;} static BOOL IsZoomDoorWin() {return m_bZoomDoorWin;} static BOOL IsShowImag() {return m_bShowImg;} // 供外部调用 // 检测某类型门窗的某种属性是否被选择了。 static BOOL TestItemChecked(EEntType eDoorWinCheckType, EShowItem eItem); // 检测某类型门窗的是否包含某种属性。 static BOOL TestHasShowParam(EEntType eDoorWinCheckType, EShowItem eItem); // 测试该标记中是否选中该选项 static BOOL TestItemIsSet(EShowItem eItem, DWORD flagCheck); // 查看这几个类型都有哪几个参数 static DWORD GetShowFlag(AryEtype &aryType, AryEShowItem &aryShowItem); // 查看这几个类型都有哪几个参数需要显示 static DWORD GetCheckFlag(AryEtype &aryType, AryEShowItem &aryShowItem); static void SetParamFlag(DWORD &dwFlag, int eItem, BOOL bCheck); static BOOL CheckParamFlag(DWORD &dwFlag, int eItem); static void LoadCurDoorMsg(); //加载当前门窗检查中设置的信息,信息从dbf中读出来 void SaveCurDoorMsg(); //保存所需要的参数到DBF中 protected: afx_msg void OnDestroy(); afx_msg void OnSelCmbTypeChange(); afx_msg void OnBtnHelpMsg(); afx_msg void OnClickDWG(); afx_msg void OnClickProj(); DECLARE_MESSAGE_MAP() protected: virtual void DoDataExchange(CDataExchange* pDX); virtual BOOL OnInitDialog(); virtual void OnOK(); virtual void OnCancel(); private: BOOL m_bOldCheckDWG; BOOL m_bOldCheckProj; static BOOL m_bCheckCurrDWG; // 检查本图门窗 static BOOL m_bCheckCurrProj; // 检查本工程门窗 static BOOL m_bCheckBlock; // 检查块参照和外部参照 static BOOL m_bCheckText; // 检查门窗文字 static BOOL m_bAccordFloor; // 分楼层显示 static BOOL m_bZoomDoorWin; // 门窗放大显示 static BOOL m_bShowImg; // 显示二维、三维样式 static CString m_strCurrChose; static int m_nCurrSel; // 记录之前的选择 CComboBox m_cmbType; // 门窗类型分类 CListCtrl m_lstParm;// 显示参数 CButton m_btnCheckFloor; // 是否勾选分层显示; CButton m_btnCheckText; // 检查文字按钮 CButton m_btnCheckBlock; // 检查快按钮 CButton m_btnCheckDWG; // 检查本图 CButton m_btnCheckProj; // 检查本工程 CButton m_btnShowImg; // 显示二维、三维样式。 // 检测某类型门窗的某种属性是否被选择了。 BOOL IsChecked(EEntType eDoorWinCheckType, EShowItem eItem) const; // 设置某类型门窗的某种属性被选择与否。 void SetCheck(EEntType eDoorWinCheckType, int eItem/*EDoorWinShowType组合*/, BOOL bCheck); // 检测某类型门窗的是否包含某种属性。 BOOL HasShowParam(EEntType eDoorWinCheckType, EShowItem eItem) const; // 设置某类型门窗包含某种属性。 void SetShowParam(EEntType eDoorWinCheckType, int eItem/*EDoorWinShowType组合*/, BOOL bHas); void GetCheckParam(int nSel); void InitCheckParam(int nSel); // 显示参数,是否选中 static DWORD m_flagShowParam1[eDoorTypeNum][2]; // 每种类型那些参数是要求选中的 DWORD m_flagShowParam[eDoorTypeNum][2]; // 当前的,用来控制是否保存 }; };