当前位置: 首页 > news >正文

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

相关文章:

  • 避孕套、安全套分类|常识|图文指南(杜蕾斯、冈本、杰士邦)
  • postgres源码解析 SysLogger辅助进程
  • MySql ocp认证之数据导入导出(五)
  • 论文阅读(10) 基于吸力的推进是动物高效游泳的基础(2015)
  • 《大数据之路:阿里巴巴大数据实践》-第2篇 数据模型篇 -第10章 维度设计
  • 【java】基础内容(4)
  • Perfetto分析进阶
  • Framework入门のPiex 6P源码(下载/编译/刷机)
  • 高端手机市场的诸神之战,vivo举起一把“雷神之锤”
  • 简单的ajax任务:get和post方式提交前端用户输入信息给服务器
  • Qt5开发从入门到精通——第四篇(调色板)
  • MySQL数据库如何线上修改表结构
  • Python利用pandas获取每行最大值和最小值
  • C++设计模式之装饰者模式(结构型模式)
  • 数据结构中,索引存储和散列存储区别较为详细的介绍
  • 【Linux系统编程】快速查找errno错误码信息
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 【个人向】《HTTP图解》阅后小结
  • CSS 提示工具(Tooltip)
  • Joomla 2.x, 3.x useful code cheatsheet
  • Mac转Windows的拯救指南
  • python学习笔记 - ThreadLocal
  • 记一次删除Git记录中的大文件的过程
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 使用docker-compose进行多节点部署
  • 一些关于Rust在2019年的思考
  • 06-01 点餐小程序前台界面搭建
  • Linux权限管理(week1_day5)--技术流ken
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #include<初见C语言之指针(5)>
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (九)One-Wire总线-DS18B20
  • (九)信息融合方式简介
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (三)uboot源码分析
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (转)Google的Objective-C编码规范
  • (转)Linux下编译安装log4cxx
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .NET CF命令行调试器MDbg入门(一)
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .NET性能优化(文摘)
  • .ui文件相关
  • [Android Pro] Notification的使用
  • [AutoSAR系列] 1.3 AutoSar 架构
  • [BZOJ] 3262: 陌上花开
  • [GN] 后端接口已经写好 初次布局前端需要的操作(例)
  • [go] 策略模式
  • [HCIE] IPSec-VPN (手工模式)
  • [IE编程] IE 是如何决定Accept-Language 属性的