#include "StdAfx.h" #include "resource.h" #include "DockDialog.h" #include "ChildFrame.h" #include "MyListView.h" #include "dbsymtb.h " #include "AddBlockDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif CDockDialog::CDockDialog(CWnd *pParent /*=NULL*/, HINSTANCE hInstance /*=NULL*/) : CAcUiDialog(CDockDialog::IDD, pParent, hInstance) { //{{AFX_DATA_INIT(CDockDialog) m_pMyFrame = NULL; //}}AFX_DATA_INIT m_nCurrentPos = 0; m_bFirst = FALSE; m_bFouth = TRUE; m_bSecond = TRUE; m_bThree = TRUE; m_bCurDb = FALSE; // 加载文件类型BMP } void CDockDialog::DoDataExchange(CDataExchange *pDX) { CAcUiDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDockDialog) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CDockDialog, CAcUiDialog) //{{AFX_MSG_MAP(CDockDialog) ON_WM_CREATE() ON_WM_SIZE() ON_WM_DESTROY() ON_NOTIFY_EX(TTN_NEEDTEXT, 0, OnToolTipText) ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_TOOLBAR, OnDropDown) ON_WM_INITMENUPOPUP() ON_COMMAND(ID_BUTTONFIRST, OnButtonfirst) ON_COMMAND(ID_BUTTONSECOND, OnButtonsecond) ON_COMMAND(ID_BUTTONTREE, OnButtontree) ON_COMMAND(ID_BUTTONFOUR, OnButtonfour) ON_COMMAND(ID_BUTTONFIVE, OnButtonfive) ON_COMMAND(ID_BUTTONSIX, OnButtonsix) ON_COMMAND(ID_BLOCKINSERT, OnInSertBlock) ON_UPDATE_COMMAND_UI(ID_BLOCKINSERT, OnUpdateBlockInsert) ON_COMMAND(ID_BLOCKINSTEAD, OnBlockInstead) ON_UPDATE_COMMAND_UI(ID_BLOCKINSTEAD, OnUpdateBlockInstead) ON_COMMAND(ID_BLOCKDEL, OnBlockDel) ON_UPDATE_COMMAND_UI(ID_BLOCKDEL, OnUpdateBlockDel) ON_COMMAND(ID_SELECTALL, OnSelectAll) ON_UPDATE_COMMAND_UI(ID_SELECTALL, OnUpdateSelectAll) ON_COMMAND(ID_BLOCKSET, OnBlockSet) ON_UPDATE_COMMAND_UI(ID_BLOCKSET, OnUpdateBlockSet) ON_UPDATE_COMMAND_UI(ID_BUTTONFIRST, OnUpdateButtonfirst) ON_UPDATE_COMMAND_UI(ID_BUTTONSECOND, OnUpdateButtonsecond) ON_UPDATE_COMMAND_UI(ID_BUTTONTREE, OnUpdateButtontree) ON_UPDATE_COMMAND_UI(ID_BUTTONFOUR, OnUpdateButtonfour) ON_UPDATE_COMMAND_UI(ID_BUTTONFIVE, OnUpdateButtonfive) ON_UPDATE_COMMAND_UI(ID_BUTTONSIX, OnUpdateButtonsix) ON_COMMAND(ID_MENUITEMFIRST, OnBigIcon) ON_COMMAND(ID_MENUITEMSECOND, OnSmallIcon) ON_COMMAND(ID_MENUITEMTREE, OnListIcon) ON_COMMAND(ID_MENUITEMFOUR, OnReportIcon) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDockDialog message handlers /* BOOL CDockDialog::PreTranslateMessage(MSG* pMsg) { m_wndToolBar.SendMessage(WM_IDLEUPDATECMDUI, (WPARAM)TRUE, 0L); //modify by hrp return CAcUiDialog::PreTranslateMessage(pMsg); }*/ void CDockDialog::OnUpdateBlockInsert(CCmdUI *pCmdUI) { if (getListCtrl().GetSelectedCount()>0) pCmdUI->Enable(TRUE); else pCmdUI->Enable(FALSE); } void CDockDialog::OnUpdateBlockInstead(CCmdUI *pCmdUI) { if (getListCtrl().GetSelectedCount()>0) pCmdUI->Enable(TRUE); else pCmdUI->Enable(FALSE); } void CDockDialog::OnUpdateBlockDel(CCmdUI *pCmdUI) { if (getListCtrl().GetSelectedCount()>0) pCmdUI->Enable(TRUE); else pCmdUI->Enable(FALSE); } void CDockDialog::OnUpdateBlockSet(CCmdUI *pCmdUI) { if (getListCtrl().GetSelectedCount()>0) pCmdUI->Enable(TRUE); else pCmdUI->Enable(FALSE); } void CDockDialog::OnUpdateSelectAll(CCmdUI *pCmdUI) { pCmdUI->Enable(TRUE); } void CDockDialog::OnBlockInstead() { CMainFrame *pMain = m_pMyFrame; CWnd *pWnd = (m_pMyFrame->m_wndSplitter).GetPane(0, 0); CChildFrame *pChild = ((CChildFrame *)((m_pMyFrame->m_wndSplitter).GetPane(0, 0))); CMyListView *pListView = (CMyListView *)(pChild->m_wndSplitter.GetPane(0, 0)); pListView->BlockInstead(); } void CDockDialog::OnBlockDel() { CMainFrame *pMain = m_pMyFrame; CWnd *pWnd = (m_pMyFrame->m_wndSplitter).GetPane(0, 0); CChildFrame *pChild = ((CChildFrame *)((m_pMyFrame->m_wndSplitter).GetPane(0, 0))); CMyListView *pListView = (CMyListView *)(pChild->m_wndSplitter.GetPane(0, 0)); pListView->DeleteBlock(); //pListView->BlockInstead(); } void CDockDialog::OnBlockSet() { CMainFrame *pMain = m_pMyFrame; CWnd *pWnd = (m_pMyFrame->m_wndSplitter).GetPane(0, 0); CChildFrame *pChild = ((CChildFrame *)((m_pMyFrame->m_wndSplitter).GetPane(0, 0))); CMyListView *pListView = (CMyListView *)(pChild->m_wndSplitter.GetPane(0, 0)); pListView->SetBlockCommand(); //pListView->BlockInstead(); } void CDockDialog::OnSelectAll() { CMainFrame *pMain = m_pMyFrame; CWnd *pWnd = (m_pMyFrame->m_wndSplitter).GetPane(0, 0); CChildFrame *pChild = ((CChildFrame *)((m_pMyFrame->m_wndSplitter).GetPane(0, 0))); CMyListView *pListView = (CMyListView *)(pChild->m_wndSplitter.GetPane(0, 0)); pListView->SelectAll(); } void CDockDialog::OnInSertBlock() { CMainFrame *pMain = m_pMyFrame; CWnd *pWnd = (m_pMyFrame->m_wndSplitter).GetPane(0, 0); CChildFrame *pChild = ((CChildFrame *)((m_pMyFrame->m_wndSplitter).GetPane(0, 0))); CMyListView *pListView = (CMyListView *)(pChild->m_wndSplitter.GetPane(0, 0)); pListView->InSertBlock(); } BOOL CDockDialog::OnInitDialog() { CAcUiDialog::OnInitDialog(); AfxSetResourceHandle(_hdllInstance); ////////////////////////////////////////////////////////////////////////// // 工具条 ////////////////////////////////////////////////////////////////////////// // 增加工具条功能 if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_TOOLTIPS | CBRS_FLYBY|CBRS_SIZE_DYNAMIC, CRect(0, 2, 0, 0)) || !m_wndToolBar.LoadToolBar(IDR_DOCKTOOLBAR)) { TRACE0(_T("未能创建工具栏\n")); return -1; } m_wndToolBar.ShowWindow(SW_SHOW); // 修改工具条为下拉样式 m_wndToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS); int i = m_wndToolBar.CommandToIndex(ID_BUTTONSIX); UINT id, style; int image; m_wndToolBar.GetButtonInfo(i, id, style, image); // m_wndToolBar.SetButtonInfo(i,id,TBSTYLE_DROPDOWN,image); AfxSetResourceHandle(acedGetAcadResourceInstance()); // 重排对话框中控件位置 CRect rcClientStart; CRect rcClientNow; GetClientRect(rcClientStart); RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0, reposQuery, rcClientNow); CPoint ptOffset(rcClientNow.left - rcClientStart.left, rcClientNow.top - rcClientStart.top); CRect rcChild; CWnd *pwndChild = GetWindow(GW_CHILD); while (pwndChild) { pwndChild->GetWindowRect(rcChild); ScreenToClient(rcChild); rcChild.OffsetRect(ptOffset); pwndChild->MoveWindow(rcChild, FALSE); pwndChild = pwndChild->GetNextWindow(); } // 对齐对话框 CRect rcWindow; GetWindowRect(rcWindow); rcWindow.right += rcClientStart.Width() - rcClientNow.Width(); rcWindow.bottom += rcClientStart.Height() - rcClientNow.Height(); MoveWindow(rcWindow, FALSE); // 将工具条加到对话框中 RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); /////////////////////// CRect rect; getListCtrl().GetClientRect(&rect); getListCtrl().InsertColumn(0, _T(""), LVCFMT_LEFT, rect.right / 2, -1); // 得到软件的安装路径 BaseFuncs::GetPathName(m_sPathName); m_sDirPath = m_sPathName; HBITMAP hBit = ::LoadBitmap(_hdllInstance, MAKEINTRESOURCE(IDB_FILETYPE16)); if (hBit != NULL) m_FileTypeBMP.Attach(hBit); else acutPrintf(_T("\n没有找到指定的FileType16X16.bmp文件!")); // 添加列表数据 AddItemToTreeCtrl(); /* long nStyle; if(getListCtrl().m_hWnd!=NULL) { nStyle=GetWindowLong(getListCtrl().m_hWnd,GWL_STYLE ); SetWindowLong(getListCtrl().m_hWnd,GWL_STYLE,nStyle|LVS_AUTOARRANGE); }*/ return TRUE; } int CDockDialog::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CAcUiDialog::OnCreate(lpCreateStruct) == -1) return -1; CString strMyClass = AfxRegisterWndClass(CS_VREDRAW | CS_HREDRAW, ::LoadCursor(NULL, IDC_ARROW), (HBRUSH) ::GetStockObject(WHITE_BRUSH), ::LoadIcon(NULL, IDI_APPLICATION)); m_pMyFrame = new CMainFrame(); m_pMyFrame->Create(strMyClass, _T(""), WS_CHILD, CRect(0, 0, 1, 1), this); m_pMyFrame->ShowWindow(SW_SHOW); m_pMyFrame->MoveWindow(0, 0, 300, 300); return 0; } void CDockDialog::OnSize(UINT nType, int cx, int cy) { CAcUiDialog::OnSize(nType, cx, cy); if (GetDlgItem(IDC_STATIC1) == NULL) return; CRect cConRect, cDiaRect; GetWindowRect(&cDiaRect); GetDlgItem(IDC_STATIC1)->GetWindowRect(&cConRect); ScreenToClient(&cConRect); ScreenToClient(&cDiaRect); cConRect.left = cConRect.left-2; cConRect.bottom = cDiaRect.bottom; cConRect.right = cDiaRect.right+2; m_pMyFrame->MoveWindow(&cConRect, FALSE); } void CDockDialog::OnDestroy() { CAcUiDialog::OnDestroy(); if (m_pMyFrame) { m_pMyFrame->DestroyWindow(); m_pMyFrame = NULL; } } BOOL CDockDialog::OnCommand(WPARAM wParam, LPARAM lParam) { switch (wParam) { case IDOK: case IDCANCEL: return (FALSE); } return CAcUiDialog::OnCommand(wParam, lParam); } ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // 插入块 1 void CDockDialog::OnButtonfirst() { SetState(); m_nCurrentPos = 0; getTreeCtrl().DeleteAllItems(); getListCtrl().DeleteAllItems(); getPreviewCtrl().mpView->eraseAll(); // getPreviewCtrl().mpDevice->setBackgroundColor(g_BlkViewClr); getPreviewCtrl().mpView->update(); HTREEITEM hParentItem; hParentItem = getTreeCtrl().InsertItem(m_sIniArr[m_nCurrentPos], _ttoi(m_sIniBigIcon[m_nCurrentPos]), _ttoi(m_sIniSmlIcon[m_nCurrentPos])); //modify by hrp CString sIniName = m_sPathName + _T("\\tk\\Customer\\图库中心\\")+m_sIniArr[m_nCurrentPos]; ViewIni(hParentItem, sIniName); getTreeCtrl().Expand(hParentItem, TVE_TOGGLE); return; } void CDockDialog::OnUpdateButtonfirst(CCmdUI *pCmdUI) { pCmdUI->Enable(m_bFirst); // pCmdUI->SetCheck(m_bFirst); } void CDockDialog::SetState() { m_bFirst = !m_bFirst; m_bSecond = !m_bSecond; } // 文件视图 2 void CDockDialog::OnButtonsecond() { SetState(); m_nCurrentPos = 1; getTreeCtrl().DeleteAllItems(); getListCtrl().DeleteAllItems(); getPreviewCtrl().mpView->eraseAll(); // getPreviewCtrl().mpDevice->setBackgroundColor(g_BlkViewClr); getPreviewCtrl().mpView->update(); HTREEITEM hParentItem; hParentItem = getTreeCtrl().InsertItem(m_sIniArr[m_nCurrentPos], _ttoi(m_sIniBigIcon[m_nCurrentPos]), _ttoi(m_sIniSmlIcon[m_nCurrentPos])); //modify by hrp CString sIniName = m_sPathName + _T("\\tk\\Customer\\图库中心\\")+m_sIniArr[m_nCurrentPos]; ViewIni(hParentItem, sIniName); getTreeCtrl().Expand(hParentItem, TVE_TOGGLE); } void CDockDialog::OnUpdateButtonsecond(CCmdUI *pCmdUI) { pCmdUI->Enable(m_bSecond); // pCmdUI->SetCheck(m_bSecond); } // 插入图案 3 void CDockDialog::OnButtontree() { m_pMyFrame->ShowListDock(); } void CDockDialog::OnUpdateButtontree(CCmdUI *pCmdUI) { pCmdUI->SetCheck(m_pMyFrame->IsShowListDock()); } // 显示预览 4 void CDockDialog::OnButtonfour() { m_pMyFrame->ShowPreViewCtrl(); } void CDockDialog::OnUpdateButtonfour(CCmdUI *pCmdUI) { pCmdUI->SetCheck(m_pMyFrame->IsShowPreViewCtrl()); } // 显示说明 5 void CDockDialog::OnButtonfive() { m_pMyFrame->ShowExplainCtrl(); } void CDockDialog::OnUpdateButtonfive(CCmdUI *pCmdUI) { pCmdUI->SetCheck(m_pMyFrame->IsShowExplainCtrl()); } // 显示方式 6 void CDockDialog::OnButtonsix() { } void CDockDialog::OnUpdateButtonsix(CCmdUI *pCmdUI) { } //工具栏提示 BOOL CDockDialog::OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *pResult) { CAcModuleResourceOverride res; ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW); // UNICODE消息 TOOLTIPTEXTA *pTTTA = (TOOLTIPTEXTA *)pNMHDR; TOOLTIPTEXTW *pTTTW = (TOOLTIPTEXTW *)pNMHDR; //TCHAR szFullText[512]; CString strTipText; CString strStatusText; UINT nID = (UINT)pNMHDR->idFrom; if (pNMHDR->code == TTN_NEEDTEXTA && (pTTTA->uFlags & TTF_IDISHWND) || pNMHDR->code == TTN_NEEDTEXTW && (pTTTW->uFlags & TTF_IDISHWND)) { // idFrom为工具条的HWND nID = ::GetDlgCtrlID((HWND)nID); } if (nID != 0) //不为分隔符 { strTipText.LoadString(nID); // 得到提示的文字 strTipText = strTipText.Mid(strTipText.Find('\n', 0)+1); #ifndef _UNICODE if (pNMHDR->code == TTN_NEEDTEXTA) { lstrcpyn(pTTTA->szText, strTipText, sizeof(pTTTA->szText)); } else { _mbstowcsz(pTTTW->szText, strTipText, sizeof(pTTTW->szText)); } #else if (pNMHDR->code == TTN_NEEDTEXTA) { _wcstombsz(pTTTA->szText, strTipText, sizeof(pTTTA->szText)); } else { lstrcpyn(pTTTW->szText, strTipText, sizeof(pTTTW->szText)); } #endif *pResult = 0; // 使工具条提示窗口在最上面 ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE| SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER); return TRUE; } return TRUE; } // 工具条下拉消息 void CDockDialog::OnDropDown(NMHDR *pNotifyStruct, LRESULT *result) { CWnd *pWnd; UINT nID; NMTOOLBAR *pInfo = (NMTOOLBAR *)pNotifyStruct; switch (pInfo->iItem) { case ID_BUTTONSIX: pWnd = &m_wndToolBar; nID = IDR_MENU1; break; default: return; } CString sParentText = getTreeCtrl().m_sCurParentText; // load and display popup menu CPoint point; GetCursorPos(&point); CMenu menu; menu.LoadMenu(nID); menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this); } // 更新下拉菜单 void CDockDialog::OnInitMenuPopup(CMenu *pPopupMenu, UINT nIndex, BOOL bSysMenu) { if (!bSysMenu) { ASSERT(pPopupMenu != NULL); // check the enabled state of various menu items CCmdUI state; state.m_pMenu = pPopupMenu; ASSERT(state.m_pOther == NULL); state.m_nIndexMax = pPopupMenu->GetMenuItemCount(); for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax; state.m_nIndex++) { state.m_nID = pPopupMenu->GetMenuItemID(state.m_nIndex); if (state.m_nID == 0) continue; // menu separator or invalid cmd - ignore it ASSERT(state.m_pOther == NULL); ASSERT(state.m_pMenu != NULL); if (state.m_nID == (UINT)-1) { // possibly a popup menu, route to first item of that popup state.m_pSubMenu = pPopupMenu->GetSubMenu(state.m_nIndex); if (state.m_pSubMenu == NULL || (state.m_nID = state.m_pSubMenu->GetMenuItemID(0)) == 0 || state.m_nID == (UINT)-1) { continue; // first item of popup can't be routed to } state.DoUpdate(this, FALSE); // popups are never auto disabled } else { // normal menu item // Auto enable/disable if command is _not_ a system command state.m_pSubMenu = NULL; state.DoUpdate(this, state.m_nID < 0xF000); } } } } CListCtrl &CDockDialog::getListCtrl() { CMainFrame *pMain = m_pMyFrame; CWnd *pWnd = (m_pMyFrame->m_wndSplitter).GetPane(0, 0); CChildFrame *pChild = ((CChildFrame *)((m_pMyFrame->m_wndSplitter).GetPane(0, 0))); CMyListView *pListView = (CMyListView *)(pChild->m_wndSplitter.GetPane(0, 0)); return pListView->GetListCtrl(); } CCoolTreeCtrl &CDockDialog::getTreeCtrl() { return m_pMyFrame->m_wndMyDialogBar.m_tree; } CGsPreviewCtrl &CDockDialog::getPreviewCtrl() { CMainFrame *pMain = m_pMyFrame; CWnd *pWnd = (m_pMyFrame->m_wndSplitter).GetPane(0, 0); CChildFrame *pChild = ((CChildFrame *)((m_pMyFrame->m_wndSplitter).GetPane(0, 0))); return pChild->m_wndPreViewBar.m_previewCtrl; //hrp } CHYCoolBar3 &CDockDialog::getExPlainBar() { CMainFrame *pMain = m_pMyFrame; CWnd *pWnd = (m_pMyFrame->m_wndSplitter).GetPane(0, 0); CChildFrame *pChild = ((CChildFrame *)((m_pMyFrame->m_wndSplitter).GetPane(0, 0))); return pChild->m_wndExplainBar; } void CDockDialog::GetIniArray() { CString sIniName = m_sPathName+_T("\\tk\\Customer\\图库中心"); //GetFolderByIni(sIniName,m_sIniArr); BaseFuncs::GetInIFolderAndIcon(sIniName, m_sIniArr, m_sIniBigIcon, m_sIniSmlIcon); } void CDockDialog::AddItemToTreeCtrl() { if (!getTreeCtrl().m_hWnd) return; // 加载ICON到imageList m_TreeImage.Create(16, 16, ILC_MASK, 15, 0); m_TreeImage.Add(&m_FileTypeBMP, RGB(255, 255, 255)); getTreeCtrl().SetImageList(&m_TreeImage, TVSIL_NORMAL); getTreeCtrl().SetIndent(18); getTreeCtrl().SetItemHeight(18); ////////////////////////////////////////////////////////////////////////// // 添加数据 ************************************************************** CStringArray sDwgNameArray; CString sDirPath; HTREEITEM hItem;// hItemChild; sDirPath = m_sPathName + _T("\\tk\\Customer\\图库中心\\图块库"); HTREEITEM hParentItem; hParentItem = hItem = getTreeCtrl().InsertItem(_T("图块库"), 0, 1); ViewIni(hParentItem, sDirPath); hParentItem = hItem = getTreeCtrl().InsertItem(_T("用户图库"), 0, 1); sDirPath = m_sPathName + _T("\\tk\\Customer\\图库中心\\用户图库"); ViewIni(hParentItem, sDirPath); } BOOL IsOpenFile(CString strFileName, AcApDocument *&pOpenDoc) { strFileName.MakeLower(); BOOL bFileAlreadyOpened = FALSE; AcApDocumentIterator *pIterator; pIterator = acDocManager->newAcApDocumentIterator(); AcApDocument *pDoc; CString strDocName; for (; !pIterator->done(); pIterator->step()) { pDoc = pIterator->document(); strDocName = pDoc->fileName(); strDocName.MakeLower(); if (strFileName == strDocName) { pOpenDoc = pDoc; // acDocManager->setCurDocument(pDoc,AcAp::kNone,true); bFileAlreadyOpened = TRUE; break; } } delete pIterator; return bFileAlreadyOpened; } void CDockDialog::AddItemToListCtrl(CString sDwgName) //更新listview { if (!getListCtrl().m_hWnd) return; getListCtrl().DeleteAllItems(); CString sCurParentText = getTreeCtrl().m_sCurParentText; CString sCurSltText = getTreeCtrl().m_sCurSltText; m_ListImage.DeleteImageList(); { AcDbDatabase *pDb = NULL; AcDbBlockTable *pBlockTable = NULL; AcDbBlockTableIterator *pBlkItr = NULL; AcDbBlockTableRecord *pBlkTlbRcd = NULL; CStringArray strNameArray; // 得到一个DWG文件内部的所有块 AcApDocument *pDoc = NULL; BOOL bIsOpenDocument = FALSE; if (bIsOpenDocument = IsOpenFile(sDwgName, pDoc)) { pDb = pDoc->database(); acDocManagerPtr()->lockDocument(curDoc()); } else { acDocManagerPtr()->lockDocument(curDoc()); pDb = new AcDbDatabase(Adesk::kFalse); Acad::ErrorStatus res1 = pDb->readDwgFile(sDwgName); } Acad::ErrorStatus res = pDb->getSymbolTable(pBlockTable, AcDb::kForRead); if (res != Acad::eOk) { if (!bIsOpenDocument) delete pDb; acDocManagerPtr()->unlockDocument(curDoc()); return; } pBlockTable->newIterator(pBlkItr); if (pBlkItr == NULL) { pBlockTable->close(); delete pBlkItr; if (!bIsOpenDocument) delete pDb; acDocManagerPtr()->unlockDocument(curDoc()); return; } // 得到内部块的数量 int iNum = 0; for (; !pBlkItr->done(); pBlkItr->step()) { iNum++; } delete pBlkItr; pBlockTable->newIterator(pBlkItr); //ILC_COLOR8 m_ListImage.Create(32, 32, ILC_MASK, iNum, 0); // AfxMessageBox("hrp"); iNum = 0; for (; !pBlkItr->done(); pBlkItr->step()) { ACHAR *RcdName; if (pBlkItr->getRecord(pBlkTlbRcd, AcDb::kForRead)!=Acad::eOk) continue; pBlkTlbRcd->getName(RcdName); pBlkTlbRcd->close(); CString sName = RcdName; if (RcdName) free(RcdName); if (sName.Find(_T("*"))>=0) continue; // 根据一个内部块,得到ad对应的ICON if (pBlkTlbRcd->hasPreviewIcon()) { AcDbBlockTableRecord::PreviewIcon previewIcon; pBlkTlbRcd->getPreviewIcon(previewIcon); HANDLE hDib = BaseFuncs::readDibFromMemory((LPVOID)previewIcon.asArrayPtr()); HBITMAP hBitmap = BaseFuncs::BitmapFromDib(hDib, NULL); if (hBitmap) { m_ListImage.Add(CBitmap::FromHandle(hBitmap), RGB(255, 0, 255)); ::DeleteObject(hBitmap); strNameArray.Add(sName); } if (hDib) GlobalFree(hDib); } else { HICON hIcon = AfxGetApp()->LoadIcon(IDI_ICON1); m_ListImage.Add(hIcon); strNameArray.Add(sName); } } pBlockTable->close(); delete pBlkItr; if (!bIsOpenDocument) delete pDb; acDocManagerPtr()->unlockDocument(curDoc()); // 插入到ListCtrl中 int iCount = (int)strNameArray.GetSize(); //设置listwnd中的说明数组 getListCtrl().SetImageList(&m_ListImage, TVSIL_NORMAL); getListCtrl().SetImageList(&m_ListImage, LVSIL_SMALL); for (int i = 0; im_sExplains.SetAt(i,"未找到图块说明"); getListCtrl().InsertItem(i, strNameArray.GetAt(i), i); //CListCtrl } } } void CDockDialog::ViewIni(HTREEITEM hParent, CString sIniName) { CStringArray sSubDir; BaseFuncs::GetSubDir(sIniName, sSubDir); int nLen = 0; for (nLen = 0; nLenSetFocus(); //设置CAD焦点 // CAD_SendStringToExecute("pline",FALSE); // return; CString sText; AcDbObjectIdArray ExtIds; AcDbObjectIdArray DftIds; AcDbObjectId ExtId; AcDbObjectId DftId; ads_point pt; ads_name first; ads_name last; acedInitGet(0, _T("D S")); ACHAR kw[10]; ads_name ExtName; ads_name DftName; ads_point OutPnt; ads_point InPnt; AcDbObjectId FirstId; AcDbObjectId LastId; while (1) { acdbEntLast(first); acdbGetObjectId(FirstId, first); acedInitGet(0, _T("S")); //绘边界(D)/ switch (acedGetPoint(NULL, _T("\n请在要填充的区域内点取一点: 或[选边界(S)]"), pt)) { case RTNORM: ExtIds.setLogicalLength(0); DftIds.setLogicalLength(0); sText.Format(_T("-boundary %0.2f,%0.2f "), pt[0], pt[1]); BaseFuncs::CAD_SendStringToExecute(sText, TRUE); BaseFuncs::ClearAcadCmdLine(); acdbEntLast(last); acdbGetObjectId(LastId, last); if (FirstId!=LastId) { ExtIds.append(LastId); acdbEntNext(first, first); acdbGetObjectId(FirstId, first); if (FirstId!=LastId) { DftIds.append(FirstId); } BaseFuncs::makeHatch3(_T("SOLID"), ExtIds, DftIds, nColor); BaseFuncs::DeleteEnt(LastId); if (DftIds.logicalLength()>0) BaseFuncs::DeleteEnt(FirstId); } break; case RTKWORD: acedGetInput(kw); switch (kw[0]) { case 'D': BaseFuncs::DrawD(DftId); { ExtIds.setLogicalLength(0); DftIds.setLogicalLength(0); DftIds.append(DftId); BaseFuncs::makeHatch3(_T("SOLID"), ExtIds, DftIds, nColor); BaseFuncs::ClearAcadCmdLine(); } break; case 'S': ExtIds.setLogicalLength(0); DftIds.setLogicalLength(0); if (acedEntSel(_T("\n选择要填充的边界:"), ExtName, OutPnt)!=RTNORM) return; acedEntSel(_T("\n选择内部孤岛边界:"), DftName, InPnt); if (acdbGetObjectId(ExtId, ExtName)==Acad::eOk) ExtIds.append(ExtId); if (acdbGetObjectId(DftId, DftName)==Acad::eOk) DftIds.append(DftId); BaseFuncs::makeHatch3(_T("SOLID"), ExtIds, DftIds, nColor); BaseFuncs::ClearAcadCmdLine(); break; default: BaseFuncs::ClearAcadCmdLine(); return; } break; default: BaseFuncs::ClearAcadCmdLine(); return; } } } void CDockDialog::patternHatch(CString sPattern) //填充 { if (acedGetAcadDwgView()!=NULL) acedGetAcadDwgView()->SetFocus(); //设置CAD焦点 CString sText; AcDbObjectIdArray ExtIds; AcDbObjectIdArray DftIds; AcDbObjectId ExtId; AcDbObjectId DftId; ads_point pt; ads_name first; ACHAR kw[10]; AcDbObjectId FirstId; AcDbObjectId LastId; acdbEntLast(first); acdbGetObjectId(FirstId, first); double dAngle = 0.0; double dScale = 10; if ((acedGetReal(_T("\n输入角度(0.0):"), &dAngle)==RTCAN)) return; if (acedGetReal(_T("\n放大比例(10):"), &dScale)==RTCAN) return; CString sNew; acedInitGet(0, _T("S")); //绘边界(D)/ switch (acedGetPoint(NULL, _T("\n请在要填充的区域内点取一点: 或[选边界(S)]"), pt)) { case RTNORM: ExtIds.setLogicalLength(0); DftIds.setLogicalLength(0); sText = _T("-bhatch p ") +sPattern; sNew.Format(_T(" %0.2f %0.2f %0.2f,%0.2f "), dScale, dAngle, pt[0], pt[1]); sText = sText+sNew; BaseFuncs::CAD_SendStringToExecute(sText, TRUE); BaseFuncs::ClearAcadCmdLine(); return; case RTKWORD: acedGetInput(kw); switch (kw[0]) { case 'D': break; case 'S': sText = _T("hatch ") +sPattern; sNew.Format(_T(" %0.2f %0.2f "), dScale, dAngle); sText = sText+sNew; BaseFuncs::CAD_SendStringToExecute(sText, FALSE); return; default: BaseFuncs::ClearAcadCmdLine(); return; } break; default: BaseFuncs::ClearAcadCmdLine(); return; } } void CDockDialog::OnBigIcon() //大图标 { CChildFrame *pChild = ((CChildFrame *)((m_pMyFrame->m_wndSplitter).GetPane(0, 0))); CMyListView *pListView = (CMyListView *)(pChild->m_wndSplitter.GetPane(0, 0)); pListView->ModifyStyle(LVS_TYPEMASK, LVS_ICON); } void CDockDialog::OnSmallIcon() //小图标 { CChildFrame *pChild = ((CChildFrame *)((m_pMyFrame->m_wndSplitter).GetPane(0, 0))); CMyListView *pListView = (CMyListView *)(pChild->m_wndSplitter.GetPane(0, 0)); pListView->ModifyStyle(LVS_TYPEMASK, LVS_SMALLICON); } void CDockDialog::OnListIcon() //列表 { CChildFrame *pChild = ((CChildFrame *)((m_pMyFrame->m_wndSplitter).GetPane(0, 0))); CMyListView *pListView = (CMyListView *)(pChild->m_wndSplitter.GetPane(0, 0)); pListView->ModifyStyle(LVS_TYPEMASK, LVS_LIST); } void CDockDialog::OnReportIcon() //详细资料 { CChildFrame *pChild = ((CChildFrame *)((m_pMyFrame->m_wndSplitter).GetPane(0, 0))); CMyListView *pListView = (CMyListView *)(pChild->m_wndSplitter.GetPane(0, 0)); pListView->ModifyStyle(LVS_TYPEMASK, LVS_REPORT); }