Simple Bitmapped menu items

 

简单位图菜单

这篇文章由Burchak Alexander原著

   有时应用程序使用动态创建的工具条。为什么我要为了位图菜单而创建工具条资源呢?(查看Iuri Apollonio 文章)

  我提议装配菜单位图时使用标准位图表。我这个类的优点是位图和工具条图像可以用尺寸和视图等来区分。此类支持SDIMDI用户界面中的弹出菜单。若你发现了bugs请提出来。

 

 所有你对类CbitmapMenu要做的事是:

1. 添加CbitmapMenu类的实例给CmainFrame 类:

CbitmapMenu m_menu;

2. 添加一个CimageList对象。例如,给CmainFrame类添加其static 成员 

CimageList m_imglist;

 

At the point you have in MainFrm.h:

#include "BitmapMenu.h"
class CMainFrame : public CMDIFrameWnd
{
    ...
    public :
       CBitmapMenu m_menu;
       static CImageList m_imglist;
    ...
};

 

MainFrm.cpp中添加:

#include "MainFrm.h"

CImageList CMainFrame :: m_imglist;

 

3.给这个项目添加N个图象资源。其中一个作为checkmark.

4.为菜单项添加一组CitemBitmap 对象(比如添加到MainFrm.cpp中),这些菜单项将显示位图。

CItemBitmap g_ibs[ ] =
{  
  CItemBitmap(ID_FILE_NEW, &CMainFrame :: m_imglist, 0),
  CItemBitmap(ID_FILE_OPEN, &Camp;MainFrame :: m_imglist, 1),
  CItemBitmap(ID_HELP_CONTENTS, &CMainFrame :: m_imglist, 19),
  CItemBitmap(-1, NULL, 0, &CMainFrame :: m_imglist, 27)
};

 

CitemBitmap类有2个构造器:

CItemBitmap( UINT uID,CImageList *pilNormal,UINT uPosNormal);
CItemBitmap( UINT uID,CImageList *pilNormal,UINT uPosNormal,CImageList *pilChecked, UINT uPosChecked);

其中,

   uID---菜单项ID,

   pilNormal---CimageList 对象指针,使用一个位图作为“正常”菜单项状态,

   pilChecked--- CimageList 对象指针,使用一个位图作为“检查”菜单项状态,

   uPosNormal---pilNormal图像列表中的图像索引,

   uPosChecked---pilChecked图像列表中的图像索引,

  列表中的最后个CitemBitmap对象用来保存checkmark图象信息。

  这个CbitmapMenu类用来画checked状态的菜单项。

5.CmainFrame::OnCreate()函数中处理如下:

  m_menu.Initialize(IDR_MAINFRAME, this);
m_menu.AddBitmaps( g_ibs,sizeof(g_ibs) / sizeof(CItemBitmap));

6. CmainFrame 类中添加WM_MEASUREITEM, WM_DRAWITEM WM_INITMENUPOPUP 消息处理函数。

  添加CmainFrame 类的消息映射:

  ON_WM_MEASUREITEM( )
ON_WM_DRAWITEM( )

ON_WM_INITMENUPOPUP( )

  CmainFrame类中添加下边函数:

  void CMainFrame :: OnMeasureItem(int nIDCtl,LPMEASUREITEMSTRUCT lpMIS)
{  
 if(lpMIS->CtlType == ODT_MENU)
       m_menu.MeasureItem( lpMIS );
   else
       CMDIFrameWnd :: OnMeasureItem(nIDCtl, lpMIS);
}
 
  
  
void CMainFrame :: OnDrawItem(int nIDCtl,LPDRAWITEMSTRUCT lpDIS)
{
  if(lpDIS->CtlType == ODT_MENU)
     m_menu.DrawItem( lpDIS );
  else
     CMDIFrameWnd :: OnDrawItem(nIDCtl, lpDIS);
}
 
  
  
void CMainFrame :: OnInitMenuPopup(CMenu *pPopup,UINT nIndex,BOOL bSysMenu)
{
  CMDIFrameWnd :: OnInitMenuPopup( pPopup,nIndex,bSysMenu);
  if( !bSysMenu )
     CBitmapMenu :: Synchronize( pPopup );
}

6.可选: 如果你想在视类中使用弹出式位图菜单,可按如下:

  CMenu menu;

VERIFY( menu.LoadMenu( SOME_POPUP_MENU_RESOURCE_ID ) );

CMenu *pMenu = (CMenu *)  menu.GetSubMenu( 0 );

ASSERT(pMenu != NULL);

pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, x, y, AfxGetMainWnd( ));

  我们在TrackPopupMenu()中使用AfxGetMainWnd(),让主框架更新菜单项状态。如果你欲要使用“this”作为弹出菜单的父类,会存在两个问题:

1.  你需要手工check/gray/enable/disable 菜单项。

2.  你需要为了适当的绘制位图菜单而添加下面三个消息处理函数。

我并没提供第一个问题的解决办法。第二个问题的办法是在CmainFrame类中为相同消息添加处理函数:

  ON_WM_MEASUREITEM( )
ON_WM_DRAWITEM( )

ON_WM_INITMENUPOPUP( )

处理体如下:

void CMyEditView :: OnMeasureItem(int nIDCtl,LPMEASUREITEMSTRUCT lpMIS)
{
   if(lpMIS->CtlType == ODT_MENU)
      ((CMainFrame *) AfxGetMainWnd( ))->m_menu.MeasureItem( lpMIS );
   else
      CEditView :: OnMeasureItem(nIDCtl, lpMIS);
}
 
  
  
void CMyEditView :: OnDrawItem(int nIDCtl,LPDRAWITEMSTRUCT lpDIS)
{
   if(lpDIS->CtlType == ODT_MENU)
     ((CMainFrame *) AfxGetMainWnd( ))->m_menu.DrawItem( lpDIS );
   else
     CEditView :: OnDrawItem(nIDCtl, lpDIS);
}
 
  
  
void CMyEditView :: OnInitMenuPopup(CMenu *pPopup,UINT nIndex,BOOL bSysMenu) 
{
   CEditView :: OnInitMenuPopup(pPopup,nIndex,bSysMenu);
   if( !bSysMenu )
      CBitmapMenu :: Synchronize( pPopup );
}

全文完。

在信息化浪潮的推动下,公安行业正经历着前所未有的变革。随着5G、大数据、云计算、人工智能等技术的飞速发展,公安工作对时空大数据的渴求日益迫切,科技兴警、数据赋能已成为未来发展方向。《公安机关“十四五”规划(2021-2025年)》《关于加强公安大数据智能化建设应用的指导意见》等重要文件及会议精神,为公安信息化建设指明了道路。公安信息化不仅关乎打击犯罪、维护社会稳定,更在大型活动安保、便民服务等方面发挥着不可替代的作用。面对城市高速发展和人口快速涌入带来的治安维稳压力,以及新型犯罪手段层出不穷的挑战,传统工作模式已力不从心,而信息化手段则成为提升警务效能的关键。 GIS技术作为公安信息化的重要支撑,正以其独特优势赋能公安行业。超图BitDC技术体系等先进解决方案,为公安信息化建设保驾护航。这些技术不仅支持三维、数据类别广、体量大,还实现了桌面、WEB、移动、VR、AR全端支持,满足了公安工作对时空数据治理及应用的高要求。云原生GIS支撑构建的PGIS2.0平台,通过分布式存储与计算、智能运维等技术,实现了平台支撑能力的全面升级。同时,边缘计算、全国产化方案等技术的应用,进一步提升了公安信息化的安全性和可靠性。在数据处理和分析方面,大数据智能分析技术通过多源、全量、实时公安大数据的处理,提供了地理围栏、封控圈等新型空间分析算子,为公安工作提供了强有力的数据支撑。此外,公安信息化应用还实现了大数据存储、分布式GIS支持等功能,为实战分析提供了更多可能。 在实际应用中,GIS技术已广泛应用于公安行业的各个领域。以某省公安时空信息支撑平台为例,该平台汇聚了海量二三维地理数据,通过快展示、速上图、稳支撑等技术手段,实现了十余警种数据的快速接入和灵活应用。在某市公安局大数据平台,地址时空库、人口时空库等时空数据库的建设,为警务工作提供了更为精准的数据支持。同时,多端应用全覆盖的警务综合态势系统,通过大屏展示、地理资源门户等方式,全面支撑了警务业务应用。此外,智慧监所、可视化指挥调度平台等实战应用系统的建设,也进一步提升了公安工作的智能化水平。这些成功案例不仅展示了GIS技术在公安行业的应用成果,更为未来智慧警务的发展提供了宝贵经验。在趣味性和知识性方面,这些技术的应用不仅让公安工作更加高效便捷,也让公众对公安工作有了更深入的了解和认识。对于写方案的读者而言,这些案例和技术创新点无疑将为他们提供丰富的灵感和参考。 综上所述,GIS技术正以其独特优势引领公安行业信息化迈向新高度。随着技术的不断发展和应用的不断深化,未来智慧警务将呈现出更加智能化、高效化、便捷化的特点。公安行业应紧跟时代步伐,充分利用信息化手段提升警务效能,为维护社会稳定和人民安全作出更大贡献。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值