最近研究了一下CMenu的相关属性和方法,发现出现了一道难以逾越的关卡。
如下:
1,CNiceMenu继承自CMenu.
2,要实现菜单重绘就必须响应WM_DRAWITEM消息,这一点来自文章 文章链接
但是,发现却出现了DrawItem函数里面重新绘制的东西把SetMenuItemBitmaps函数设置的菜单位图给覆盖了,起初以为是
SetMenuItemBitmaps有问题。但后来使用GetLastError时返回为0,说明函数已经执行成功,为了验证,偶然发现,把鼠标指针在设置了位图的菜单项上反复快速移动,会出现SetMenuItemBitmaps设置的位图的“影子”。
3,怎么办呢,DrawItem函数始终在SetMenuItemBitmaps之后执行,似乎找不到方法了。
望各位兄弟姐妹,前辈先祖,指点迷津啦!
如下:
1,CNiceMenu继承自CMenu.
2,要实现菜单重绘就必须响应WM_DRAWITEM消息,这一点来自文章 文章链接
但是,发现却出现了DrawItem函数里面重新绘制的东西把SetMenuItemBitmaps函数设置的菜单位图给覆盖了,起初以为是
SetMenuItemBitmaps有问题。但后来使用GetLastError时返回为0,说明函数已经执行成功,为了验证,偶然发现,把鼠标指针在设置了位图的菜单项上反复快速移动,会出现SetMenuItemBitmaps设置的位图的“影子”。
3,怎么办呢,DrawItem函数始终在SetMenuItemBitmaps之后执行,似乎找不到方法了。
望各位兄弟姐妹,前辈先祖,指点迷津啦!
解决方案 »
- 急,跪求各位大侠
- 急!哪位大侠能帮忙写一下树(TREECTRL由数据库生成),因为急着要,所以解决了立即给分
- 试试提问
- 新手上路,简单问题只要一解决就发分!
- [在线即时结贴]急。。。如何CEditView视图中显示的文字存储到一个CString数组中?高手请进!!!
- 如何实现剪贴板中存放多个图片???
- MFC编程时,当自己设计了窗口右上角三个按钮(即“最大化”“最小化”“关闭”)的图标后,如何实现其功能?
- VC作ACTIVEX中如何用DLL,要求动态调用,??
- 急,急,诸位不知为何《WINDOWS核心编程》CD源代码全部出错,怎么加事???
- 用CFormView分割SDI窗口,程序运行时为什么总出现选择新建窗口?
- unicode与GB2312
- 我知道c++最擅长开发什么?想要点c++开发的自学教程。谢谢!
头文件// MenuEx.h: interface for the CMenuEx class.
// CMenuEx
// 原作者:lbird(郑恒)
// 修改:(querw)阙荣文
// 新增接口:
// void LoadMenu();
// BOOL ModifyMenuEx()
// BOOL AppendMenuEx()
// BOOL RemoveMenuEx()
// void LoadToolBar()
// 原接口:
// void SetHighLightColor(COLORREF crColor)
// void SetBackColor(COLORREF)
// void SetTextColor(COLORREF)
// void SetImageLeft(UINT idBmpLeft)
//
// 2004.7.23
//////////////////////////////////////////////////////////////////////#if !defined(AFX_MENUEX_H__FE677F6B_2315_11D7_8869_BB2B2A4F4D45__INCLUDED_)
#define AFX_MENUEX_H__FE677F6B_2315_11D7_8869_BB2B2A4F4D45__INCLUDED_
#include "afxtempl.h"
#include "afxwin.h"
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000typedef struct tagMENUITEM
{
CString strText; //菜单文本
UINT uID; //菜单ID
int uIndex; //菜单图标的编号
int uPositionImageLeft; //菜单左边位图的位置
int nSubMenuIndex; //若是子菜单,表示在数组中的位置
tagMENUITEM() //结构体中的构造函数初始化成员
{
strText = _T("");
uID = -2;
uIndex = -1;
uPositionImageLeft = -1;
nSubMenuIndex = -1;
pImageList = NULL;
pLeftBitmap = NULL;
};
CImageList *pImageList;
CBitmap *pLeftBitmap;
}MENUITEM,*LPMENUITEM;
///////////////////////////////////////////
class CMenuEx : public CMenu
{
DECLARE_DYNAMIC( CMenuEx )
public:
//读入菜单,调用这个函数以后,菜单就有了自画风格
BOOL LoadMenu(UINT uMenu);
//修改,添加,删除菜单项,自动指定为自画风格
BOOL ModifyMenuEx(UINT nPosition, UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );
BOOL AppendMenuEx(UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );
BOOL RemoveMenuEx(UINT nPosition, UINT nFlags);
//读入工具条,可以指定一张位图以替代工具条资源的16色位图
void LoadToolBar(UINT uToolBar,UINT uFace);
//其他各种设置
void SetHighLightColor(COLORREF crColor);
void SetBackColor(COLORREF);
void SetTextColor(COLORREF);
void SetImageLeft(UINT idBmpLeft,BOOL bIsPopupMenu = FALSE);
CMenuEx* GetSubMenu( int nPos ) const;
virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMIS);
virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS);
CMenuEx();
virtual ~CMenuEx();protected:
int m_nSeparator; //分割条的高度
CSize m_szImageLeft; //菜单左边为体的高度和宽度
CBitmap m_bmpImageLeft; //菜单左边的位图
int m_nWidthLeftImage; //菜单左边位图的宽度
BOOL m_bHasImageLeft; //是否有侧边位图
COLORREF m_colMenu; //菜单背景色
COLORREF m_colTextSelected; //菜单被选中时文本的颜色 COLORREF m_crCurSelBorder; // 当前指针所指项目边框的颜色
COLORREF m_crCurSelRect; //当前鼠标指针所在菜单项的边框背景色 COLORREF m_crLeftErectRect; // 设置左边竖直边框填充色
COLORREF m_crSeparator; CImageList m_ImageList; //菜单项位图列表
COLORREF m_colText; //菜单项没被选中时文本的颜色
CSize m_szImage; //菜单项位图的大小
int CalculateLeftImagePos(CMenu *pPopupMenu); //重新计算左边位图的位置(最底部的菜单项的位图标号是 0 )
void ChangeMenuStyle(CMenu* pMenu,HMENU hNewMenu);
//void DrawImageLeft(CDC *pDC,CRect &rect,LPMENUITEM lpItem);
void TextMenu(CDC *pDC,CRect rect,CRect rcText,BOOL bSelected,BOOL bGrayed,LPMENUITEM lpItem);
void DrawMenuItemImage(CDC *pDC,CRect &rect,BOOL bSelected,BOOL bChecked,BOOL bGrayed,BOOL bHasImage,LPMENUITEM lpItem);
void GrayString(CDC *pDC,const CString &str,const CRect rect); CArray<CMenuEx *,CMenuEx *> m_SubMenuArr;
CArray<MENUITEM *,MENUITEM *>m_MenuItemArr;
public:
// 设置选中边框颜色
void SetCurSelBorderColor(COLORREF crBorder);
// 设置选中边框填充色
void SetCurSelRectColor(COLORREF crFill);
// 设置左边竖直矩形的边框颜色
void SetLeftRectBkColor(COLORREF crBkgnd);
// 设置分隔符高度
//void SetSeparatorHeight(UINT uHeight);
protected:
// 设置分隔符高度(2-15)
UINT m_uHeight;
public:
void SetCheckBmp(UINT nBmpID);
protected:
UINT nCheckBmpID;
public:
// 设置菜单项的位图
void SetMenuItemImage(UINT nPosition , UINT nBmpSourceID);
protected:
// 此ID用来指定要设置左边位图的菜单项
int m_nMenuID;
};#endif // !defined(AFX_MENUEX_H__FE677F6B_2315_11D7_8869_BB2B2A4F4D45__INCLUDED_)