天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 111|回复: 0

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

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

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





Dialog:
  1. //-----------------------------------------------------------------------------
  2. class CDockControlBarChildDlg : public CAcUiDialog {
  3.         DECLARE采用DYNAMIC (CDockControlBarChildDlg)
  4. public:
  5.         CDockControlBarChildDlg (CWnd *pParent =NULL, HINSTANCE hInstance =NULL) ;
  6.         enum { IDD = IDD采用DOCKCONTROLBAR};
  7. protected:
  8.         virtual void DoDataExchange (CDataExchange *pDX) ;
  9.         virtual BOOL OnCommand (WPARAM wParam, LPARAM lParam) ;
  10.         BOOL OnInitDialog() override;
  11. protected:
  12.         afx采用msg LRESULT OnAcadKeepFocus (WPARAM wParam, LPARAM lParam) ;
  13. public:       
  14.         afx采用msg void OnSize (UINT nType, int cx, int cy) ;
  15. protected:
  16.         DECLARE采用MESSAGE采用MAP()
  17. public:
  18.         CDockMenuPickButton m采用btn采用1;
  19.         CDockMenuPickButton m采用btn采用3;
  20.         CDockMenuPickButton m采用btn采用4;
  21.         CDockMenuPickButton m采用btn采用5;
  22.         CDockMenuPickButton m采用btn采用6;
  23.         CDockMenuPickButton m采用btn采用7;
  24.         afx采用msg void OnBnClickedButton7();
  25.         afx采用msg void OnBnClickedButton6();
  26.         afx采用msg void OnBnClickedButton3();
  27.         afx采用msg void OnBnClickedButton4();
  28.         afx采用msg void OnBnClickedButton5();
  29.         afx采用msg void OnBnClickedButton1();
  30. private:
  31.         CMenu m采用menu采用1;
  32.         CMenu m采用menu采用3;
  33.         CMenu m采用menu采用4;
  34.         CMenu m采用menu采用5;
  35.         CMenu m采用menu采用6;
  36.         CMenu m采用menu采用7;
  37. } ;
  38. IMPLEMENT采用DYNAMIC (CDockControlBarChildDlg, CAcUiDialog)
  39. BEGIN采用MESSAGE采用MAP(CDockControlBarChildDlg, CAcUiDialog)
  40.         //{{AFX采用MSG采用MAP(CDockControlBarChildDlg)
  41.         ON采用MESSAGE(WM采用ACAD采用KEEPFOCUS, OnAcadKeepFocus)    // Needed for modeless dialog.
  42.         //}}AFX采用MSG采用MAP
  43.         ON采用BN采用CLICKED(IDC采用BUTTON7, &CDockControlBarChildDlg::OnBnClickedButton7)
  44.         ON采用BN采用CLICKED(IDC采用BUTTON6, &CDockControlBarChildDlg::OnBnClickedButton6)
  45.         ON采用BN采用CLICKED(IDC采用BUTTON3, &CDockControlBarChildDlg::OnBnClickedButton3)
  46.         ON采用BN采用CLICKED(IDC采用BUTTON4, &CDockControlBarChildDlg::OnBnClickedButton4)
  47.         ON采用BN采用CLICKED(IDC采用BUTTON5, &CDockControlBarChildDlg::OnBnClickedButton5)
  48.         ON采用BN采用CLICKED(IDC采用BUTTON1, &CDockControlBarChildDlg::OnBnClickedButton1)
  49. END采用MESSAGE采用MAP()
  50. //-----------------------------------------------------------------------------
  51. CDockControlBarChildDlg::CDockControlBarChildDlg (CWnd *pParent /*=NULL*/, HINSTANCE hInstance /*=NULL*/) : CAcUiDialog (CDockControlBarChildDlg::IDD, pParent, hInstance) {
  52.         //{{AFX采用DATA采用INIT(CDockControlBarChildDlg)
  53.         //}}AFX采用DATA采用INIT
  54. }
  55. //-----------------------------------------------------------------------------
  56. void CDockControlBarChildDlg::DoDataExchange (CDataExchange *pDX) {
  57.         CAcUiDialog::DoDataExchange(pDX);
  58.         //{{AFX采用DATA采用MAP(CDockControlBarChildDlg)
  59.         //}}AFX采用DATA采用MAP
  60.         DDX采用Control(pDX, IDC采用BUTTON1, m采用btn采用1);//意见反馈
  61.         DDX采用Control(pDX, IDC采用BUTTON6, m采用btn采用6);//样图模板
  62.         DDX采用Control(pDX, IDC采用BUTTON3, m采用btn采用3);//文本模板
  63.         DDX采用Control(pDX, IDC采用BUTTON4, m采用btn采用4);//效率工具
  64.         DDX采用Control(pDX, IDC采用BUTTON5, m采用btn采用5);//绘制指导
  65.         DDX采用Control(pDX, IDC采用BUTTON7, m采用btn采用7);//制图模板
  66. }
  67. //-----------------------------------------------------------------------------
  68. //- Needed for modeless dialogs to keep focus.
  69. //- Return FALSE to not keep the focus, return TRUE to keep the focus
  70. LRESULT CDockControlBarChildDlg::OnAcadKeepFocus (WPARAM wParam, LPARAM lParam) {
  71.         return (TRUE) ;
  72. }
  73. //-----------------------------------------------------------------------------
  74. //- As this dialog is a child dialog we need to disable ok and cancel
  75. BOOL CDockControlBarChildDlg::OnCommand (WPARAM wParam, LPARAM lParam) {
  76.         switch ( wParam ) {
  77.                 case IDOK:
  78.                 case IDCANCEL:
  79.                         return (FALSE) ;
  80.         }       
  81.         return (CAcUiDialog::OnCommand (wParam, lParam)) ;
  82. }
  83. BOOL CDockControlBarChildDlg::OnInitDialog()
  84. {
  85.         CAcUiDialog::OnInitDialog();
  86.         //制图标准
  87.         m采用menu采用7.CreatePopupMenu();
  88.         m采用menu采用7.AppendMenu(MF采用STRING, ID采用32768, 采用T("标准图框"));
  89.         m采用menu采用7.AppendMenu(MF采用STRING, ID采用32769, 采用T("图层标准"));
  90.         m采用menu采用7.AppendMenu(MF采用STRING, ID采用32770, 采用T("制图标准"));
  91.         m采用menu采用7.AppendMenu(MF采用STRING, ID采用32771, 采用T("常用图块"));
  92.         //效率工具
  93.         m采用menu采用4.CreatePopupMenu();
  94.         m采用menu采用4.AppendMenu(MF采用STRING, ID采用32778, 采用T("数据速查"));
  95.         m采用menu采用4.AppendMenu(MF采用STRING, ID采用32779, 采用T("计算表格"));
  96.         m采用menu采用4.AppendMenu(MF采用STRING, ID采用327710, 采用T("绘图研发工具"));
  97.         文本模板
  98.         m采用menu采用3.CreatePopupMenu();
  99.         m采用menu采用3.AppendMenu(MF采用STRING, ID采用32774, 采用T("设计信息征询表"));
  100.         m采用menu采用3.AppendMenu(MF采用STRING, ID采用32775, 采用T("评审文本"));
  101.         m采用menu采用3.AppendMenu(MF采用STRING, ID采用32776, 采用T("汇报文本"));
  102.         m采用menu采用3.AppendMenu(MF采用STRING, ID采用32777, 采用T("施工图设计文件"));
  103.         样图模板
  104.         m采用menu采用6.CreatePopupMenu();
  105.         m采用menu采用6.AppendMenu(MF采用STRING, ID采用32772, 采用T("样图模板"));
  106.         m采用menu采用6.AppendMenu(MF采用STRING, ID采用327723, 采用T("深度样图"));
  107.         绘制指导
  108.         m采用menu采用5.CreatePopupMenu();
  109.         m采用menu采用5.AppendMenu(MF采用STRING, ID采用327711, 采用T("制图标准指导书"));
  110.         m采用menu采用5.AppendMenu(MF采用STRING, ID采用327712, 采用T("平面类绘制指导书"));
  111.         m采用menu采用5.AppendMenu(MF采用STRING, ID采用327713, 采用T("立剖面绘制指导书"));
  112.         m采用menu采用5.AppendMenu(MF采用STRING, ID采用327714, 采用T("放大图绘制指导书"));
  113.         m采用menu采用5.AppendMenu(MF采用STRING, ID采用327715, 采用T("专项绘制绘制指导书"));
  114.         意见反馈
  115.         m采用menu采用1.CreatePopupMenu();
  116.         m采用menu采用1.AppendMenu(MF采用STRING, ID采用327716, 采用T("意见反馈"));
  117.         /*m采用menu采用1 = (CMenu*)GetDlgItem(IDR采用MENU1);
  118.         m采用btn采用1.SetMenu(m采用menu采用1);*/
  119.        
  120.         return TRUE;
  121. }
  122. //-----------------------------------------------------------------------------
  123. void CDockControlBarChildDlg::OnSize (UINT nType, int cx, int cy) {
  124.         CAcUiDialog::OnSize (nType, cx, cy) ;
  125.         //- Now update the dialog
  126.         MoveWindow (0, 0, cx, cy) ;
  127. }
  128. void CDockControlBarChildDlg::OnBnClickedButton7()
  129. {
  130.         CRect rect;
  131.         m采用btn采用7.GetWindowRect(&rect);
  132.         CString str;
  133.         str.Format(采用T("rect width : %d , rect length : %d"), rect.Width(), rect.Height());
  134.         m采用menu采用7.TrackPopupMenu(TPM采用LEFTALIGN | TPM采用TOPALIGN, rect.left, rect.bottom, this);
  135.         //m采用menu.TrackPopupMenu(TPM采用LEFTALIGN | TPM采用TOPALIGN, rect.left, rect.bottom, this);
  136. }
  137. void CDockControlBarChildDlg::OnBnClickedButton6()
  138. {
  139.         // TODO: 在此添加控件通知处理程序代码
  140.         CRect rect;
  141.         m采用btn采用6.GetWindowRect(&rect);
  142.         CString str;
  143.         str.Format(采用T("rect width : %d , rect length : %d"), rect.Width(), rect.Height());
  144.         m采用menu采用6.TrackPopupMenu(TPM采用LEFTALIGN | TPM采用TOPALIGN, rect.left, rect.bottom, this);
  145. }
  146. void CDockControlBarChildDlg::OnBnClickedButton3()
  147. {
  148.         // TODO: 在此添加控件通知处理程序代码
  149.         CRect rect;
  150.         m采用btn采用3.GetWindowRect(&rect);
  151.         CString str;
  152.         str.Format(采用T("rect width : %d , rect length : %d"), rect.Width(), rect.Height());
  153.         m采用menu采用3.TrackPopupMenu(TPM采用LEFTALIGN | TPM采用TOPALIGN, rect.left, rect.bottom, this);
  154. }
  155. void CDockControlBarChildDlg::OnBnClickedButton4()
  156. {
  157.         // TODO: 在此添加控件通知处理程序代码
  158.         CRect rect;
  159.         m采用btn采用4.GetWindowRect(&rect);
  160.         CString str;
  161.         str.Format(采用T("rect width : %d , rect length : %d"), rect.Width(), rect.Height());
  162.         m采用menu采用4.TrackPopupMenu(TPM采用LEFTALIGN | TPM采用TOPALIGN, rect.left, rect.bottom, this);
  163. }
  164. void CDockControlBarChildDlg::OnBnClickedButton5()
  165. {
  166.         // TODO: 在此添加控件通知处理程序代码
  167.         CRect rect;
  168.         m采用btn采用5.GetWindowRect(&rect);
  169.         CString str;
  170.         str.Format(采用T("rect width : %d , rect length : %d"), rect.Width(), rect.Height());
  171.         m采用menu采用5.TrackPopupMenu(TPM采用LEFTALIGN | TPM采用TOPALIGN, rect.left, rect.bottom, this);
  172. }
  173. void CDockControlBarChildDlg::OnBnClickedButton1()
  174. {
  175.         //MessageBox(采用T("Test Menu"));
  176.         // TODO: 在此添加控件通知处理程序代码
  177.         CRect rect;
  178.         m采用btn采用1.GetWindowRect(&rect);
  179.         /*CString str;
  180.         str.Format(采用T("rect width : %d , rect length : %d"), rect.left, rect.bottom);
  181.         MessageBox(str);*/
  182.         BOOL addMenu =  m采用menu采用1.TrackPopupMenu(TPM采用LEFTALIGN | TPM采用TOPALIGN, rect.left, rect.bottom, this);
  183.         if(!addMenu)
  184.         {
  185.                 MessageBox(采用T("Test Menu Failed"));
  186.         }
  187. }
复制代码







Button:
  1. //-----------------------------------------------------------------------------
  2. class CDockMenuPickButton : public CAcUiToolButton {
  3.         DECLARE采用DYNAMIC (CDockMenuPickButton)
  4. public:
  5.         CDockMenuPickButton () ;
  6.         virtual ~CDockMenuPickButton () ;
  7.         void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) override;
  8.        
  9.         afx采用msg void OnMouseMove(UINT nFlags, CPoint point);
  10.         afx采用msg void OnMouseHover(UINT nFlags, CPoint point);
  11.         afx采用msg void OnMouseLeave();
  12. protected:
  13.         DECLARE采用MESSAGE采用MAP()
  14. private:
  15.         BOOL m采用bTrackLeave;
  16. } ;
  17. #include "StdAfx.h"
  18. #include "resource.h"
  19. #include "DockMenuPickButton.h"
  20. //-----------------------------------------------------------------------------
  21. IMPLEMENT采用DYNAMIC (CDockMenuPickButton, CAcUiToolButton)
  22. BEGIN采用MESSAGE采用MAP(CDockMenuPickButton, CAcUiToolButton)
  23. END采用MESSAGE采用MAP()
  24. CDC* hdc;
  25. CRect hRect;
  26. //-----------------------------------------------------------------------------
  27. CDockMenuPickButton::CDockMenuPickButton () {
  28. }
  29. //-----------------------------------------------------------------------------
  30. CDockMenuPickButton::~CDockMenuPickButton () {
  31. }
  32. void CDockMenuPickButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  33. {
  34.         CDC dc;
  35.         dc.Attach(lpDrawItemStruct->hDC);
  36.         dc.SelectStockObject(NULL采用BRUSH);
  37.         dc.Rectangle(&lpDrawItemStruct->rcItem);
  38.         hdc = &dc;
  39.         COLORREF local采用bk = dc.GetBkColor();
  40.         CString str;
  41.         GetWindowText(str);
  42.         CRect rect = lpDrawItemStruct->rcItem;
  43.         hRect = rect;
  44.         GetClientRect(&rect);
  45.         //设置背景透明色
  46.         dc.SetBkMode(TRANSPARENT);
  47.         dc.SetPolyFillMode(TRANSPARENT);
  48.         ::GetStockObject(NULL采用BRUSH);
  49.        
  50.         //设置画笔为空,无边框
  51.         if(lpDrawItemStruct->itemState & ODS采用SELECTED )
  52.         {
  53.                 //设置颜色为背景色,实现边框取消的效果
  54.                 //dc.FillSolidRect(&rect,::GetBkColor(dc));
  55.                 dc.FillSolidRect(&rect, RGB(190, 200, 255));
  56.                 //如果悬停或者选中,需要显示仅显示边框
  57.                 dc.Draw3dRect(&rect, GetSysColor(COLOR采用3DDKSHADOW), GetSysColor(COLOR采用3DDKSHADOW));
  58.                 //设置文字
  59.                 dc.DrawText(str, rect, DT采用SINGLELINE | DT采用CENTER | DT采用VCENTER);
  60.                 dc.SetTextColor(RGB(255, 0, 0));
  61.         }
  62.         else if(lpDrawItemStruct->itemData & ODS采用HOTLIGHT)
  63.         {
  64.                 //设置颜色为背景色,实现边框取消的效果
  65.                 dc.FillSolidRect(&rect, RGB(170,180,255));
  66.                 //设置文字
  67.                 dc.DrawText(str, rect, DT采用SINGLELINE | DT采用CENTER | DT采用VCENTER);
  68.                 dc.SetTextColor(RGB(255, 0, 0));
  69.         }
  70.         else
  71.         {
  72.                 //设置颜色为背景色,实现边框取消的效果
  73.                 dc.FillSolidRect(&rect, ::GetBkColor(dc));
  74.                 //设置文字
  75.                 dc.DrawText(str, rect, DT采用SINGLELINE | DT采用CENTER | DT采用VCENTER);
  76.                 dc.SetTextColor(RGB(255, 0, 0));
  77.         }
  78.        
  79.         //CBrush* pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL采用BRUSH));
  80.         //CBrush* pOldBrush = dc.SelectObject(pBrush);
  81.         //dc.SelectObject(pBrush);
  82.        
  83.         //dc.SelectObject(pOldBrush);
  84. }
复制代码

 

 

 

 

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-5 12:26 , Processed in 0.127337 second(s), 24 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表