CAD ObjectArx 二次开发 创建工具栏实现点击button出现抽屉式菜单

实现在CAD中创建工具栏并添加菜单命令,如下图
在这里插入图片描述
参照文章:

cad—菜单,工具栏,屏幕菜单,增强工具栏

主要实现路径是通过创建一个可停靠窗口,并在其中创建toolbutton并给button点击事件添加命令,将子菜单menu显示在button位置,如果需要更加顺滑的交互,需要重写一下menu的样式。
像文中所说,可以通过一个xml文件来控制控件,这样可以省略修改交互的步骤,
我这里只是做出了单纯横向布置的实现和button边框背景取消,还需要增加自适应修改的内容,让侧边顶部都可以实现。
代码逻辑也没有什么可以说的,直接将代码放到下面:
Dialog:

//-----------------------------------------------------------------------------
class CDockControlBarChildDlg : public CAcUiDialog {DECLARE_DYNAMIC (CDockControlBarChildDlg)public:CDockControlBarChildDlg (CWnd *pParent =NULL, HINSTANCE hInstance =NULL) ;enum { IDD = IDD_DOCKCONTROLBAR};protected:virtual void DoDataExchange (CDataExchange *pDX) ;virtual BOOL OnCommand (WPARAM wParam, LPARAM lParam) ;BOOL OnInitDialog() override;protected:afx_msg LRESULT OnAcadKeepFocus (WPARAM wParam, LPARAM lParam) ;
public:	afx_msg void OnSize (UINT nType, int cx, int cy) ;protected:DECLARE_MESSAGE_MAP()public:CDockMenuPickButton m_btn_1;CDockMenuPickButton m_btn_3;CDockMenuPickButton m_btn_4;CDockMenuPickButton m_btn_5;CDockMenuPickButton m_btn_6;CDockMenuPickButton m_btn_7;afx_msg void OnBnClickedButton7();afx_msg void OnBnClickedButton6();afx_msg void OnBnClickedButton3();afx_msg void OnBnClickedButton4();afx_msg void OnBnClickedButton5();afx_msg void OnBnClickedButton1();private:CMenu m_menu_1;CMenu m_menu_3;CMenu m_menu_4;CMenu m_menu_5;CMenu m_menu_6;CMenu m_menu_7;
} ;IMPLEMENT_DYNAMIC (CDockControlBarChildDlg, CAcUiDialog)BEGIN_MESSAGE_MAP(CDockControlBarChildDlg, CAcUiDialog)//{{AFX_MSG_MAP(CDockControlBarChildDlg)ON_MESSAGE(WM_ACAD_KEEPFOCUS, OnAcadKeepFocus)    // Needed for modeless dialog.//}}AFX_MSG_MAPON_BN_CLICKED(IDC_BUTTON7, &CDockControlBarChildDlg::OnBnClickedButton7)ON_BN_CLICKED(IDC_BUTTON6, &CDockControlBarChildDlg::OnBnClickedButton6)ON_BN_CLICKED(IDC_BUTTON3, &CDockControlBarChildDlg::OnBnClickedButton3)ON_BN_CLICKED(IDC_BUTTON4, &CDockControlBarChildDlg::OnBnClickedButton4)ON_BN_CLICKED(IDC_BUTTON5, &CDockControlBarChildDlg::OnBnClickedButton5)ON_BN_CLICKED(IDC_BUTTON1, &CDockControlBarChildDlg::OnBnClickedButton1)
END_MESSAGE_MAP()//-----------------------------------------------------------------------------
CDockControlBarChildDlg::CDockControlBarChildDlg (CWnd *pParent /*=NULL*/, HINSTANCE hInstance /*=NULL*/) : CAcUiDialog (CDockControlBarChildDlg::IDD, pParent, hInstance) {//{{AFX_DATA_INIT(CDockControlBarChildDlg)//}}AFX_DATA_INIT
}//-----------------------------------------------------------------------------
void CDockControlBarChildDlg::DoDataExchange (CDataExchange *pDX) {CAcUiDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CDockControlBarChildDlg)//}}AFX_DATA_MAPDDX_Control(pDX, IDC_BUTTON1, m_btn_1);//意见反馈DDX_Control(pDX, IDC_BUTTON6, m_btn_6);//样图模板DDX_Control(pDX, IDC_BUTTON3, m_btn_3);//文本模板DDX_Control(pDX, IDC_BUTTON4, m_btn_4);//效率工具DDX_Control(pDX, IDC_BUTTON5, m_btn_5);//绘制指导DDX_Control(pDX, IDC_BUTTON7, m_btn_7);//制图模板
}//-----------------------------------------------------------------------------
//- Needed for modeless dialogs to keep focus.
//- Return FALSE to not keep the focus, return TRUE to keep the focus
LRESULT CDockControlBarChildDlg::OnAcadKeepFocus (WPARAM wParam, LPARAM lParam) {return (TRUE) ;
}//-----------------------------------------------------------------------------
//- As this dialog is a child dialog we need to disable ok and cancel
BOOL CDockControlBarChildDlg::OnCommand (WPARAM wParam, LPARAM lParam) {switch ( wParam ) {case IDOK:case IDCANCEL:return (FALSE) ;}	return (CAcUiDialog::OnCommand (wParam, lParam)) ;
}BOOL CDockControlBarChildDlg::OnInitDialog()
{CAcUiDialog::OnInitDialog();//制图标准m_menu_7.CreatePopupMenu();m_menu_7.AppendMenu(MF_STRING, ID_32768, _T("标准图框"));m_menu_7.AppendMenu(MF_STRING, ID_32769, _T("图层标准"));m_menu_7.AppendMenu(MF_STRING, ID_32770, _T("制图标准"));m_menu_7.AppendMenu(MF_STRING, ID_32771, _T("常用图块"));//效率工具m_menu_4.CreatePopupMenu();m_menu_4.AppendMenu(MF_STRING, ID_32778, _T("数据速查"));m_menu_4.AppendMenu(MF_STRING, ID_32779, _T("计算表格"));m_menu_4.AppendMenu(MF_STRING, ID_327710, _T("绘图研发工具"));文本模板m_menu_3.CreatePopupMenu();m_menu_3.AppendMenu(MF_STRING, ID_32774, _T("设计信息征询表"));m_menu_3.AppendMenu(MF_STRING, ID_32775, _T("评审文本"));m_menu_3.AppendMenu(MF_STRING, ID_32776, _T("汇报文本"));m_menu_3.AppendMenu(MF_STRING, ID_32777, _T("施工图设计文件"));样图模板m_menu_6.CreatePopupMenu();m_menu_6.AppendMenu(MF_STRING, ID_32772, _T("样图模板"));m_menu_6.AppendMenu(MF_STRING, ID_327723, _T("深度样图"));绘制指导m_menu_5.CreatePopupMenu();m_menu_5.AppendMenu(MF_STRING, ID_327711, _T("制图标准指导书"));m_menu_5.AppendMenu(MF_STRING, ID_327712, _T("平面类绘制指导书"));m_menu_5.AppendMenu(MF_STRING, ID_327713, _T("立剖面绘制指导书"));m_menu_5.AppendMenu(MF_STRING, ID_327714, _T("放大图绘制指导书"));m_menu_5.AppendMenu(MF_STRING, ID_327715, _T("专项绘制绘制指导书"));意见反馈m_menu_1.CreatePopupMenu();m_menu_1.AppendMenu(MF_STRING, ID_327716, _T("意见反馈"));/*m_menu_1 = (CMenu*)GetDlgItem(IDR_MENU1);m_btn_1.SetMenu(m_menu_1);*/return TRUE;
}//-----------------------------------------------------------------------------
void CDockControlBarChildDlg::OnSize (UINT nType, int cx, int cy) {CAcUiDialog::OnSize (nType, cx, cy) ;//- Now update the dialogMoveWindow (0, 0, cx, cy) ;
}void CDockControlBarChildDlg::OnBnClickedButton7()
{CRect rect;m_btn_7.GetWindowRect(&rect);CString str;str.Format(_T("rect width : %d , rect length : %d"), rect.Width(), rect.Height());m_menu_7.TrackPopupMenu(TPM_LEFTALIGN | TPM_TOPALIGN, rect.left, rect.bottom, this);//m_menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_TOPALIGN, rect.left, rect.bottom, this);
}void CDockControlBarChildDlg::OnBnClickedButton6()
{// TODO: 在此添加控件通知处理程序代码CRect rect;m_btn_6.GetWindowRect(&rect);CString str;str.Format(_T("rect width : %d , rect length : %d"), rect.Width(), rect.Height());m_menu_6.TrackPopupMenu(TPM_LEFTALIGN | TPM_TOPALIGN, rect.left, rect.bottom, this);}void CDockControlBarChildDlg::OnBnClickedButton3()
{// TODO: 在此添加控件通知处理程序代码CRect rect;m_btn_3.GetWindowRect(&rect);CString str;str.Format(_T("rect width : %d , rect length : %d"), rect.Width(), rect.Height());m_menu_3.TrackPopupMenu(TPM_LEFTALIGN | TPM_TOPALIGN, rect.left, rect.bottom, this);
}void CDockControlBarChildDlg::OnBnClickedButton4()
{// TODO: 在此添加控件通知处理程序代码CRect rect;m_btn_4.GetWindowRect(&rect);CString str;str.Format(_T("rect width : %d , rect length : %d"), rect.Width(), rect.Height());m_menu_4.TrackPopupMenu(TPM_LEFTALIGN | TPM_TOPALIGN, rect.left, rect.bottom, this);
}void CDockControlBarChildDlg::OnBnClickedButton5()
{// TODO: 在此添加控件通知处理程序代码CRect rect;m_btn_5.GetWindowRect(&rect);CString str;str.Format(_T("rect width : %d , rect length : %d"), rect.Width(), rect.Height());m_menu_5.TrackPopupMenu(TPM_LEFTALIGN | TPM_TOPALIGN, rect.left, rect.bottom, this);
}void CDockControlBarChildDlg::OnBnClickedButton1()
{//MessageBox(_T("Test Menu"));// TODO: 在此添加控件通知处理程序代码CRect rect;m_btn_1.GetWindowRect(&rect);/*CString str;str.Format(_T("rect width : %d , rect length : %d"), rect.left, rect.bottom);MessageBox(str);*/BOOL addMenu =  m_menu_1.TrackPopupMenu(TPM_LEFTALIGN | TPM_TOPALIGN, rect.left, rect.bottom, this);if(!addMenu){MessageBox(_T("Test Menu Failed"));}
}

Button:

//-----------------------------------------------------------------------------
class CDockMenuPickButton : public CAcUiToolButton {DECLARE_DYNAMIC (CDockMenuPickButton)public:CDockMenuPickButton () ;virtual ~CDockMenuPickButton () ;void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) override;afx_msg void OnMouseMove(UINT nFlags, CPoint point);afx_msg void OnMouseHover(UINT nFlags, CPoint point);afx_msg void OnMouseLeave();protected:DECLARE_MESSAGE_MAP()private:BOOL m_bTrackLeave;
} ;#include "StdAfx.h"
#include "resource.h"
#include "DockMenuPickButton.h"//-----------------------------------------------------------------------------
IMPLEMENT_DYNAMIC (CDockMenuPickButton, CAcUiToolButton)BEGIN_MESSAGE_MAP(CDockMenuPickButton, CAcUiToolButton)END_MESSAGE_MAP()CDC* hdc;
CRect hRect;//-----------------------------------------------------------------------------
CDockMenuPickButton::CDockMenuPickButton () {
}//-----------------------------------------------------------------------------
CDockMenuPickButton::~CDockMenuPickButton () {
}void CDockMenuPickButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{CDC dc;dc.Attach(lpDrawItemStruct->hDC);dc.SelectStockObject(NULL_BRUSH);dc.Rectangle(&lpDrawItemStruct->rcItem);hdc = &dc;COLORREF local_bk = dc.GetBkColor();CString str;GetWindowText(str);CRect rect = lpDrawItemStruct->rcItem;hRect = rect;GetClientRect(&rect);//设置背景透明色dc.SetBkMode(TRANSPARENT);dc.SetPolyFillMode(TRANSPARENT);::GetStockObject(NULL_BRUSH);//设置画笔为空,无边框if(lpDrawItemStruct->itemState & ODS_SELECTED ){//设置颜色为背景色,实现边框取消的效果//dc.FillSolidRect(&rect,::GetBkColor(dc));dc.FillSolidRect(&rect, RGB(190, 200, 255));//如果悬停或者选中,需要显示仅显示边框dc.Draw3dRect(&rect, GetSysColor(COLOR_3DDKSHADOW), GetSysColor(COLOR_3DDKSHADOW));//设置文字dc.DrawText(str, rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);dc.SetTextColor(RGB(255, 0, 0));}else if(lpDrawItemStruct->itemData & ODS_HOTLIGHT){//设置颜色为背景色,实现边框取消的效果dc.FillSolidRect(&rect, RGB(170,180,255));//设置文字dc.DrawText(str, rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);dc.SetTextColor(RGB(255, 0, 0));}else{//设置颜色为背景色,实现边框取消的效果dc.FillSolidRect(&rect, ::GetBkColor(dc));//设置文字dc.DrawText(str, rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);dc.SetTextColor(RGB(255, 0, 0));}//CBrush* pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//CBrush* pOldBrush = dc.SelectObject(pBrush);//dc.SelectObject(pBrush);//dc.SelectObject(pOldBrush);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/130841.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简易yum仓库搭建

目录 一、实验准备 二、获取yum仓库、安装httpd 三、客户机配置yum源 四、测试、验证 一、实验准备 准备两台主机: 192.168.115.148 :安装http 、作为yum仓库、挂载默认光盘 192.168.115.148 :作为客户机使用yum仓库、不挂载光盘 二、…

Spring MVC:请求转发与请求重定向

Spring MVC 请求转发请求重定向附 请求转发 转发( forward ),指服务器接收请求后,从一个资源跳转到另一个资源中。请求转发是一次请求,不会改变浏览器的请求地址。 简单示例: 1.通过 String 类型的返回值…

【爬虫】8.1. 深度使用tesseract-OCR技术识别图形验证码

深度使用tesseract-OCR技术识别图形验证码 文章目录 深度使用tesseract-OCR技术识别图形验证码1. OCR技术2. 准备工作3. 简单作用了解3.1. 验证码图片爬取-screenshot_as_png3.2. 识别测试-image_to_string3.2.1. 正确识别3.2.2. 错误识别3.2.3. 灰度调节 3.3. 识别实战-使用im…

Trinitycore学习之在vscode查看远端服务器上源码配置

1:安装vscode,去官网下载,这里下载windows版本安装包 .zip https://code.visualstudio.com/Download 2:安装后,安装扩展chinese,使用中文设置,需要重启vscode。 3:安装ssh相关插件…

Jmeter系列进阶-获取图片验证码(4)

安装工具 通过ocrserver工具识别图片验证码,解压后 .exe双击启动即可。 jmeter中使用 (1)HTTP请求获取验证码 (2)在获取验证码图片的接口下面添加监听器》保存响应到文件;如下图: &#x…

stu01-IDEA怎么创建一个HTML项目

1.打开idea,依次点击file→new→project 2.点击Java,选择你的jdk,没有下载的点击“Download JDK”/已经下载有JDK但在这里没显示的→点击“Add JDK”,选择你安装的JDK的路径,然后next 3.next 4.起好名字,我…

Python基于Flask的高校舆情分析,舆情监控可视化系统

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 运行效果图 基于Python的微博大数据舆情分析,舆论情感分析可视化系统 系统介绍 微博舆情分析系…

线性回归方程

性回归是利用数理统计中的回归分析来确定两种或两种以上变数间相互依赖的定量关系的一种统计分析方法,是变量间的相关关系中最重要的一部分,主要考查概率与统计知识,考察学生的阅读能力、数据处理能力及运算能力,题目难度中等&…

基于 Flink CDC 高效构建入湖通道

本文整理自阿里云 Flink 数据通道负责人、Flink CDC 开源社区负责人, Apache Flink PMC Member & Committer 徐榜江(雪尽),在 Streaming Lakehouse Meetup 的分享。内容主要分为四个部分: Flink CDC 核心技术解析数…

基于springboot+vue的大学社团管理系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

sqli第一关

1.在下使用火狐访问sqlilabs靶场并使用burpsuite代理火狐。左为sqlilabs第一关,右为burpsuite。 2.输入?id1 and 11 与?id1 and 12试试 可以看出没有变化哈,明显我们输入的语句被过滤了。在?id1后面尝试各种字符,发现单引号 包…

企业架构LNMP学习笔记18

nginx的日志: 日志类型: access.log 访问日志、查看统计用户的访问信息,流量。 error.log 错误日志,错误信息,重写信息。 access.log日志文件内容示例: 192.168.17.1 - - [06/Sep/2023:20:37:39 0800] …

数据库系统概念学习1

第一章 引言 数据库管理系统是由一个互相关联的数据的集合和一组用以访问这些数据的程序组成。这个数据集合通常称为数据库 特定时刻存储在数据库中的信息的集合称为数据库的一个实例,而数据库的总体设计称为数据库模式 数据库结构的基础是数据模型,…

【C++基础】左值引用、右值引用、move、forward

本文参考:右值引用 | 爱编程的大丙 转移和完美转发 | 爱编程的大丙 左值、右值、左值引用、右值引用 左值 是指存储在内存中、有明确存储地址(可取地址)的数据; 右值 是指可以提供数据值的数据(不可取地址&#x…

UNext:基于 MLP 的快速医学图像分割网络

UNext 会议分析摘要贡献方法整体框架1.Shifted MLP2.Tokenized MLP Stage 实验1.对比实验2.消融实验2.1 模块的消融实验2.2 通道数的探索 可借鉴参考 会议分析 期刊(会议)名: MICCAI 2022 会议信息: 属于顶会了 有代码&#xff1…

3D视觉测量:3D空间圆拟合优化

文章目录 0. 测试效果1. 测量思路2. 部分调用代码文章目录:形位公差测量关键内容:通过视觉方法实现GD&T中的圆孔位置定位0. 测试效果 1. 测量思路 空间圆拟合是指在三维空间中找到最佳拟合圆的过程。这通常用于从一组三维点数据中找到一个圆,以最小化数据点到圆的距离之…

百度地图3D棱柱鼠标事件

百度地图2D API JavaScript API | 百度地图API SDK 百度地图3D API jspopularGL | 百度地图API SDK 3D棱柱效果如下 一. 渲染地图 var map new BMapGL.Map(container, {style: {styleJson: styleJson2} }) map.centerAndZoom(new BMapGL.Point(116.404, 39.925), 9); map…

通过rabbitmq生成延时消息,并生成rabbitmq镜像

通过rabbitmq生成延时消息队列,并生成rabbitmq镜像 整体描述1. 使用场景2. 目前问题3. 前期准备 具体步骤1. 拉取镜像2. 运行镜像3. 安装插件4. 代码支持4.1 config文件4.2 消费监听4.2 消息生产 5. 功能测试 镜像操作1. 镜像制作2. 镜像导入 总结 整体描述 1. 使用…

2023年中国光伏行业研究报告

第一章 行业概况 1.1 定义 光伏行业,也称为太阳能光伏行业,是一个专注于利用光伏技术将太阳能转化为电能的领域。该行业涵盖了太阳能电池的制造、光伏系统的设计、安装和维护,以及电能的销售和供应。光伏技术的核心是光伏效应,通…

java设计模式之观察者模式

. 基本概念 观察者(Observer)模式中包含两种对象,分别是目标对象和观察者对象。在目标对象和观察者对象间存在着一种一对多的对应关系,当这个目标对象的状态发生变化时,所有依赖于它的观察者对象都会得到通知并执行它…