• 网络学院
  • 新手学堂
  • 操作系统
  • 网络技术
  • 软件应用
  • 办公软件
  • 编程技术
  • 网站架设
  • 数据库类
  • 平面设计
  • 多媒体类
  • 游戏资讯
  • 教学论文
  • 认证考试
VC中进行自绘菜单的实现
广告位
  站点:
  • 首 页
  • 最新软件
  • 最新文章
  • 国内软件
  • 国外软件
  • 汉化软件
  • 源码下载
  • 字体下载
VC中进行自绘菜单的实现
软件发布 VC中进行自绘菜单的实现
网络软件 系统工具 应用软件 联络聊天 图形图像 多媒体类 行业软件 游戏娱乐 编程开发 安全相关 教育教学 数码软件
热门软件: QQ 瑞星 pplive e话通 木马克星 千千静听 office2000 五笔字根 Photoshop 视频分割
返回首页 | 文章首页 | 编程技术 | VC教程 | VC中进行自绘菜单的实现

VC中进行自绘菜单的实现

 

添加时间: 2006-2-13 8:46:27  作者: VC教程  阅读次数:524   来源: http://d9soft.com

 

 

          在这里提供一个C++类(CCustomMenu),该类是Cmenu的子类,并且拥有自绘能力。它可以向你提供以下的功能:
  设置字体颜色。
  设置高亮度颜色。
  设置高亮度时的风格。
  设置选中时和在普通状态下的菜单显示的图标。
  设置显示图标大小。
  在CCustomMenu中定义了结构MENUDATA,你必须根据你的需要填充该结构,并且在增加菜单时提供该结构的指针(调用AppendMenu,InsertMenu)。下面是一个例子:

  1、定义CCustomMenu的实例,和MENUDATA结构变量。
  CCustomMenu m_cCustomMenu;

  MENUDATA menuData [8];

  2、调用CreateMenu()设置有关参数。

  m_customMenu.CreateMenu ();
  m_customMenu.SetIconSize (25,25);
  m_customMenu.SetHighlightStyle (Normal);
  m_customMenu.SetTextColor (RGB (255,0,0));
  m_customMenu.SetBackColor (RGB (255,255,255));
  m_customMenu.SetHighlightColor (RGB (0,0,255));

  3、设置MENUDATA变量,并增加菜单项。

  lstrcpy (menuData[0].menuText , "text1");
  menuData[0].menuIconNormal= IDI_ICON1;
  m_customMenu.AppendMenu (MF_OWNERDRAW,3,(LPCTSTR)menuData);  

  3、在你的窗口中重载OnMeasureItem(...)函数。

  void CMyView::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
  {
   if ( lpMeasureItemStruct->CtlType == ODT_MENU &&
   IsMenu((HMENU)lpMeasureItemStruct->itemID) &&
   (lpMeasureItemStruct->itemID == (UINT)m_hMenuSub) )
   {
   m_customMenu.MeasureItem (lpMeasureItemStruct);
}
   else
    Cview::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
  }

  下面的函数将帮助你设置菜单属性。  

   void SetTextColor (COLORREF );
   void SetBackColor (COLORREF);
   void SetHighlightColor (COLORREF);
   void SetIconSize (int, int);
   void SetHighlightStyle (HIGHLIGHTSTYLE ); // HIGHLIGHTSTYLE : enum {Normal, TextOnly}
   void SetHighlightTextColor (COLORREF);

  下面是文件代码:

  //*************************************************************************

  // CustomMenu.h : header file

  //  

  #if
  !defined(AFX_CUSTOMMENU_H__FE5B01C3_1E02_11D1_B87A_0060979CDF6D__INCLUDED_)
  #define AFX_CUSTOMMENU_H__FE5B01C3_1E02_11D1_B87A_0060979CDF6D__INCLUDED_
  #if _MSC_VER >= 1000
  #pragma once
  #endif // _MSC_VER >= 1000

  class MENUDATA
  {
  public:
   MENUDATA () { menuIconNormal = -1; menuIconSelected = -1;};
   char menuText[32];
   UINT menuIconNormal;
   UINT menuIconSelected;
  };  

  typedef enum {Normal,TextOnly} HIGHLIGHTSTYLE;

  ///////////////////////////////////////////////////////////////////////////
  //
  // CCustomMenu window
  class CCustomMenu : public Cmenu
  {
  // Construction
  public:
   CCustomMenu();
  // Attributes
  public:
  // Operations
  public:
  // Overrides
   // ClassWizard generated virtual function overrides
   //{{AFX_VIRTUAL(CCustomMenu)
   //}}AFX_VIRTUAL
  // Implementation

  public:
   virtual ~CCustomMenu();
   virtual void DrawItem( LPDRAWITEMSTRUCT);
   virtual void MeasureItem( LPMEASUREITEMSTRUCT );
   void SetTextColor (COLORREF );
   void SetBackColor (COLORREF);
   void SetHighlightColor (COLORREF);
   void SetIconSize (int, int);
   void SetHighlightStyle (HIGHLIGHTSTYLE );
   void SetHighlightTextColor (COLORREF); 

   // Generated message map functions

  protected:
   COLORREF m_crText;
   COLORREF m_clrBack;
   COLORREF m_clrText;
   COLORREF m_clrHilight;
   COLORREF m_clrHilightText;
   LOGFONT m_lf;
   Cfont m_fontMenu;
   UINT m_iMenuHeight;
   BOOL m_bLBtnDown;
   Cbrush m_brBackground,m_brSelect;
   Cpen m_penBack;
   int m_iconX,m_iconY;
   HIGHLIGHTSTYLE m_hilightStyle; 

   //{{AFX_MSG(CCustomMenu) 
   //}}AFX_MSG
  };

  //{{AFX_INSERT_LOCATION}}
  // Microsoft Developer Studio will insert additional declarations immediately before the previous line.  

  #endif //!defined(AFX_CUSTOMMENU_H__FE5B01C3_1E02_11D1_B87A_0060979CDF6D__INCLUDED_) 

  //************************************************************************* 
  // CustomMenu.cpp : implementation file
  //
  #include "stdafx.h"
  #include "CustomMenu.h"
  #ifdef _DEBUG
  #define new DEBUG_NEW
  #undef THIS_FILE
  static char THIS_FILE[] = __FILE__;
  #endif  

  /////////////////////////////////////////////////////////////////////////////
  // CCustomMenu  

  CCustomMenu::CCustomMenu()
  {
   m_clrText = GetSysColor (COLOR_MENUTEXT);
   m_clrBack = GetSysColor (COLOR_MENU);
   m_brBackground.CreateSolidBrush (m_clrBack);
   m_penBack.CreatePen (PS_SOLID,0,m_clrBack);
   m_crText = m_clrText;
   m_bLBtnDown = FALSE;
   m_iconX = GetSystemMetrics ( SM_CXMENUCHECK);
   m_iconY = GetSystemMetrics (SM_CYMENUCHECK );
   m_clrHilight = GetSysColor (COLOR_HIGHLIGHT);
   m_brSelect.CreateSolidBrush (m_clrHilight);
   m_clrHilightText = GetSysColor (COLOR_HIGHLIGHTTEXT);  

   ZeroMemory ((PVOID) &m_lf,sizeof (LOGFONT));
   NONCLIENTMETRICS nm;
   nm.cbSize = sizeof (NONCLIENTMETRICS);
   //Get the system metrics for the Captionfromhere
   VERIFY (SystemParametersInfo (SPI_GETNONCLIENTMETRICS,0,&nm,0));  

   m_lf = nm.lfMenuFont;
   m_iMenuHeight = nm.iMenuHeight;
   m_fontMenu.CreateFontIndirect (&m_lf);
  } 

  CCustomMenu::~CCustomMenu()
  {
   if ((HBRUSH) m_brBackground != NULL)   m_brBackground.DeleteObject ();
   if ((HFONT)m_fontMenu !=NULL)
   m_fontMenu.DeleteObject ();
   if ((HBRUSH)m_brSelect != NULL)
   m_brSelect.DeleteObject ();
  }  

  ///////////////////////////////////////////////////////////////////////////
  // CCustomMenu message handlers

  void CCustomMenu::DrawItem (LPDRAWITEMSTRUCT lpDIS)
  {
   ASSERT(lpDIS != NULL);  
   CDC* pDC = CDC::FromHandle(lpDIS->hDC);
   Crect rect;
   HICON hIcon;
   COLORREF crText = m_crText;
   // draw the colored rectangle portion
   rect.CopyRect(&lpDIS->rcItem);
   // draw the up/down/focused/disabled state
   UINT action = lpDIS->itemAction;
   UINT state = lpDIS->itemState;
   Cstring strText;
   LOGFONT lf;
   lf = m_lf;  

   Cfont dispFont;
   Cfont *pFont;
   //GetWindowText(strText);
   if (lpDIS->itemData != NULL)
   {
   strText = (((MENUDATA*) (lpDIS->itemData))->menuText);
   if ((((MENUDATA *)(lpDIS->itemData))->menuIconNormal) == -1)
   hIcon = NULL;
   else if (state & ODS_SELECTED)
   {
   if ((((MENUDATA *)(lpDIS->itemData))->menuIconSelected) != -1)
   hIcon = AfxGetApp ()->LoadIcon (((MENUDATA *)(lpDIS->itemData))->menuIconSelected);
   else
   hIcon = AfxGetApp()->LoadIcon (((MENUDATA*)(lpDIS->itemData))->menuIconNormal);

   }
   else

    hIcon = AfxGetApp()->LoadIcon (((MENUDATA*)(lpDIS->itemData))->menuIconNormal);
    TRACE1 ("Draw for %s\n", strText);
   }
   else
   {
   strText.Empty();
   hIcon = NULL;
   } 

   if ( (state & ODS_SELECTED) )
   {
   // draw the down edges
   Cpen *pOldPen = pDC->SelectObject (&m_penBack);
   //You need only Text highlight and that's what you get
   if (m_hilightStyle != Normal)
   {
   pDC->FillRect (rect,&m_brBackground);
   }
   else
   {
   pDC->FillRect (rect,&m_brSelect);

   }

   pDC->SelectObject (pOldPen);
   pDC->Draw
3dRect (rect,GetSysColor (COLOR_3DHILIGHT),GetSysColor(COLOR_3DSHADOW));
   lf.lfWeight = FW_BOLD;
   if ((HFONT)dispFont != NULL)
   dispFont.DeleteObject ();
   dispFont.CreateFontIndirect (&lf);
   crText = m_clrHilightText; 

   //While selected move the text a bit
   TRACE0 ("SELECT,SELECTED\n");
   }
   else
   {
   Cpen *pOldPen = pDC->SelectObject (&m_penBack);
   pDC->FillRect (rect,&m_brBackground);
   pDC->SelectObject (pOldPen);
   // draw the up edges
   pDC->Draw3dRect (rect,m_clrBack,m_clrBack);
   if ((HFONT)dispFont != NULL)
   dispFont.DeleteObject ();
   dispFont.CreateFontIndirect (&lf); //Normal
   TRACE0 ("SELECT, NORMAL\n");
   }  

   // draw the text if there is any
   //We have to paint the text only if the image is nonexistant
   if (hIcon != NULL)
   {
   if(DrawIconEx (pDC->GetSafeHdc(),rect.left,rect.top,hIcon,
   (m_iconX)?m_iconX:32,(m_iconY)?m_iconY:32,0,NULL,DI_NORMAL))
   TRACE0("Wrote the icon successfully\n");
   else
   TRACE0 ("SORRY.NOGO\n");
   }
   //This is needed always so that we can have the space for check marks
   rect.left = rect.left +((m_iconX)?m_iconX:32);
   if ( !strText.IsEmpty())
   {
   //pFont->GetLogFont (&lf);

   int iOldMode = pDC->GetBkMode();
   pDC->SetBkMode( TRANSPARENT);  
   pDC->SetTextColor( crText);
   pFont = pDC->SelectObject (&dispFont);
   TRACE1( "About To DrawText %s\n",strText);
   pDC->DrawText (strText,rect,DT_LEFT DT_SINGLELINE DT_VCENTER);
   TRACE0("Done\n");
   pDC->SetBkMode( iOldMode );
   pDC->SelectObject (pFont); //set it to the old font
   }
   dispFont.DeleteObject ();
  } 

  void CCustomMenu::MeasureItem( LPMEASUREITEMSTRUCT lpMIS )
  {
   CDC *pDC = AfxGetApp()->m_pMainWnd->GetDC();
   Cfont* pFont = pDC->SelectObject (&m_fontMenu);
   int iconX = 0,iconY= 0;
   TEXTMETRIC tm;
   pDC->GetTextMetrics (&tm);
   pDC->SelectObject (pFont);
   AfxGetApp()->m_pMainWnd->ReleaseDC (pDC);  

   if (m_iconX)
   iconX = m_iconX;
   if (m_iconY)
   iconY = m_iconY; 

   lpMIS->itemWidth = iconX + tm.tmAveCharWidth * lstrlen(((MENUDATA*)(lpMIS->itemData))->menuText) +10;
   lpMIS->itemHeight = (iconY > (m_iMenuHeight+1))?iconY:m_iMenuHeight + 1;
  } 

  void CCustomMenu::SetIconSize (int width, int height)
  {
   m_iconX = width;
   m_iconY = height;
  }

  void CCustomMenu::SetTextColor (COLORREF clrText)
  {
   m_crText = clrText;
  } 

  void CCustomMenu::SetBackColor (COLORREF clrBack)

  {
   m_clrBack = clrBack;
   if ((HBRUSH)m_brBackground != NULL)
   m_brBackground.DeleteObject ();
   m_brBackground.CreateSolidBrush (clrBack);
  }  

  void CCustomMenu::SetHighlightColor (COLORREF clrHilight)
  {
   m_clrHilight = clrHilight;
   if ((HBRUSH)m_brSelect != NULL)
   m_brSelect.DeleteObject ();
   m_brSelect.CreateSolidBrush (clrHilight);
  }
  

  void CCustomMenu::SetHighlightTextColor (COLORREF clrHilightText)
  {
   m_clrHilightText = clrHilightText;
  }

  void CCustomMenu::SetHighlightStyle (HIGHLIGHTSTYLE hilightStyle)

  {
   m_hilightStyle = hilightStyle;
  }

  //*************************************************************************

 

 

 

上下文章:

 

上一篇文章: 用VC6.0实现超级链接 下一篇文章: 利用MFC实现对象拖放

相关文章:

  • servlet实现oracle中读出文件并显示
  • 在Oracle中实现数据库的复制
  • 在T-SQL中实现Oracle的MINUS集合运算符
  • Linux中实现DDOS攻击的方法
  • 如何实现纵深化的网络安全防御?

相关软件:

  • 快速菜单QuickMenu V2.3
  • 网吧全系列菜单 V2007.0427
  • 修改IIS的BANNER实现操作系统版本的隐藏(PDF)
  • VB.NET面向对象的实现(CHM)
  • OEM菜单设置器 V3.2

 

 

快速导航

  • 网络学院
  • 精品汇聚
  • 字体下载
  • 教程下载
  • ASP源码
  • PHP源码
  • Net源码
  • JSP 源码

编程技术分类导航

  • ASP & ASP.NET教程
  • PHP教程
  • JSP教程
  • C/C++教程
  • VB & VB.NET教程
  • VC教程
  • Delphi教程
  • BCB教程
  • VFP教程
  • PB教程
  • JAVA教程
  • XML教程
  • C#教程
  • CGI教程

本类经典文章推荐

  • VC++之Button控件
  • VC++之Static Box控件
  • VC++之Edit Box控件
  • VC++之Static Box控件
  • VC++之Edit Box控件
  • VC++之Scroll Bar
  • VC++之Scroll Bar
  • VC++之List Box/Check List Box控...
  • VC++ Combo Box/Combo Box Ex控件
  • VC++ List Ctrl控件

VC教程阅读排行

  • VC++之List Box/Check List Box控...
  • VC++ List Ctrl控件
  • VC++ Combo Box/Combo Box Ex控件
  • VC++之Button控件
  • VC++之Tab Ctrl控件
  • VC++之Edit Box控件
  • VC++之Edit Box控件
  • VC遍历整个目录树查找文件
  • 深入编程:控制面板知多少?
  • VC++之Scroll Bar

编程技术阅读总排行

  • VB入门教程之一
  • 第二章 PowerBuilder 入门之创建新...
  • Java连接数据库实例
  • 第一章 什么是PowerBuilder
  • VC++之List Box/Check List Box控...
  • VC++ List Ctrl控件
  • VC++ Combo Box/Combo Box Ex控件
  • 学C++不得不看的一篇文章
  • VB入门教程之二
  • VC++之Button控件

广告位置

字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 回到顶部

关于我们 | 版权声明 | 免责条款 | 广告联系 | 软件发布 | 下载帮助 | 下载排行 | 网站地图 | 特别鸣谢 | 友情连接

copyright; 2005-2008 D9soft.com 第九软件网 版权所有