BOOL CArxDialog::OnInitDialog(void)
{
CButton * pBut = (CButton* )GetDlgItem(IDC_BUTTON4);
pBut->SetWindowText(_T("GetPoint"));
//二 在对话框中预览DWG文件
// 使用acdbDisplayPreviewFromDwg函数,具体的方法为:
// char fileName[100];
//strcpy(fileName, "C://test.dwg");
//bool es;
//HWND pWnd;
//CFrameWnd *pFrame = (CFrameWnd*)GetDlgItem(IDC_PICTURE);
//es = acdbDisplayPreviewFromDwg(fileName, pFrame->m_hWnd);
//上面的代码将在一个Picture控件中显示指定的图形。
// 另外,需要包含“dbmain.h”头文件。
//CStatic * pPic = (CStatic* )GetDlgItem(IDC_STATIC);
//pBut->SetWindowText(_T("GetPoint"));
//ACHAR *fileName = _T("c://drawing1.dwg");
//char fileName[100];
//strcpy(fileName, "C://test.dwg");
//bool es;
//HWND pWnd;
//CFrameWnd *pFrame = (CFrameWnd*)GetDlgItem(IDC_STATIC);
//es = acdbDisplayPreviewFromDwg(fileName, pFrame->m_hWnd);
CListCtrl *pListCtrl = (CListCtrl *) GetDlgItem(IDC_LIST1);
//设置背景颜色
//pListCtrl->SetBkColor(RGB(10,200,255));
pListCtrl->ModifyStyle(0, WS_VISIBLE | WS_CHILD | LVS_REPORT );
DWORD dwExtStyles =pListCtrl->GetExtendedStyle();
pListCtrl->SetExtendedStyle(dwExtStyles | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
//设置第一行为选中状态
// int nIndex = 0;
//pListCtrl->SetItemState(0,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);
pListCtrl->InsertColumn(0,_T("名称"),LVCFMT_LEFT,100,0); //设置列
//pListCtrl->InsertColumn(1,_T("数据"),LVCFMT_LEFT,100,1);
//pListCtrl->InsertItem(0, _T("类型"));//插入行
//pListCtrl->SetItemText(0,1,_T("中梃"));//设置该行的不同列的显示字符
//pListCtrl.InsertItem(1, "型号");//插入行
//pListCtrl.SetItemText(1,1,"5002");//设置该行的不同列的显示字符
//pListCtrl.InsertItem(2, "长度");//插入行
//pListCtrl.SetItemText(2,1,"5000");//设置该行的不同列的显示字符
//DisplayBlocks() ;
return 0;
}
//-----------------------------------------------------------------------------
//----- Needed for modeless dialogs to keep focus.
//----- Return FALSE to not keep the focus, return TRUE to keep the focus
LRESULT CArxDialog::OnAcadKeepFocus (WPARAM, LPARAM) {
return (TRUE) ;
}
//void CArxDialog::OnEnKillfocusEdit1()
//{
// // TODO: 在此添加控件通知处理程序代码
//
// AfxMessageBox(_T("1") ,0,0) ;
//
//
//}
void CArxDialog::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
AfxMessageBox(_T("2") ,0,0) ;
}
void CArxDialog::OnBnClickedButton4()
{
// TODO: 在此添加控件通知处理程序代码
BeginEditorCommand();
ads_point pt ;
if(acedGetPoint (NULL , _T("\nInput a Point : ") ,pt ) == RTNORM)
{
CompleteEditorCommand() ;
m_strXpt .Format(_T("%0.2f") , pt[X]);
m_strYpt .Format(_T("%0.2f") , pt[Y]);
m_strZpt .Format(_T("%0.2f") , pt[Z]);
CEdit * pEdit1 = (CEdit* )GetDlgItem(IDC_EDIT1);
pEdit1->SetWindowText(
_T( "x:" + m_strXpt + " y:"+ m_strYpt + " z: " + m_strZpt
));
}
else
{
CancelEditorCommand();
}
}
//void CArxDialog::OnBnClickedOk()
//{
// // TODO: 在此添加控件通知处理程序代码
//
// //acedArxUnload(_T("ArxProject2.arx"));
//
//
// //
// //exit(0);
//}
//void CArxDialog::OnBnClickedCancel()
//{
// // TODO: 在此添加控件通知处理程序代码
//
//
// //CArxDialog::OnClose();
//
//}
void CArxDialog::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
DisplayBlocks();
}
void CArxDialog::DisplayBlocks(void)
{
CListCtrl *m_ctrlBlockListBox = (CListCtrl *) GetDlgItem(IDC_LIST1);
//m_ctrlBlockListBox->InsertItem(1, _T("000") );//插入行
//m_ctrlBlockListBox->SetItemText(1,1,_T("001"));//设置该行的不同列的显示字符
//AfxMessageBox(_T("0001"));
AcDbBlockTable *pBlockTable;
acdbHostApplicationServices()->workingDatabase()
->getSymbolTable(pBlockTable, AcDb::kForRead);
// Iterate through the block table and display
// the names in the list box.
//
//const char *pName;
ACHAR *pName ;
AcDbBlockTableIterator *pBTItr;
if (pBlockTable->newIterator(pBTItr) == Acad::eOk) {
while (!pBTItr->done()) {
AcDbBlockTableRecord *pRecord;
if (pBTItr->getRecord(pRecord, AcDb::kForRead)
== Acad::eOk) {
pRecord->getName(pName);
int nIndex = m_ctrlBlockListBox->GetItemCount();
m_ctrlBlockListBox->InsertItem(nIndex, (CString )pName );//插入行
//m_ctrlBlockListBox->SetItemText(nIndex,1,_T(""));//设置该行的不同列的显示字符
pRecord->close();
}
pBTItr->step();
}
}
pBlockTable->close();
}
void CArxDialog::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;
//双击
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
int nSelected = pNMListView->iItem; //选择所在行的索引值
int nSubItem = pNMListView->iSubItem; //选择所在列的索引值
CListCtrl *m_ctrlBlockListBox = (CListCtrl *) GetDlgItem(IDC_LIST1);
CString cr = m_ctrlBlockListBox->GetItemText(nSelected, nSubItem) ;
//cr.Format(_T("%d-- %d-- %s"),nSelected,nSubItem, m_ctrlBlockListBox->GetItemText(nSelected, nSubItem));
//AfxMessageBox(cr,0,0) ;
// 显示预览图标
CPaintDC dc(this);
AcDbBlockTable *pBlkTbl = NULL;
acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl, AcDb::kForRead);
AcDbObjectId blkTblRcdId;
Acad::ErrorStatus es = pBlkTbl->getAt(cr, blkTblRcdId);
//AfxMessageBox(cr) ;
HBITMAP hBitmap = BlockIconToBMP(blkTblRcdId, dc.GetSafeHdc());
CStatic *m_bitmap =( CStatic *) GetDlgItem(IDC_STATIC);
m_bitmap->ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE);
HBITMAP hBitmap2 = ReplaceColor(hBitmap, RGB(0,0,0),RGB(255,255,255) );
m_bitmap->SetBitmap((HBITMAP)hBitmap2);
//pBlkTblRcd->close();
pBlkTbl->close();
UpdateData(FALSE);
}
HBITMAP CArxDialog::BlockIconToBMP(const AcDbObjectId &blkId, HDC hdc)
{
Acad::ErrorStatus es;
AcDbBlockTableRecord *pBlkTblRcd = NULL; // 块表记录的指针
AcArray<Adesk::UInt8> icon; // 保存预览图标的数组
// 获得保存块表记录的预览图标的数组
try
{
es = acdbOpenObject(pBlkTblRcd, blkId, AcDb::kForRead);
if (es != Acad::eOk)
throw 1;
if (!pBlkTblRcd->hasPreviewIcon()) // 如果块定义不包含预览图标
{
pBlkTblRcd->close();
return NULL;
}
es = pBlkTblRcd->getPreviewIcon(icon);
if (es != Acad::eOk)
throw 2;
es = pBlkTblRcd->close();
if (es != Acad::eOk)
throw 3;
}
catch (...)
{
pBlkTblRcd->close();
return NULL;
}
// 由icon数组获得可显示的位图
BITMAPINFOHEADER ih; // 位图信息头
memcpy(&ih, icon.asArrayPtr(), sizeof(ih));
size_t memsize = sizeof(BITMAPINFOHEADER) + ((1<<ih.biBitCount)* sizeof(RGBQUAD));
LPBITMAPINFO bi = (LPBITMAPINFO)malloc(memsize); // 位图信息
memcpy(bi, icon.asArrayPtr(), memsize);
HBITMAP hbm = CreateDIBitmap(hdc, &ih, CBM_INIT,icon.asArrayPtr() + memsize, bi,DIB_RGB_COLORS);
free(bi);
return hbm;
}
HBITMAP CArxDialog::ReplaceColor(HBITMAP hBmp,COLORREF cOldColor,COLORREF cNewColor)
{
HBITMAP RetBmp=NULL;
if (hBmp)
{
HDC BufferDC=CreateCompatibleDC(NULL); // 源位图DC
if (BufferDC)
{
SelectObject(BufferDC,hBmp);//选入DC中
HDC DirectDC=CreateCompatibleDC(NULL); // 目标DC
if (DirectDC)
{
// 获取源位图大小
BITMAP bm;
GetObject(hBmp, sizeof(bm), &bm);
// 初始化BITMAPINFO信息,以便使用CreateDIBSection
BITMAPINFO RGB32BitsBITMAPINFO;
ZeroMemory(&RGB32BitsBITMAPINFO,sizeof(BITMAPINFO));
RGB32BitsBITMAPINFO.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
RGB32BitsBITMAPINFO.bmiHeader.biWidth=bm.bmWidth;
RGB32BitsBITMAPINFO.bmiHeader.biHeight=bm.bmHeight;
RGB32BitsBITMAPINFO.bmiHeader.biPlanes=1;
RGB32BitsBITMAPINFO.bmiHeader.biBitCount=32;
UINT * ptPixels;
HBITMAP DirectBitmap= CreateDIBSection(DirectDC,
(BITMAPINFO *)&RGB32BitsBITMAPINFO,
DIB_RGB_COLORS,(void **)&ptPixels, NULL, 0);
if (DirectBitmap)
{
HGDIOBJ PreviousObject=SelectObject(DirectDC, DirectBitmap);
BitBlt(DirectDC,0,0,bm.bmWidth,bm.bmHeight,BufferDC,0,0,SRCCOPY);
// 转换 COLORREF 为 RGB
cOldColor = COLORREF(cOldColor);
cNewColor = COLORREF(cNewColor);
//如果背景色是黑色
if(ptPixels[0] ==cOldColor)
{
// 替换颜色
for (int i=((bm.bmWidth*bm.bmHeight)-1);i>=0;i--)
{
if (ptPixels[i]== cOldColor || ptPixels[i]== cNewColor )
//颜色取反
ptPixels[i] = 0xFFFFFF -ptPixels[i] ;
}
}
// 修改位图 DirectBitmap
SelectObject(DirectDC,PreviousObject);
// 完成
RetBmp=DirectBitmap;
}
// 释放DC
DeleteDC(DirectDC);
}
// 释放DC
DeleteDC(BufferDC);
}
}
return RetBmp;
}
// //CListCtrl双击
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
int nSelected = pNMListView->iItem; //选择所在行的索引值
int nSubItem = pNMListView->iSubItem; //选择所在列的索引值
CListCtrl *m_ctrlBlockListBox = (CListCtrl *) GetDlgItem(IDC_LIST1);
CString cr ;
cr.Format(_T("%d-- %d-- %s"),nSelected,nSubItem, m_ctrlBlockListBox->GetItemText(nSelected, nSubItem));
AfxMessageBox(cr,0,0) ;
AcDbObjectId CArxProject1App::CreateLine(void)
{
AcGePoint3d ptStart(0, 0, 0);
AcGePoint3d ptEnd(100, 100, 0);
AcDbLine *pLine = new AcDbLine(ptStart, ptEnd);
AcDbBlockTable *pBlockTable;
acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead);
AcDbBlockTableRecord *pBlockTableRecord;
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
AcDbObjectId lineId;
pBlockTableRecord->appendAcDbEntity(lineId, pLine);
pBlockTable->close();
pBlockTableRecord->close();
pLine->close();
return lineId;
}
Acad::ErrorStatus CArxProject1App::ChangeColor(AcDbObjectId entId, Adesk::UInt16 colorIndex)
{
AcDbEntity *pEntity;
// 打开图形数据库中的对象
acdbOpenObject(pEntity, entId, AcDb::kForWrite);
// 修改实体的颜色
pEntity->setColorIndex(colorIndex);
// 用完之后,及时关闭
pEntity->close();
return Acad::eOk;
//return Acad::ErrorStatus();
}