类用于设计菜单,用户只要从该类派生一个子类,然后改写MeasureItem方法,设置菜单项的高度和宽度;改写DrawItem方法,根据菜单项的不同状态,绘制不同效果的菜单项就可以了。具体设计如下:
(1) 从CMenu类派生一个子类CCustomMenu。
(2) 定义一个菜单项结构CMenuItem,记录菜单项的信息。代码如下:
定义一个结构,记录菜单项的详细信息 Struct CMenuItem {
CString m_Menutext; 菜单项的文本 UINTm_ImageIndex; 菜单项图像索引
Int m_MenuType ; 菜单项的类型 -2:顶层菜单,
-1:弹出式菜单,0:分隔条,其他:普通菜单
(3) 向CCustomMenu类中添加成员变量。
(4) 在CCustomMenu类的构造函数中初始化成员变量。 CCustomMenu::CCustomMenu()
{
量
m_Index = 0; 初始化整型变量 m_MenuList = NULL; 初始化菜单列表 m_SelTopColor = RGB(193, 210, 238); 初始化顶层菜单颜 m_ItemCount = 0; 初始化菜单项数
色
m_RandColor = FALSE; 是否采用随机颜色
}
(5) 在CCustomMenu类的析构函数中释放成员变量占据的堆空间。
CCustomMenu::~CCustomMenu() {
if (m_ItemCount > 0) 如果菜单项>0,则释放菜
单列表
delete []m_MenuList; }
(6) 向CCustomMenu类中添加GetAllItemCount方法,获取菜单项
的数量,当前流程图如下:
(7) 向CCustomMenu类中添加AttachMenu方法,附加菜单句柄到
CCustomMenu类对象上
BOOL CCustomMenu::AttatchMenu(HMENU TRUE; }
(8)向CCustomMenu类中添加SetMenuItemInfo方法,将每个菜单项关联一个CMenuItem结构对象。
(9)向CCustomMenu类中添加GetTopMenuWidth方法,获取顶层菜单的高度。流程图如下:
(10)向CCustomMenu类中添加GetClientMenuRgn方法,获取菜单栏中
的非菜单项区域。流程图如下:
获取菜单栏中非菜单项区域
HRGN CCustomMenu::GetClientMenuRgn()
MENUBARINFO MenuInfo; 定义菜单项信息对象
memset(&MenuInfo,0,sizeof(MENUBARINFO)); 初始化菜单项信息
MenuInfo.cbSize = sizeof(MENUBARINFO); 设置菜单项信息结构的大小
GetMenuBarInfo(AfxGetMainWnd()->m_ HRGN[MenuCount];
定义一个选区指针,记录菜单项选区
CRect winRC; 定义一个区域对象 AfxGetMainWnd()->GetWindowRect(winRC); 获取主窗口区域 for (int j=0; j CombineRgn(retRgn,MenuRgn,MenuClientRgn,RGN_DIFF); for ( j=0; j (11)向CCustomMenu类中添加SetMenuItemText方法,绘制菜单项文本。 void CCustomMenu::SetMenuItemText(CDC *pDC, LPSTR = new strMenuText, CRect Rect) { Rect.DeflateRect(20,0); pDC->DrawText(strMenuText,Rect,DT_SINGLELINE|DT_VCENTER|DT_LEFT); } (12)向CCustomMenu类中添加DrawTopMenuBk方法,绘制顶层菜单的背景颜色。 (13)向 CCustomMenu类中添加DrawSepMenu方法,绘制菜单分隔 条。 void CCustomMenu::DrawSepMenu(CDC *pDC, CRect Rect) { } (14)向CCustomMenu类中添加DrawMenuBk方法,绘制菜单项的背景颜色。 void CCustomMenu::DrawMenuBk(CDC *pDC, CRect Rect, COLORREF SrcColor, COLORREF DesColor, BOOL State) { if (State) { pDC->Rectangle(Rect); Rect.DeflateRect(1,1); int r1,g1,b1; 读取渐变起点的颜色值 r1 = GetRValue(SrcColor); g1 = GetGValue(SrcColor); b1 = GetBValue(SrcColor); int r2,g2,b2; 读取渐变终点的颜色值 r2 = GetRValue(DesColor); g2 = GetGValue(DesColor); b2 = GetBValue(DesColor); float r3,g3,b3; 菜单区域水平方向每个点RGB值应该变 化的度(范围) 值 } else CPen* pOldPen ; for (int i=Rect.top; i r = r1+(int)r3*(i-Rect.top); g = g1+(int)g3*(i-Rect.top); b = b1+ (int)b3*(i-Rect.top); CPen pen (PS_SOLID,1,RGB(r,g,b)); pOldPen = pDC->SelectObject(&pen); pDC->MoveTo(Rect.left,i); pDC->LineTo(Rect.right,i); pDC->SelectObject(pOldPen); r3 = ((float)(r2-r1)) (float)(Rect.Height()); g3 = (float)(g2-g1)(float)(Rect.Height()); b3 = (float)(b2-b1)(float)(Rect.Height()); COLORREF r,g,b; 菜单区域水平方向每个点的颜色 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库(强烈推荐)毕业论文设计_基于VC++的图像处理系统设计与实现(4)在线全文阅读。
相关推荐: