arx 读入块表
BOOL CArxDialog::OnInitDialog(void)
{
// 创建一个CImageList类的指针变量
//CImageList* pImageList;
//pImageList = new CImageList();
m_ImageList.Create(32, 32, ILC_COLOR32, 0, 4); // 必不可少
CButton * pBut = (CButton* )GetDlgItem(IDC_BUTTON4);
pBut->SetWindowText(_T("GetPoint"));
CListCtrl *pListCtrl1 = (CListCtrl *) GetDlgItem(IDC_LIST1);
pListCtrl1->ModifyStyle(0, WS_VISIBLE | WS_CHILD | LVS_REPORT );
DWORD dwExtStyles1 =pListCtrl1->GetExtendedStyle();
pListCtrl1->SetExtendedStyle(dwExtStyles1 | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
pListCtrl1->InsertColumn(0,_T("名称"),LVCFMT_LEFT,100,0); //设置列
DisplayBlocks() ;
CListCtrl *pListCtrl2 = (CListCtrl *) GetDlgItem(IDC_LIST2);
//pListCtrl2->ModifyStyle(0, WS_VISIBLE | WS_CHILD | LVS_REPORT );
pListCtrl2->SetIconSpacing(CSize(80,80));
pListCtrl2->SetImageList(&m_ImageList, LVSIL_NORMAL);
return 0;
}
/
void CArxDialog::DisplayBlocks(void)
{
CListCtrl *m_ctrlBlockListBox = (CListCtrl *) GetDlgItem(IDC_LIST1);
AcDbBlockTable *pBlockTable;
acdbHostApplicationServices()->workingDatabase()
->getSymbolTable(pBlockTable, AcDb::kForRead);
// Iterate through the block table and display
// the names in the list box.
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);
if (pRecord->hasPreviewIcon()) // 如果块定义包含预览图标
{
int nIndex = m_ctrlBlockListBox->GetItemCount();
m_ctrlBlockListBox->InsertItem(nIndex, (CString )pName );//插入行
// 显示预览图标
CPaintDC dc(this);
AcDbObjectId blkTblRcdId;
Acad::ErrorStatus es = pBlockTable->getAt( (CString )pName, blkTblRcdId);
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);
CBitmap bmp;
bmp.Attach(hBitmap2);
m_ImageList.Add(&bmp, RGB(0, 0, 0));
bmp.DeleteObject();
//
CListCtrl *m_ListCtrl2 = (CListCtrl *) GetDlgItem(IDC_LIST2);
int listindex;
LV_ITEM lvItem;
listindex = m_ListCtrl2->GetItemCount();
TCHAR *ptszText = new TCHAR[100];
_tcscpy(ptszText, (CString )pName);
lvItem.mask = LVIF_IMAGE | LVIF_TEXT;
lvItem.iItem = listindex ;
lvItem.iSubItem = 0;
lvItem.iImage = listindex ;
lvItem.pszText = ptszText;
m_ListCtrl2->InsertItem(&lvItem);
}
pRecord->close();
}
pBTItr->step();
}
}
pBlockTable->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;
}
void CArxDialog::OnNMClickList1(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) ;
}