自绘菜单

合集下载

菜单自绘方面的知识 - ponydph的专栏 - CSDN博客

菜单自绘方面的知识 - ponydph的专栏 - CSDN博客

菜单自绘方面的知识收藏1要实现漂亮的界面菜单,必须要启动菜单项的自绘功能,所谓菜单的自绘,就是让菜单自己管理自己的显示效果,为此,首先要作的就是设置菜单项的风格为MF_OWNERDRAW(自绘制),设置菜单的自绘功能即可以通过CMenu类的AppendMenu()函数在菜单的初始阶段实现,也可以通过ModifyMenu()函数对已存在的菜单项进行类型修改。

具体的菜单的自绘是通过重载CMenu类的DrawItem()函数来实现的,这个函数根据各种菜单状态,处理当前菜单项中菜单图标、文字显示的功能。

DrawItem()函数的原形为:virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct ),它参数为一个指向DRAWITEMSTRUCT结构的指针,DRAWITEMSTRUCT结构如下:typedef struct tagDRAWITEMSTRUCT {UINT CtlType; //控件类型;UINT CtlID; //组合框、列表框等控件的ID标识号;UINT itemID; //菜单项的ID标识号或列表框、组合框中某一项的索引值;UINT itemAction; //控件行为;UINT itemState; //控件状态;HWND hwndItem; //父窗口句柄或菜单句柄HDC hDC; //控件对应的绘图设备句柄RECT rcItem; //控件所占据的矩形区域DWORD itemData; //列表框或组合框中某一项的值}可以看出,上面的DRAWITEMSTRUCT结构包含了控件自绘时的各种信息。

其中,结构成员CtlType指定了控件的类型,其取值ODT_BUTTON表示按钮控件;ODT_COMBOBOX表示组合框控件;ODT_LISTBOX表示列表框控件;ODT_LISTVIEW表示列表视图控件;ODT_MENU菜单项;ODT_STATIC表示静态文本控件;ODT_TAB表示Tab控件。

免费菜谱空白模板

免费菜谱空白模板

竭诚为您提供优质文档/双击可除免费菜谱空白模板篇一:菜谱模板吉顺祥和菜单爆炒羊羔肉炒肉片板肠酸烂肉清炖鱼青椒炒肉洋葱炒肉葱花炒蛋青椒炒蛋肉类特色新疆大盘鸡48元55元/斤清炖羊羔肉48元/斤驴肉50元/斤肘子36元/斤红烧鱼28元/条烩驴肉热菜14元/份平茹炒肉14元/份蒜苔炒肉10元/份西红柿炒蛋10元/份鸡蛋木耳55元/斤50元/斤36元/斤28元/条20元/碗14元/份14元/份10元/份10元/份家常豆腐酸辣白菜酸菜粉条虎皮辣子10元/份6元/份6元/份6元/份东乡土豆片酸辣土豆丝茄辣西干煸豆角10元/份6元/份6元/份6元/份吉顺祥和菜单凉菜五香驴肉蒜香板肠青椒变蛋油炸花生米泡椒娃娃菜雪盖火山蒜泥豆角加工面烩面米饭26元/份26元/份8元/份8元/份6元/份6元/份6元/份面10元6元1元蒜泥肘子茄汁双豆凉拌金针菇蒜泥黄瓜洋葱木耳皮辣红食炒面白皮面花卷元/份8元/份8元/份6元/份6元/份6元/份8元2.5元0.5元18糁饭2元烫类紫菜蛋花汤西红柿蛋汤5元5元醪糟汤5元篇二:菜谱式样家常特色松滋鸡火锅68元砂锅蹄花38元鸿福烤鱼48元铁板牛肉32元重庆蕃茄鱼干锅杏鲍菇干锅千页豆腐干锅花菜手撕包菜鱼香肉丝青椒肉丝爆猪肝三丝牛肚爆炒顺风香煎大白刁水煮鱼片铁锅江鲢48元28元20元18元12元20元20元18元28元28元38元28元38元铁板鲜香菇山椒鱼头王酱椒金针菇口味山药口味黑木耳农家小炒肉回锅牛肉外婆菜螺丝肉青椒回锅肉爆腌武昌鱼红烧鱼块水煮肉片干炒肥肠28元48元22元20元18元22元38元26元22元26元20元28元28元凉菜类凉拌毛豆18元山椒黑木耳16元凉拌皮蛋12元呛生菜12元香菜拌牛肉西湖醉鱼油淋茄子清炒竹叶菜酸辣包菜虎皮青椒土鸡汤排骨汤30元18元田园16元12元12元16元汤38元32元醋。

自绘菜单开发示例

自绘菜单开发示例
class CBitmapMenu : public CMenu
{ ห้องสมุดไป่ตู้
public:
CBitmapMenu();
public:
protected:
CBitmap * m_pBitmaps;//声明一个为图指针
public:
public:
virtual ~CBitmapMenu();
//用于添加位图成员
void AppendBitmapMenuItem(UINT nID);
protected:
};
6。在单击Project菜单,执行Add To Project子菜单
中的New命令。选择C++Source File选项,然后在File
编辑框中键入BitmapMenu,单击OK,加如下代码:
1.创建一个单文档项目OwnerDraw
2.添加菜单和位图:双击:IDR_MAINFRAME,加两个菜单项
OwnerDraw,Bitmaps,
3.用ctrl+r添加四个位图资源,ID分别为IDB_BLACK,
IDB_GREEN,IDB_RED,IDB_BLUE 语言为English(U.S)
#endif
/////////////////////////////////////////////////////////////////////////////
// CBitmapMenu
CBitmapMenu::CBitmapMenu()
{
//开辟四个位图空间
m_pBitmaps = new CBitmap[4];
pMenuBar = GetMenu();

MFC标题栏及边框的自绘

MFC标题栏及边框的自绘

SDI 和MDI 程序中对非客户区(标题栏、左右下边界)的美化基本思路是重载CMainFrame 类的DefWindowProc()函数,并判断消息为:WM_NCPAINT,WM_NCACTIV A TE,WM_NOTIFY的时候,调用自己的绘制窗口标题栏的函数。

用GetSystemMetrics(SM_CSFRAME)和GetSystemMetrics(SM_CYFRAME)可以取得标题栏的左上角的坐标。

最大化,最小化的按钮自己画,如果不是在标准的位置,一定要记录下他们的位置,并且在WM_NCLBUTTONDOWN消息处理函数中判断是否是点击了按钮,以做出相应的处理。

系统图标也可以自己重新画。

主要任务有贴图(包括标题栏、左边界、右边界、下边界、系统图标、最大化、最小化、关闭按钮)、处理消息(屏蔽系统自带按钮、双击状态栏改变大小、鼠标停放在三个自绘按钮上时改变按钮图标、单击自绘按钮时作出相应反应)。

一、响应的消息及重载的函数响应的消息及重载的函数都在CMainFrame 类中。

响应DefWindowProc 函数,在其中判断消息是不是WM_NCPAINT、WM_MOVE、WM_NCACTIV A TE、WM_NOTIFY,若是则重画标题栏、左框架、右框架、下框架、最大化、最小化、关闭按钮(放在一个函数里)。

响应消息WM_NCHITTEST,使鼠标位于自绘按钮时返回相应hittest 值,同时屏蔽自带按钮的鼠标事件。

简言之,当鼠标位于自绘按钮时,让系统误以为鼠标位于相应按钮,而当鼠标位于系统自带按钮时,让系统误以为鼠标只是位于标题栏。

自绘图标与之类似,不再赘述。

响应消息WM_NCMOUSEMOVE,判断光标是不是位于自绘最大化、最小化、关闭按钮区域,如是则重画相应的按钮。

响应消息WM_NCLBUTTONDOWN,判断单击左键时鼠标是否位于自绘制的最大化、最小化、关闭按钮或图标区域,如是则执行相应的按钮操作。

光盘使用说明

光盘使用说明

书名:VC++就业培训宝典之MFC视频教程出版者:机械工业出版社著作者:吕鑫编光盘制作:吕鑫责任编辑:李绍坤书号:ISBN 978-7-111-46378-8盘号:ISBN 978-7-89405-343-5【运行环境】:Windows 2000/XP/2003/Vista/7操作系统【内容简介】:配套光盘中提供的主要内容包括两部分:教学视频和相关资料。

所有教学视频全部按章节存放在Videos目录下,其他包括图片等资料全部存放在Others目录下。

教学视频的主要内容如下:第1章 Visual C++ 6.0 安装和使用Visual C++ 6.0 IDE环境介绍,即开发和调试环境介绍。

VC开发环境,讲解如何新建工程、关闭工程和打开工程等,编写代码并编译生成可执行文件,讲解程序运行和测试的方法。

VC调试环境,讲解如何进入调试状态和如何进行程序跟踪,并介绍与调试相关的工具栏和变量观测窗口。

第2章 Windows编程基础使用Win32和MFC两种方式讲解简单Windows软件开发的方法。

Win32程序开发包括Win32程序编写、图标资源加载和对话框资源加载等。

介绍Windows 开发中常用的数据类型,包括Windows数据类型和MFC封装的数据类型。

第3章 MFC原理介绍包括C++封装原理和MFC六大关键技术,以及类向导和MFC应用程序向导的使用方法。

讲解MFC消息映射机制的原理、消息映射函数的建立,以及消息发送和接收的方法。

第4章对话框程序讲解模式对话框和非模式对话框的区别和调用方法,介绍对话框的关闭过程和常用回调函数。

总体介绍MFC类库内容,讲解其中最重要的两大类库内部成员函数的功能。

第5章对话框组合讲解登录对话框与主对话框的组合、权限管理与登录对话框的组合以及数据录入对话框的组合等。

介绍系统对话框的分类,以及CFile类和CDialog类的功能。

第6章基础控件介绍Windows基础控件和常用的控件类CListCtrl常用成员,包括CComboBox类、CEdit类和CButton类等。

【计算机工程与设计】_简化_期刊发文热词逐年推荐_20140727

【计算机工程与设计】_简化_期刊发文热词逐年推荐_20140727

107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
科研热词 网格简化 粗糙集 消息机制 多线程 驱动 飞机外形 面片收缩 非接触测量 集群计算 阵列声波 阴影 配置 通用网关接口 通信 逐帧 过滤规则 边重要度 边收缩 边折叠 软件质量方案 软件质量 路由报头 路由器 路径 距离倒数加权法 足球机器人 超文本传输协议1.1 语音识别 语谱图 诊断规则 诊断 计算机辅助设计 计算机视觉 角点检测 蓝牙 自绘菜单 脉宽调制 聚芯2000 网页推荐 网络通信 网络服务 网络日志 网络安全 网络图 网格服务 网格工作流 网格 编码器 绩效考核 绩效管理 绩效模型 绘制算法
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
推荐指数 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
2009年 序号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52

画狐内置菜单

画狐内置菜单

画狐内置菜单摘要:一、画狐内置菜单简介1.画狐内置菜单的定义2.画狐内置菜单的作用二、画狐内置菜单的内容1.菜单的分类a.文件菜单b.编辑菜单c.视图菜单d.插入菜单e.格式菜单f.工具菜单g.帮助菜单2.菜单的具体功能a.新建画布b.打开画布c.保存画布d.另存为e.关闭画布f.撤销g.重做h.剪切i.复制j.粘贴k.选择全部l.查找m.替换n.打印o.设置p.帮助三、画狐内置菜单的使用技巧1.快捷键的使用2.菜单栏的隐藏与显示3.个性化设置菜单正文:画狐内置菜单是画狐绘画软件中一个重要的组成部分,它为用户提供了丰富的功能选项,使得用户能够更加高效地进行绘画创作。

接下来,我们将详细介绍画狐内置菜单的内容和使用技巧。

一、画狐内置菜单简介画狐内置菜单是画狐绘画软件中一个集成化的功能列表,它包含了文件、编辑、视图、插入、格式、工具和帮助七个大类,共计几十种功能。

用户可以通过菜单栏或快捷键轻松调用这些功能,从而实现对画布的操作和编辑。

二、画狐内置菜单的内容1.菜单的分类画狐内置菜单分为七大类,分别是文件、编辑、视图、插入、格式、工具和帮助。

(1) 文件菜单:主要包括新建画布、打开画布、保存画布、另存为、关闭画布等功能。

(2) 编辑菜单:主要包括撤销、重做、剪切、复制、粘贴、选择全部等功能。

(3) 视图菜单:主要包括查找、替换、打印、设置等功能。

(4) 插入菜单:主要包括剪贴画、图片、文字、符号等功能。

(5) 格式菜单:主要包括字体、颜色、大小、对齐方式等功能。

(6) 工具菜单:主要包括选择工具、画笔、橡皮擦、填充等功能。

(7) 帮助菜单:主要包括软件帮助、关于我们等功能。

2.菜单的具体功能画狐内置菜单中包含了许多实用的功能,用户可以通过这些功能实现对画布的各种操作。

例如,用户可以通过“新建画布”功能创建一个新的画布,通过“打开画布”功能打开已有的画布,通过“保存画布”功能保存当前画布等。

三、画狐内置菜单的使用技巧1.快捷键的使用:画狐内置菜单中的许多功能都提供了快捷键,用户可以通过熟练掌握这些快捷键,实现快速操作。

MFC菜单栏下拉菜单图片设置

MFC菜单栏下拉菜单图片设置

VC MFC菜单栏(CMenu)控件 (2011-07-02 12:49)分类:C++菜单栏在对话框窗口里显示菜单栏像工具栏一样,菜单栏在按件面板里没有对应的选项,但有一个菜单控件类CMenu,所以如果想要在对话框里显示菜单栏,就得像工具栏那样,到ResourceView选项卡里新建一个菜单栏资源,步骤跟新建工具栏资源一样,只是资源类型是:Menu,菜单资源设计如下图:如果想改菜单项文本内容的话,方法是右击要更改的菜单项,选择属性,接着会弹出这样一个对话框:上面那个ID项就是该菜单项对应的ID号了,添加菜单项单击消息处理函数时会用到,而标明项里的内容就是菜单项要显示的文本了。

这里还得注意一下“弹出”这个选项,勾上这个选项表明对应的菜单项还有下级菜单,如:上面“转到”这个菜单项具有弹出属性,有下级菜单设计好了菜单资源,接着我们就来在对话框显示菜单栏吧,方法是进入对话框编辑区,右击对话框界面,选择属性,然后在菜单项里选择菜单资源ID号,回车,编译,运行,效果如下图:当然还有第二种在对话框显示菜单的方法:调用SetMenu函数把菜单跟对话框关联起来,函数第一个参数是窗口句柄,第二个参数是菜单句柄。

在OnInitDialog函数里添加如下语句:CMenu menu;//定义一个菜单类变量menu.LoadMenu(IDR_MENU1);//装载IDR_MENU1菜单资源SetMenu(&menu);//和当前窗口关联起来menu.Detach();//分离如果要处理菜单项单击消息的话,方法跟处理工具栏项单击消息一样,进入类向导,找到对应的菜单项ID,为它添加COMMAND消息处理函数。

设置菜单左边显示位图和背景位图CMenu类里要了解的函数SetMenuItemBitmaps//设置菜单项左边的位图函数定义:BOOL SetMenuItemBitmaps( UINT nPosition, UINT nFlags, const CBitmap* pBmpUnchecked, const CBitmap* pBmpChecked );nPostion指明具体要设置的菜单项,可以是菜单项索引,菜单项ID,具体由nFlags参数指明,为MF_BYPOSITION,则以菜单项索引指明,为MF_BYCOMMAND则第一个参数nPosition是菜单项ID号。

【计算机工程与设计】_绘制_期刊发文热词逐年推荐_20140726

【计算机工程与设计】_绘制_期刊发文热词逐年推荐_20140726

推荐指数 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
2009年 序号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
数值仿真 散乱点 教据交换 接口 扫描昆虫雷达 悬臂梁模型 快速绘制 异构数据源 开区域 并行绘制 带权图 实时渲染 头发建模 基于图像绘制 块结构 场景图 地质剖面图 地理信息系统 地形绘制 地形分块 图形处理器 图像融合 图像分割 变形 压力分布特征指标 即时渲染 动态 分层模型 光线跟踪 元球 任务调度 人体体表压力分布 二维轮廓线 三角网 三角化 三角剖分 三角函数 三维重建 三维网络仿真虚拟实验室 三维引擎 三维可视化 voronoi图 virtools opengl open min-min算法 mc算法 inventor hsv色彩空间 gpu geofusion clifford傅立叶变换 b样条 3ds文件
模型简化 检测概率 最小生成树 无线传感器网络 无处可微连续函数 数据采集 数据结构 振动时效 快速傅里叶变换 微软excel软件 形状过渡 弹性自适应二端布线算法 平均平面 幅值谱 层次细节简化 层次细节 定位计算 大规模场景 多线程 多层次细节模型 外存调度 基于预测的压缩 基于点的绘制 图表空间 图表 图线 图形绘制 可视化编辑 可视化 可编程图形处理器 可扩展标准语言 即时渲染 医学图像 包围盒 动态更新 八叉树 光线投射算法 元器件 像素 体纹理 人工干预 交互式漫游 互功率谱 二次曲面 三角形面片 三角剖分 三维可视化 vb编程 truetype shear-warp算法 opencv impostor技术 hook gdi+

【计算机工程与设计】_复杂性_期刊发文热词逐年推荐_20140726

【计算机工程与设计】_复杂性_期刊发文热词逐年推荐_20140726
2008年 序号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
变异算子 原子需求-上下文矩阵 动态优化 办公自动化系统 前馈神经网络 切割调度 分辨关系 分类 分界点 分支裁剪法 分布式 分层结构 分割攻击 函数逼近 决策表 决策树 决策协调度 关联检索 信息系统 体系结构 伪随机序列 企业资源计划 代码cache 产品线需求 交互协同 事务模型 串行化顺序 丢失数据 上下文感知计算 上下文 三角形面片 三维重构 wleb服务 web filter uml状态图 smart home n元非合作模型 logistic映射 linux kl散度 hook hibernate gibbs取样 freebsd ddr接口 cache组 bp学习算法 api
消链 流媒体 泛在网络 汉字属性 正交频分复用技术 模型驱动架构 模型检查 检索 案件推理 框架 极大一致链 有限状态机 最大流 无证书公钥密码 故障树自动生成 拓扑感知 形式化验证 带宽分配 嵌入式实时操作系统 峰均功率比 层次模型 密钥管理 密钥更新 密度聚类 实时进程 安全证明 安全模型 安全性 安全多方计算 子空间聚类 多代理系统 多主体系统 多agent 复杂适应系统 复杂网络 复杂性 复杂度 基于角色访问控制模型 因果模型 命令模式 命令执行器 命令总线 可靠性 可达矩阵 可定制 句柄 双向选择优先 协议 医学图像分类器 医学mir图像 加油站卡系统111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

菜单设计与制作

菜单设计与制作

计划期内收入指标 平均消费额 座位数 座位周转率 每日餐数 期内天数
课堂练习7-1
某餐厅的月经营利润指标为93000元,预计食品饮 料成本率为38%,营业费用率约为33%,营业税 为5%。餐厅有150个餐位,每日供应午餐和晚餐, 每餐的座位周转率预计为1.2,请计算要达到利润 指标该餐厅每位客人的人均消费额计划指标是多少?
菜单价格的确定
1、餐饮产品价格的特点 小批量生产——生产加工费用 直接对客服务——人工成本
价格构成
原材料成本 加工人工费用 服务人工费用 营业费用及税金 营业利润
菜单价格的确定
2、餐饮定价目标 (1)以经营利润为定价目标
收入指标 目标利润 原料成本 经营费用 营业税金
座位周转率 客人平均消费额(P239、7)
常用菜单的种类
1、零点菜单 类别多(早茶、中餐、晚餐、消夜等) 菜品品种多 一般都会分类,便于查找 搭配平衡(品种、原料、烹调法、价格) 特色菜的重要地位
常用菜单的种类
2、套菜菜单 普通套菜单 团体套菜单
讲究实惠、菜单的档次和数量要合适
宴会菜单
讲究外形美观、做工精细、体面和氛围 菜肴名称要好听顺口、寓意恰当
餐饮月收入指标 =月利润指标 / (1-原材料成本率-营业费用率-营业税率) =93000 /(1-38%-33%-5%)=387500元 客人平均消费额指标 =计划期餐饮收入指标 /(座位数*座位周转率*每日餐数*期内天数) =387500 /(150*1.2*2*30)=35.88元
菜单价格的确定
(三)告示性信息
• 1.餐厅名字、企业名称、标志或商标记号。 2.餐厅地址、联系电话或预订电话。 • 3.经营时间。 • 4.餐厅的发展历史、规模与特点 • 5.餐厅加收的费用

菜单的设计与制作

菜单的设计与制作

第三章菜单的设计与制作教学设计:在学生已具备一定餐饮服务知识的基础上,从餐饮销售的角度培养学生餐饮管理的意识和能力,使其掌握一定的销售技巧和方法,并具备现代餐饮经营创新理念。

通过课外信息搜集、课堂研究分析;教师讲解示例、学生创新设计等自主式、探究式教学,全面提升学生的专业素质。

第一节菜单的重要性教学目标:了解菜单及其重要性。

教学重点:重要性。

教学方法:多媒体辅助教学方法、图片展示、学生的分组思考讨论法、启发式教学方法。

教具准备多媒体、教学课件、各式菜单。

课时安排:0.5课时教学过程A、组织教学B、讲授新课一、菜单的定义菜单是饭店餐厅提供商品的目录。

是餐厅餐饮产品销售的品种、说明和价格的一览表,在餐厅的经营和销售中起着重要作用。

二、菜单的重要性:(一)菜单是饭店餐饮部门一切活动的总纲1、是餐饮部门选择、购置餐饮设备的依据和指南生产制作不同风味的菜点,需要有不同规模、类型的厨房设备。

餐饮企业选择购置设备、炊具、工具和餐具,无论是它们的种类、规格还是质量、数量,都取决于菜单的菜式品种、水平和特色。

2、菜单决定厨师及服务人员的技术水平和人数菜单内容标志着餐饮服务的规格水平和风格特色,而要实现这些规格水平和风格特色,还必须通过厨房烹调和餐厅服务。

菜单除决定职工的技术水平要求以外,还决定职工的工种和人数。

中、西餐兼备的菜单,各派名菜荟集的菜单,必然要求餐饮企业拥有一支庞大的、技术全面的职工队伍。

3、菜单决定了食品原料采购和储藏工作的对象菜单内容规定了采购和贮藏工作的对象,菜单类型在一定程度上决定着采购和贮藏活动的规模、方法和要求。

4、菜单支配着所供应的膳食营养的含量5、决定了餐饮成本的高低菜单在体现餐饮服务规格水平、风格特色的同时,也决定了企业餐饮成本的高低。

6、影响厨房布局及餐厅室内装修和设计厨房布局和餐厅装饰也同样受到菜单内容的影响。

厨房是加工制作餐饮实物的场所,厨房内各业务操作中心的选址,各种设备、器械、工具的定位,应当以适合既定菜单内容的加工制作需要为准则。

MFC自绘按钮的实现

MFC自绘按钮的实现

如果你希望能够在自己的程序中表现出新意,那么你一定不会仅仅满足于MFC提供那些标准控件。

这时,我们就必须自己另外多做些工作了。

就改变控件外观这一点来说,主要是利用控件的自绘功能(Owner Draw)实现的。

本篇将和各位一起定义一个XP风格的CXPButton 按钮类,目的不在于介绍CXPButton类的使用技巧,而在于向各位阐述实现自绘按钮的方法。

当然如果你觉得CXPButton有用的话,也可以把它的源文件保存下来,直接加入到自己的项目中。

本篇要点:一、准备工作二、实现原理及难点三、按钮类的使用四、小结与提示五、附录一、准备工作在开始编码之前,首先应该确定好,更准确的说应该是设计好按钮在各种状态下的外观。

按钮控件的几中基本状态包括:Normal状态,就是按钮一开始显示时的样子。

Over状态,鼠标指针移动到按钮上面时按钮显示的样子。

Down状态,按下按钮时显示的样子。

Focus状态,按钮按下后松开的样子,例如标准按钮按下松开之后会看到按钮内部有一个虚线框。

Disable状态,当然就是按钮被设置成无效的时候的样子啦。

我参考了一下WindowsXP中普通按钮的实际样子,设计出XP按钮各种状态的外观,如下图所示:至于Down状态主要是在Over状态的基础上将文字往右下的方向稍微平移,以实现下压的效果。

二、实现原理及难点下面我们开始类的创建,在Workspace的ClassV iew页中右击列表树的根结点,选择New Class…在弹出窗口中进行派生类的定义,如下图所示,注意,你需要填写的只有Name和Base class 两项,其余的选项保持默认值就可以了。

按OK按钮退出之后,我们可以在ClassView里面看到新创建的类的名字。

接下来我们可以为CXPButton类添加各种成员变量。

因为自绘控件说穿了就是画图,所以在成员变量中可以看到各种与画图有关的数据类型,一般来说成员变量会在类的构造函数中初始化,在类的析构函数中销毁。

菜单设计

菜单设计

5.1.1 菜单生成的基本步骤
(2)菜单的打开 “文件”菜单“打开”命令→在打开对话框的 文件类型组合框选定“菜单”选项→在文件列表选定 某菜单文件→按“确定”按钮→出现菜单设计器窗口 文件名为新名称时为 或快捷菜单设计器窗口
2、用命令建立或打开
MODIFY MENU <文件名>
建立,否则为打开
菜单文件扩展名为.MNX,此处准许缺省
三、“选项”列
每个菜单行都有一个无符号按钮,如下所示
无符号按钮
按动该按钮,提示选项对话框,定义菜单项的附加功能
快捷键 定义, 光标定 位该框, 按组合 键即可
定义菜单项 跳过条件, 当其为真, 则该菜单项 以浅色显示
设置菜 单项说 明信息, 但必须 用引号 括起来
5.1.4
“显示”菜单的命令
菜单设计器打开后, “显示”菜单增加两条命令
5.1.3
菜单设计器窗口
下级菜单到上级 菜单的切换
菜单列表框,一个 菜单项占一行
插入菜单项 删除菜单项 菜单模拟显示
5.1.3
菜单设计器窗口
一、“菜单名称”列 输入菜单项名称,该名称只用来显示。 可定义访问键,格式为(\<字母),只要按下访问键 就执行菜单项功能。 访问键为Alt+ <字母> 二、“结果”列 定义菜单的性质,分为如下4个选项 1、命令 为菜单项定义一条动作命令,命令输入到其右边的文 本框 2、过程 为菜单项定义一条动作过程,该过程可在按“创建” 或“编辑”按钮后呈现的文本框内输入。
运行后如图所示
[P172 例5-5]
clear m='' && 用来存储选项序列 define popup jj from 5,5 multiselect ; margin title ‘四季月份’ * 定义多选型弹出菜单选项 define bar 1 of jj prompt '春' define bar 2 of jj prompt '夏' define bar 3 of jj prompt '秋' define bar 4 of jj prompt '冬' on selection popup jj do xz * 过程被所有选项共用 activate popup jj

剖析QMenuQt完全定制化菜单

剖析QMenuQt完全定制化菜单

剖析QMenuQt完全定制化菜单贴张效果图:定制包括:1. 周边阴影2. 菜单项的元素(分割符, 控制ICON⼤⼩, ⽂字显⽰位置与颜⾊, ⼦菜单指⽰符)菜单内的效果, 部分可以使⽤stylesheet实现, 但要做到这样的定制化, stylesheet是做不到的下⾯介绍如何实现这些效果:1. 实现阴影效果默认的Qt菜单QMenu的效果是这样的1) ⾸先需要去除下拉阴影(Drop shadow)Qt的菜单是继承QWidget然后⾃绘的, dropshadow不属于⾃绘范围, 是windows popup类型窗⼝默认的样式, ⽆法通过正常途径去除可以从源码中看到调⽤过程⼤概是这样:qmenu::popup -> qwidget::show() -> QWidgetPrivate::show_helper() -> show_sys();⽽这时候, 还未调⽤qmenu::paintevent⽽且不能去除QMenu的Popup 属性, 因为QMenu的实现依赖Popup属性, 例如: QMenuPrivate::activateAction中使⽤QApplication::activePopupWidget()函数在windows平台下:menu.h#ifndef MENU_H#define MENU_H#include <QMenu>class Menu : public QMenu{Q_OBJECTpublic:explicit Menu(QWidget *parent = 0);explicit Menu(const QString & title);protected:virtual bool event(QEvent *event);signals:public slots:};#endif // MENU_Hmenu.cpp#include "menu.h"Menu::Menu(QWidget *parent) :QMenu(parent){}Menu::Menu(const QString &title) :QMenu(title){}bool Menu::event(QEvent *event){static bool class_amended = false;if (event->type() == QEvent::WinIdChange){HWND hwnd = reinterpret_cast<HWND>(winId());if (class_amended == false){class_amended = true;DWORD class_style = ::GetClassLong(hwnd, GCL_STYLE);class_style &= ~CS_DROPSHADOW;::SetClassLong(hwnd, GCL_STYLE, class_style);}}return QWidget::event(event);}⼤概思路是: 在event中截获QEvent::WinIdChange事件, 然后获得窗⼝handle, 使⽤GetClassLong / SetClassLong去除CS_DROPSHADOW flags, 即可去除阴影2) 使⽤dwm实现环绕阴影优点:系统内置⽀持缺点: 仅在vista以上并开启aero特效的情况, 使菜单有阴影环绕.#pragma comment( lib, "dwmapi.lib" )#include "dwmapi.h"bool Menu::event(QEvent *event){static bool class_amended = false;if (event->type() == QEvent::WinIdChange){HWND hwnd = reinterpret_cast<HWND>(winId());if (class_amended == false){class_amended = true;DWORD class_style = ::GetClassLong(hwnd, GCL_STYLE);class_style &= ~CS_DROPSHADOW;::SetClassLong(hwnd, GCL_STYLE, class_style);}DWMNCRENDERINGPOLICY val = DWMNCRP_ENABLED;::DwmSetWindowAttribute(hwnd, DWMWA_NCRENDERING_POLICY, &val, sizeof(DWMNCRENDERINGPOLICY));// This will turn OFF the shadow// MARGINS m = {0};// This will turn ON the shadowMARGINS m = {-1};HRESULT hr = ::DwmExtendFrameIntoClientArea(hwnd, &m);if( SUCCEEDED(hr) ){//do more things}}return QWidget::event(event);}简单地修改⼀下event的实现即可3) ⼿动绘制阴影1. CCustomMenu 继承 QMenuvoid CCustomMenu::_Init(){// 必须设置popup, 因为QMenuPrivate::activateAction中使⽤QApplication::activePopupWidget()函数this->setWindowFlags(Qt::Popup | Qt::FramelessWindowHint);this->setAttribute(Qt::WA_TranslucentBackground);this->setObjectName("CustomMenu"); // 以objectname 区分Qt内置菜单和CCustomMenu}设置菜单背景透明objectname是为了在绘制时区分不同风格的菜单(⽐如原⽣Qmenu与CCustomMenu或者其他CCustomMenu2等)2. 实现CCustomStyle (参考Qt的源码 QFusionStyle)CCustomStyle继承⾃QProxyStyle, Qt控件中的基础元素都是通过style控制, style⽐stylesheet更底层, 可以做到更精细的控制/**@brief 定制菜单style@author lwh*/class CCustomStyle : public QProxyStyle{Q_OBJECTpublic:CCustomStyle(QStyle *style = 0);void drawControl(ControlElement control, const QStyleOption *option,QPainter *painter, const QWidget *widget) const;void drawPrimitive(PrimitiveElement element, const QStyleOption *option,QPainter *painter, const QWidget *widget) const;int pixelMetric ( PixelMetric pm, const QStyleOption * opt, const QWidget * widget) const;private:void _DrawMenuItem(const QStyleOption *option,QPainter *painter, const QWidget *widget) const;QPixmap _pixShadow ; //阴影图⽚};⾸先需要调整菜单项与边框的距离, ⽤于绘制阴影在pixelMetric 中添加if(pm == PM_MenuPanelWidth)return6; // 调整边框宽度, 以绘制阴影pixelMetric 中描述了像素公制可取的⼀些值,⼀个像素公制值是单个像素在样式中表现的尺⼨.然后再drawPrimitive实现阴影绘制void CCustomStyle::drawPrimitive( PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget ) const{if(element == PE_FrameMenu){painter->save();{if(_pixShadow.isNull()|| widget->objectName() != "CustomMenu") // fix bug: Qt的内置菜单显⽰不正常(如TextEdit右键菜单){painter->restore();return __super::drawPrimitive(element, option, painter, widget);}QSize szThis = option->rect.size();QPixmap pixShadowBg = _DrawNinePatch(szThis, _pixShadow);painter->drawPixmap(option->rect, pixShadowBg);}painter->restore();return;}__super::drawPrimitive(element, option, painter, widget);}QStyle::PE_FrameMenu Frame for popup windows/menus; see also QMenu.注意: 绘制完直接return_DrawNinePatch是以九宫格形式绘制, 将这样⼀张⼩的阴影图绘制到窗⼝时, 如果直接拉伸, 会变得⾮常模糊.⽽九宫格形式可以绘制出相对漂亮的背景, 这种技巧同样可以应⽤在其他控件上.const QPixmap _DrawNinePatch( QSize szDst, const QPixmap &srcPix ){// 绘制背景图到, 以九宫格形式QPixmap dstPix(szDst);dstPix.fill(QColor(255, 255, 255, 0));QPainter painter;painter.begin(&dstPix);int nW = szDst.width();int nH = szDst.height();int nWBg = srcPix.width();int nHBg = srcPix.height();QPoint m_ptBgLT(10, 10);QPoint m_ptBgRB(19, 19);QPoint ptDstLT(m_ptBgLT.x(), m_ptBgLT.y());QPoint ptDstRB(nW-(nWBg-m_ptBgRB.x()), nH-(nHBg-m_ptBgRB.y()));//LTpainter.drawPixmap(QRect(0,0,ptDstLT.x(), ptDstLT.y()), srcPix, QRect(0,0,m_ptBgLT.x(), m_ptBgLT.y()));//MTpainter.drawPixmap(QRect(ptDstLT.x(),0, ptDstRB.x()-ptDstLT.x(), ptDstLT.y()), srcPix, QRect(m_ptBgLT.x(),0,m_ptBgRB.x()-m_ptBgLT.x(), m_ptBgLT.y()));//RTpainter.drawPixmap(QRect(ptDstRB.x(),0,nW-ptDstRB.x(), ptDstLT.y()), srcPix, QRect(m_ptBgRB.x(),0,nWBg-m_ptBgRB.x(), m_ptBgLT.y()));//LMpainter.drawPixmap(QRect(0,ptDstLT.y(),ptDstLT.x(), ptDstRB.y()-ptDstLT.y()), srcPix, QRect(0,m_ptBgLT.y(),m_ptBgLT.x(), m_ptBgRB.y()-m_ptBgLT.y()));//MMpainter.drawPixmap(QRect(ptDstLT.x(),ptDstLT.y(),ptDstRB.x()-ptDstLT.x(), ptDstRB.y()-ptDstLT.y()), srcPix, QRect(m_ptBgLT.x(),m_ptBgLT.y(),m_ptBgRB.x()-m_ptBgLT.x(), m_ptBgRB.y()-m_ptBgLT.y())); //RMpainter.drawPixmap(QRect(ptDstRB.x(),ptDstLT.y(), nW-ptDstRB.x(), ptDstRB.y()-ptDstLT.y()), srcPix, QRect(m_ptBgRB.x(),m_ptBgLT.y(), nWBg-m_ptBgRB.x(), m_ptBgRB.y()-m_ptBgLT.y()));//LBpainter.drawPixmap(QRect(0,ptDstRB.y(),ptDstLT.x(), nH-ptDstRB.y()), srcPix, QRect(0,m_ptBgRB.y(),m_ptBgLT.x(), nHBg-m_ptBgRB.y()));//MBpainter.drawPixmap(QRect(ptDstLT.x(),ptDstRB.y(),ptDstRB.x()-ptDstLT.x(), nH-ptDstRB.y()), srcPix, QRect(m_ptBgLT.x(),m_ptBgRB.y(),m_ptBgRB.x()-m_ptBgLT.x(), nHBg-m_ptBgRB.y()));//RBpainter.drawPixmap(QRect(ptDstRB.x(),ptDstRB.y(),nW-ptDstRB.x(), nH-ptDstRB.y()), srcPix, QRect(m_ptBgRB.x(),m_ptBgRB.y(),nWBg-m_ptBgRB.x(), nHBg-m_ptBgRB.y()));painter.end();return dstPix;}2. 绘制菜单项1) 控制ICON⼤⼩在pixelMetric中:if (pm == QStyle::PM_SmallIconSize)return12; //返回ICON的⼤⼩2) 绘制菜单项内容void CCustomStyle::drawControl( ControlElement control, const QStyleOption *option, QPainter *painter, const QWidget *widget ) const{switch(control ){case CE_MenuItem:{_DrawMenuItem(option, painter, widget);return; // 直接返回, 否则会被super::drawcontrol覆盖}}__super::drawControl(control, option, painter, widget);}1void CCustomStyle::_DrawMenuItem(const QStyleOption *option, QPainter *painter, const QWidget *widget ) const2 {3 painter->save();45if (const QStyleOptionMenuItem *menuItem = qstyleoption_cast<const QStyleOptionMenuItem *>(option))6 {7// 先绘制⼀层背景(否则在透明情况下, 会直接透过去);8 painter->setPen(colItemBg);9 painter->setBrush(colItemBg);10 painter->drawRect(option->rect);1112if (menuItem->menuItemType == QStyleOptionMenuItem::Separator) {13int w = 0;14if (!menuItem->text.isEmpty()) { // 绘制分隔符⽂字15 painter->setFont(menuItem->font);16 proxy()->drawItemText(painter, menuItem->rect.adjusted(5, 0, -5, 0), Qt::AlignLeft | Qt::AlignVCenter,17 menuItem->palette, menuItem->state & State_Enabled, menuItem->text,18 QPalette::Text);19 w = menuItem->fontMetrics.width(menuItem->text) + 5;20 }21 painter->setPen(colSeparator);22bool reverse = menuItem->direction == Qt::RightToLeft;23 painter->drawLine(menuItem->rect.left() + 5 + (reverse ? 0 : w), menuItem->rect.center().y(),24 menuItem->rect.right() - 5 - (reverse ? w : 0), menuItem->rect.center().y());25 painter->restore();26return;27 }28bool selected = menuItem->state & State_Selected && menuItem->state & State_Enabled;29if (selected) {30 QRect r = option->rect;31 painter->fillRect(r, colItemHighlight);32 }33bool checkable = menuItem->checkType != QStyleOptionMenuItem::NotCheckable;34bool checked = menuItem->checked;35bool sunken = menuItem->state & State_Sunken;36bool enabled = menuItem->state & State_Enabled;3738bool ignoreCheckMark = false;39int checkcol = qMax(menuItem->maxIconWidth, 20);4041if (qobject_cast<const QComboBox*>(widget))42 ignoreCheckMark = true; //ignore the checkmarks provided by the QComboMenuDelegate4344if (!ignoreCheckMark) {45// Check46 QRect checkRect(option->rect.left() + 7, option->rect.center().y() - 6, 14, 14);47 checkRect = visualRect(menuItem->direction, menuItem->rect, checkRect);48if (checkable) {49if (menuItem->checkType & QStyleOptionMenuItem::Exclusive) {50// Radio button 未实现51if (checked || sunken) {52/* painter->setRenderHint(QPainter::Antialiasing);53 painter->setPen(Qt::NoPen);5455 QPalette::ColorRole textRole = !enabled ? QPalette::Text:56 selected ? QPalette::HighlightedText : QPalette::ButtonText;57 painter->setBrush(option->palette.brush( option->palette.currentColorGroup(), textRole));58 painter->drawEllipse(checkRect.adjusted(4, 4, -4, -4));59*/60 }61 } else {62// Check box63if (menuItem->icon.isNull()) {64 QStyleOptionButton box;65 box.QStyleOption::operator=(*option);66 box.rect = checkRect;67if (checked)68 box.state |= State_On;69 proxy()->drawPrimitive(PE_IndicatorCheckBox, &box, painter, widget);7071 }72 }73 }74 } else { //ignore checkmark75if (menuItem->icon.isNull())76 checkcol = 0;77else78 checkcol = menuItem->maxIconWidth;79 }8081// Text and icon, ripped from windows style82bool dis = !(menuItem->state & State_Enabled);83bool act = menuItem->state & State_Selected;84const QStyleOption *opt = option;85const QStyleOptionMenuItem *menuitem = menuItem;8687 QPainter *p = painter;88 QRect vCheckRect = visualRect(opt->direction, menuitem->rect,89 QRect(menuitem->rect.x() + 4, menuitem->rect.y(),90 checkcol, menuitem->rect.height()));91if (!menuItem->icon.isNull()) {92 QIcon::Mode mode = dis ? QIcon::Disabled : QIcon::Normal;93if (act && !dis)94 mode = QIcon::Active;95 QPixmap pixmap;9697int smallIconSize = proxy()->pixelMetric(PM_SmallIconSize, option, widget);98 QSize iconSize(smallIconSize, smallIconSize);99if (const QComboBox *combo = qobject_cast<const QComboBox*>(widget))100 iconSize = combo->iconSize();101if (checked)102 pixmap = menuItem->icon.pixmap(iconSize, mode, QIcon::On);103else104 pixmap = menuItem->icon.pixmap(iconSize, mode);105106int pixw = pixmap.width();107int pixh = pixmap.height();108109 QRect pmr(0, 0, pixw, pixh);110 pmr.moveCenter(vCheckRect.center());111 painter->setPen(colText);//menuItem->palette.text().color()112if (checkable && checked) {113 QStyleOption opt = *option;114if (act) {115 QColor activeColor = mergedColors(116 colItemBg, //option->palette.background().color(),117 colItemHighlight // option->palette.highlight().color());118 );119 opt.palette.setBrush(QPalette::Button, activeColor);120 }121 opt.state |= State_Sunken;122 opt.rect = vCheckRect;123 proxy()->drawPrimitive(PE_PanelButtonCommand, &opt, painter, widget);124 }125 painter->drawPixmap(pmr.topLeft(), pixmap);126 }127if (selected) {128 painter->setPen(colText);//menuItem->palette.highlightedText().color()129 } else {130 painter->setPen(colText); //menuItem->palette.text().color()131 }132int x, y, w, h;133 menuitem->rect.getRect(&x, &y, &w, &h);134int tab = menuitem->tabWidth;135 QColor discol;136if (dis) {137 discol = colDisText; //menuitem->palette.text().color()138 p->setPen(discol);139 }140int xm = windowsItemFrame + checkcol + windowsItemHMargin + 2;141int xpos = menuitem->rect.x() + xm;142143 QRect textRect(xpos, y + windowsItemVMargin, w - xm - windowsRightBorder - tab + 1, h - 2 * windowsItemVMargin);144 QRect vTextRect = visualRect(opt->direction, menuitem->rect, textRect);145 QString s = menuitem->text;146if (!s.isEmpty()) { // draw text147 p->save();148int t = s.indexOf(QLatin1Char('\t'));149int text_flags = Qt::AlignVCenter | Qt::TextShowMnemonic | Qt::TextDontClip | Qt::TextSingleLine;150if (!__super::styleHint(SH_UnderlineShortcut, menuitem, widget))151 text_flags |= Qt::TextHideMnemonic;152 text_flags |= Qt::AlignLeft;153if (t >= 0) {154 QRect vShortcutRect = visualRect(opt->direction, menuitem->rect,155 QRect(textRect.topRight(), QPoint(menuitem->rect.right(), textRect.bottom())));156if (dis && !act && proxy()->styleHint(SH_EtchDisabledText, option, widget)) {157 p->setPen(colText);//menuitem->palette.light().color()158 p->drawText(vShortcutRect.adjusted(1, 1, 1, 1), text_flags, s.mid(t + 1));159 p->setPen(discol);160 }161 p->drawText(vShortcutRect, text_flags, s.mid(t + 1));162 s = s.left(t);163 }164 QFont font = menuitem->font;165// font may not have any "hard" flags set. We override166// the point size so that when it is resolved against the device, this font will win.167// This is mainly to handle cases where someone sets the font on the window168// and then the combo inherits it and passes it onward. At that point the resolve mask169// is very, very weak. This makes it stonger.170 font.setPointSizeF(QFontInfo(menuItem->font).pointSizeF());171172if (menuitem->menuItemType == QStyleOptionMenuItem::DefaultItem)173 font.setBold(true);174175 p->setFont(font);176if (dis && !act && proxy()->styleHint(SH_EtchDisabledText, option, widget)) {177 p->setPen(menuitem->palette.light().color());178 p->drawText(vTextRect.adjusted(1, 1, 1, 1), text_flags, s.left(t));179 p->setPen(discol);180 }181 p->drawText(vTextRect, text_flags, s.left(t));182 p->restore();183 }184185// Arrow 绘制⼦菜单指⽰符186if (menuItem->menuItemType == QStyleOptionMenuItem::SubMenu) {// draw sub menu arrow187int dim = (menuItem->rect.height() - 4) / 2;188 PrimitiveElement arrow;189 arrow = option->direction == Qt::RightToLeft ? PE_IndicatorArrowLeft : PE_IndicatorArrowRight;190int xpos = menuItem->rect.left() + menuItem->rect.width() - 3 - dim;191 QRect vSubMenuRect = visualRect(option->direction, menuItem->rect,192 QRect(xpos, menuItem->rect.top() + menuItem->rect.height() / 2 - dim / 2, dim, dim));193 QStyleOptionMenuItem newMI = *menuItem;194 newMI.rect = vSubMenuRect;195 newMI.state = !enabled ? State_None : State_Enabled;196if (selected)197 newMI.palette.setColor(QPalette::ButtonText, // 此处futionstyle 有误, QPalette::Foreground改为ButtonText198 colIndicatorArrow);//newMI.palette.highlightedText().color()199else200 newMI.palette.setColor(QPalette::ButtonText,201 colIndicatorArrow);202203 proxy()->drawPrimitive(arrow, &newMI, painter, widget);204 }205 }206 painter->restore();207 }_DrawMenuItem_DrawMenuItem的代码较长, 但⽐较简单, 都是⼀些条件判断加上绘图语句, 需要⾃⼰修改pallete的颜⾊值得注意的是: 在透明情况下, 应先绘制⼀层menu item 的背景, 否则会直接透过去3) 最后还要重写⼀下QMenu的addMenu以使⼦菜单也⽣效QAction * CCustomMenu::addMenu( CCustomMenu *menu ){return QMenu::addMenu(menu);}CCustomMenu * CCustomMenu::addMenu( const QString &title ){CCustomMenu *menu = new CCustomMenu(title, this);addAction(menu->menuAction());return menu;}CCustomMenu * CCustomMenu::addMenu( const QIcon &icon, const QString &title ){CCustomMenu *menu = new CCustomMenu(title, this);menu->setIcon(icon);addAction(menu->menuAction());return menu;}编译需要VS2010+Qt5.PS:关于QMenu如何处理菜单消失, 参考我的另⼀篇blog。

菜单详细制作教程一

菜单详细制作教程一

菜单一说明文档效果图:如下:今天我们来学习制作菜单一,菜单一是一种比较典型的菜单,各大网站用的都是这种菜单样式。

今天的教程我们一步步的来讲解。

先通过效果实现。

然后效果优化,添加特效一,效果实现第一步。

新建html页面,并且添加菜单,代码如下:<!DOCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN" "/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="/1999/xhtml"><head><title></title></head><body><div id="body_menuIndex"><ul id="body_menu_ul"><li><a href="#">站点首页</a></li><li><a href="/xiaowu668/article/article.jsp">各类文章</a><ul><li><a href='#'>JA V A文章</a><ul><li><a href='#'>J2SE文章</a></li><li><a href='#'>J2ME文章</a></li><li><a href='#'>J2EE文章</a><ul><li><a href='#'>JSP文章</a></li><li><a href='#'>SSH文章</a></li></ul></li></ul></li><li><a href='#'>文章</a></li><li><a href='#'>C++文章</a></li><li><a href='#'>VB文章</a></li><li><a href='#'>ASP文章</a></li><li><a href='#'>PHP文章</a></li><li><a href='#'>Delphi文章</a></li><li><a href='#'>其他文章</a></li></ul></li><li><a href="#">软件下载</a><ul><li><a href='#'>应用软件</a></li><li><a href='#'>系统软件</a></li><li><a href='#'>图形图像</a></li><li><a href='#'>多媒体类</a></li><li><a href='#'>行业软件</a></li><li><a href='#'>编程开发</a></li><li><a href='#'>编程开发</a></li><li><a href='#'>黑客软件</a></li></ul></li><li><a href="#">动画频道</a><ul><li><a href='#'>编程教程</a></li><li><a href='#'>其他教程</a></li></ul></li><li><a href="#">源码下载</a><ul><li><a href='#'>ASP源码</a></li><li><a href='#'>JSP源码</a></li><li><a href='#'>PHP源码</a></li><li><a href='#'>.NET源码</a></li><li><a href='#'>其他源码</a></li></ul></li><li><a href="#">模板下载</a></li><li><a href="#">我的相册</a></li></ul></div></body></html>显示效果:图1.1第二步:给<div id="body_menuIndex"> 添加边框效果:代码如下:#body_menuIndex{margin:0;padding:0;width:100%;height:25px;border:solid1px Red;border-width:5px1px1px;}显示效果:图1.2第三步:让菜单横着显示:添加代码如下:#body_menu_ul li{float: left;position: relative;}上面这个样式的意思是: #body_menu_ul下面所有的li元素都是向左停靠,所以下面的所有的li菜单都是横着的。

DRAWITEMSTRUCT

DRAWITEMSTRUCT

DRAWITEMSTRUCT来由:DRAWITEMSTRUCT 为需要自绘的控件或者菜单项提供了必要的信息。

在需要绘制的控件或者菜单项对应的WM_DRAWITEM消息函数中得到一个指向该结构的指针。

例子:virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); (.h中声明)void CColorButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)(.cpp中定义)这里LPDRAWITEMSTRUCT即指向DRAWITEMSTRUCT结构体的指针。

DRAWITEMSTRUCT结构的定义如下:typedef struct tagDRAWITEMSTRUCT {UINT CtlType;UINT CtlID;UINT itemID;UINT itemAction;UINT itemState;HWND hwndItem;HDC hDC;RECT rcItem;ULONG_PTR itemData;} DRAWITEMSTRUCT, NEAR *PDRAWITEMSTRUCT, FAR *LPDRAWITE MSTRUCT;结构成员:成员:CtlType指定了控件的类型,其取值如下表所示。

ODT_BUTTON:按钮控件ODT_COMBOBOX:组合框控件ODT_LISTBOX:列表框控件ODT_LISTVIEW:列表视图控件ODT_MENU:菜单项ODT_STATIC:静态文本控件ODT_TAB:Tab控件CtlID指定了自绘控件的ID值,而对于菜单项则不需要使用该成员itemID表示菜单项ID,也可以表示列表框或者组合框中某项的索引值。

对于一个空的列表框或组合框,该成员的值为–1。

这时应用程序只绘制焦点矩形(该矩形的坐标由rcItem 成员给出)虽然此时控件中没有需要显示的项,但是绘制焦点矩形还是很有必要的,因为这样做能够提示用户该控件是否具有输入焦点。

申请软件著作权时的软件说明书模版资料-共17页

申请软件著作权时的软件说明书模版资料-共17页

多媒体教学绘图软件说明申请人:深圳市中教通集成科技××公司2011 年11 月11 日一软件功能简介二通迅流程图三主类及类结构图四笔的状态检测软件说明五设计总结和理念软件功能简介电子白板通过与电脑、投影机组成交互式演示系统,配套电子笔完全代替鼠标,直接操控电脑。

电脑的一切操作均可在电子白板上实现并同步显示,在电子白板上的操作也均可在电脑上同步显示,并可存储打印,该方案采用电子白板的主流技术——电磁感应技术,产品具有响应速度快、定位精度高、操作准确、环境适应性强、维护成本低等优点。

该软件是一款专门针对教育的多媒体教学软件,用来管理各种工具,包括聚光灯,键盘,文本,直尺,圆规,量角器等,为各学科教师及学生提供最大程度的简易教学.软件主要功能如下:提供新建文件,打开文件,保存及导出文件等功能,可打开各种图像文件及PPT文件,可导出PPT,PDF,SWF 等文件。

提供语言切换等功能。

新建各种板页,包括黑板页,白板页,蓝板页等。

提供索引页显示及删除页面等功能。

选择各种画笔。

变通笔,软笔,书法笔,曲线笔,多线条笔等。

粗, 中, 细, 自定义笔宽.实线,点线,点划线等。

提供各种几何图形的绘制。

三角形,四边形,梯形,及其它图形的绘制提供对象擦除及将笔线条打断的功能。

提供音视频录制,FLASH 播放等功能提供三角板,圆规,直尺,量角器等数学工具提供文本,键盘,聚光灯,放大镜等工具提供Windows 与软件的切换按钮。

将屏幕书写与对电脑的鼠标操作全而为一的一种功能。

硬笔: 提供最真实的线笔书写软笔: 提供根据方位变幻的书写笔纹理笔: 以图片纹理为笔背景,进行书写。

荧光笔:带有透明度的笔。

橡皮: 擦除对象选择: 选择对象填充: 填充对象放大: 放大页面数据缩小: 缩小页面数据清空: 清空当前页面前一页: 翻转到前一页后一页: 进入到下一页资源库:提供对各种教学资源的利用。

包括各种教学图片,FLASH ,PPT 等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

自绘菜单在这里提供一个C++类(CCustomMenu),该类是CMenu的子类,并且拥有自绘能力。

它可以向你提供以下的功能:设置字体颜色。

设置高亮度颜色。

设置高亮度时的风格。

设置选中时和在普通状态下的菜单显示的图标。

设置显示图标大小。

在CCustomMenu中定义了结构MENUDATA,你必须根据你的需要填充该结构,并且在增加菜单时提供该结构的指针(调用AppendMenu,InsertMenu)。

下面是一个例子:1、定义CCustomMenu的实例,和MENUDATA结构变量。

CCustomMenum_cCustomMenu;MENUDATA menuData [8]; // as many menu items are present , You should be able to use//new and do the same2、调用CreateMenu()设置有关参数。

m_customMenu.CreateMenu ();m_customMenu.SetIconSize (25,25); //This is to set the size of the Icon.// This should be used only once for any menu// in order to resize it, destroy and create the menu again with different size.m_customMenu.SetHighlightStyle (Normal); //Or TextOnly, if you want the// background color to remain the same// and the Text color to change to the Highlight color.// The following setXXXColor sets the menu colors. If you dont want to change any, Dont call these member functions.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(...)函数。

voidCMyView::OnMeasureItem(intnIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct){if ( lpMeasureItemStruct->CtlType == ODT_MENU &&IsMenu((HMENU)lpMeasureItemStruct->itemID) &&(lpMeasureItemStruct->itemID ==(UINT)m_hMenuSub) ){m_customMenu.MeasureItem (lpMeasureItemStruct);}else// let MFC's self-drawing handle itCView::OnMeasureItem(nIDCtl, lpMeasureItemStruct);}下面的函数将帮助你设置菜单属性。

voidSetTextColor (COLORREF );voidSetBackColor (COLORREF);voidSetHighlightColor (COLORREF);voidSetIconSize (int, int);voidSetHighlightStyle (HIGHLIGHTSTYLE ); // HIGHLIGHTSTYLE : enum {Normal, TextOnly}voidSetHighlightTextColor (COLORREF);下面是文件代码://******************************************************************* ******// CustomMenu.h : header file//#if!defined(AFX_CUSTOMMENU_H__FE5B01C3_1E02_11D1_B87A_0060979CDF6D__INCL UDED_)#defineAFX_CUSTOMMENU_H__FE5B01C3_1E02_11D1_B87A_0060979CDF6D__INCLUDED_#if _MSC_VER >= 1000#pragma once#endif // _MSC_VER >= 1000class MENUDATA{public:MENUDATA () { menuIconNormal = -1; menuIconSelected = -1;};char menuText[32];UINT menuIconNormal;UINT menuIconSelected;};typedefenum {Normal,TextOnly} HIGHLIGHTSTYLE;///////////////////////////////////////////////////////////////////// ////////// CCustomMenu windowclassCCustomMenu : public CMenu{// Constructionpublic:CCustomMenu();// Attributespublic:// Operationspublic:// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CCustomMenu)//}}AFX_VIRTUAL// Implementationpublic:virtual ~CCustomMenu();virtual void DrawItem( LPDRAWITEMSTRUCT);virtual void MeasureItem( LPMEASUREITEMSTRUCT );voidSetTextColor (COLORREF );voidSetBackColor (COLORREF);voidSetHighlightColor (COLORREF);voidSetIconSize (int, int);voidSetHighlightStyle (HIGHLIGHTSTYLE );voidSetHighlightTextColor (COLORREF);// Generated message map functionsprotected:COLORREF m_crText;COLORREF m_clrBack;COLORREF m_clrText;COLORREF m_clrHilight;COLORREF m_clrHilightText;LOGFONT m_lf;CFontm_fontMenu;UINT m_iMenuHeight;BOOL m_bLBtnDown;CBrushm_brBackground,m_brSelect;CPenm_penBack;intm_iconX,m_iconY;HIGHLIGHTSTYLE m_hilightStyle;//{{AFX_MSG(CCustomMenu)// NOTE - the ClassWizard will add and remove member functions here.//}}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__IN CLUDED_)//******************************************************************* ******// CustomMenu.cpp : implementation file//#include "stdafx.h"#include "CustomMenu.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif///////////////////////////////////////////////////////////////////// ////////// CCustomMenuCCustomMenu::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 CaptionfromhereVERIFY (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 handlersvoidCCustomMenu::DrawItem (LPDRAWITEMSTRUCT lpDIS){ASSERT(lpDIS != NULL);CDC* pDC = CDC::FromHandle(lpDIS->hDC);CRectrect;HICON hIcon;COLORREF crText = m_crText;// draw the colored rectangle portionrect.CopyRect(&lpDIS->rcItem);// draw the up/down/focused/disabled stateUINT action = lpDIS->itemAction;UINT state = lpDIS->itemState;CStringstrText;LOGFONT lf;lf = m_lf;CFontdispFont;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);elsehIcon = AfxGetApp()->LoadIcon (((MENUDATA*)(lpDIS->itemData))->menuIconNormal);}elsehIcon = AfxGetApp()->LoadIcon (((MENUDATA*)(lpDIS->itemData))->menuIconNormal);TRACE1 ("Draw for %s\n", strText);}else{strText.Empty();hIcon = NULL;}if ( (state & ODS_SELECTED) ){// draw the down edgesCPen *pOldPen = pDC->SelectObject (&m_penBack);//You need only Text highlight and thats what you getif (m_hilightStyle != Normal){pDC->FillRect (rect,&m_brBackground);}else{pDC->FillRect (rect,&m_brSelect);}pDC->SelectObject (pOldPen);pDC->Draw3dRect (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 bitTRACE0 ("SELECT,SELECTED\n");}else{CPen *pOldPen = pDC->SelectObject (&m_penBack);pDC->FillRect (rect,&m_brBackground);pDC->SelectObject (pOldPen);// draw the up edgespDC->Draw3dRect (rect,m_clrBack,m_clrBack);if ((HFONT)dispFont != NULL)dispFont.DeleteObject ();dispFont.CreateFontIndirect (&lf); //NormalTRACE0 ("SELECT, NORMAL\n");}// draw the text if there is any//We have to paint the text only if the image is nonexistantif (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");elseTRACE0 ("SORRY.NOGO\n");}//This is needed always so that we can have the space for check marksrect.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 ();}voidCCustomMenu::MeasureItem( LPMEASUREITEMSTRUCT lpMIS ){CDC *pDC = AfxGetApp()->m_pMainWnd->GetDC();CFont* pFont = pDC->SelectObject (&m_fontMenu);inticonX = 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;}voidCCustomMenu::SetIconSize (int width, int height){m_iconX = width;m_iconY = height;}voidCCustomMenu::SetTextColor (COLORREF clrText){m_crText = clrText;}voidCCustomMenu::SetBackColor (COLORREF clrBack){m_clrBack = clrBack;if ((HBRUSH)m_brBackground != NULL)m_brBackground.DeleteObject ();m_brBackground.CreateSolidBrush (clrBack);}voidCCustomMenu::SetHighlightColor (COLORREF clrHilight){m_clrHilight = clrHilight;if ((HBRUSH)m_brSelect != NULL)m_brSelect.DeleteObject ();m_brSelect.CreateSolidBrush (clrHilight);}voidCCustomMenu::SetHighlightTextColor (COLORREF clrHilightText) {m_clrHilightText = clrHilightText;}voidCCustomMenu::SetHighlightStyle (HIGHLIGHTSTYLE hilightStyle) {m_hilightStyle = hilightStyle;}//******************************************************************* ******。

相关文档
最新文档