Simple Bitmapped menu items

原创 2002年05月02日 10:22:00
 

简单位图菜单<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

这篇文章由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 );
}

全文完。

ActionBar 详解

在Android3.0之后,Google对UI导航设计上进行了一系列的改革,其中有一个非常好用的新功能就是引入的ActionBar,他用于取代3.0之前的标题栏,并提供更为丰富的导航效果。 一、添加...
  • wangtao0921
  • wangtao0921
  • 2015年07月10日 16:26
  • 832

Menu基本介绍实现

Activity类中的onCreateOptionsMenu事件方法用来创建选项菜单,该方法的定义如下: public boolean onCreateOptionsMenu(Menu menu); ...
  • yhcelebrite
  • yhcelebrite
  • 2013年09月20日 11:53
  • 2670

Simple Items

● Item 7 多态基类中将析构函数声明为虚拟1> 多态基类应该声明虚析构函数。如果一个类有任何虚函数,它就应该有一个虚析构函数。2> 纯虚析构函数也必须有函数体。否则linker报错。● Item...
  • ba_jie
  • ba_jie
  • 2011年04月21日 09:53
  • 460

Menu items should specify a title(解决方法)

Just a wrong XML namespace! Try with: xmlns:android="http://schemas.android.com/apk/res/android"> ...
  • qq_27126069
  • qq_27126069
  • 2017年04月06日 21:29
  • 244

Android学习中遇到的问题及解决方案

1.搭建开发环境时遇到的问题:初装Android Studio,首次运行报错:Error running app: Instant Run requires ‘Tools | Android | En...
  • github_36248956
  • github_36248956
  • 2016年10月10日 22:34
  • 748

IDBUX: Radio Menu Items

   What happens when I select “List”?Here’s a truly rare bird: a UI heuristic where most GUItoolkit...
  • tassadar
  • tassadar
  • 2009年11月16日 11:45
  • 422

android之menu详解

一、OptionMenu的使用        1、代码生成menu(重写activity的onCreateOptionMenu()方法) @Override public boolean on...
  • wangsfine
  • wangsfine
  • 2016年06月17日 15:31
  • 2617

Drupal 菜单系统 hook_menu

Drupal的菜单系统复杂但是强大,术语“菜单系统”(menu system)有些取名不当,最好认为菜单系统有三个主要职责:回调映射、访问控制、菜单定制。菜单系统基本的代码在includes/menu...
  • xinyflove
  • xinyflove
  • 2015年07月30日 18:19
  • 518

Menu Items are not showing on Action Bar

http://stackoverflow.com/questions/18010072/menu-items-are-not-showing-on-action-bar
  • meegomeego
  • meegomeego
  • 2014年06月03日 18:08
  • 719

Adding Menu Items Based on an Intent

Adding Menu Items Based on an Intent Sometimes you'll want a menu item to launch an activity usin...
  • zhaoweixing1989
  • zhaoweixing1989
  • 2012年06月28日 11:02
  • 748
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Simple Bitmapped menu items
举报原因:
原因补充:

(最多只允许输入30个字)