• arx 读入块表


    //块操作头文件

        //unsigned short a = 8;
        DWORD a = 8;
        int i= sizeof(a);
        int b = 1<< a;

        CString str ;
        str.Format(_T("sizeof %d---MoveLeft %d") ,i ,b    );
        AfxMessageBox(str);

    #include "ArxDbgUtils.h"

    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 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< 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) ;
    }
     

  • 相关阅读:
    VsCode中一些可以让工作“事半功倍”的插件
    JavaScript 数组字符串方法
    MySQL之数据库理论
    前端Rust二进制/wasm全平台构建流程简述
    测试员如何面对30岁后的下坡路,伤不起的年龄,职业道路何去何从?
    全局封装loading 加载样式 vue3
    [HTML]常用标签的使用
    海量点云数据快速读取方法
    【AAC文件数据解析和ADTS frame】
    pytorch 函数整理
  • 原文地址:https://blog.csdn.net/jxb_8888/article/details/126675955