菜单自绘方面的知识 - ponydph的专栏 - CSDN博客
最美味的菜品集合而成的菜谱附菜品美图.ppt
基本功能
可变文字 可变条码
动态表格 可变 数据
可变图片
点击特添殊加扩文展本
动态图表 可变文件
数码防伪
条码标签打印
证
条码标签打印软件
券
卡
可变数据打印软件
个性化 文档
按需打印
可变数据打印软件
送货单等 仓储单据
进出口 物流单据
对账单保单系统
对账单
保单
银企对账单
综合对账单
基金对账单
保单
个性化相册
最美味菜谱、菜单、Menu的制作过程
我自己用可变数据打印软件印制了一份菜谱, 搜罗了此刻我最钟爱的中餐菜品 (前提是~~不考虑价格因素~~,人均消费超千 元了,OMG!),来看看有没有你喜欢吃的啊? 上照片了,欢迎选出你喜欢的菜品,一起来画 饼充饥吧
对美食有着无限向往的我闲来无事搜罗了28道我 最渴望吃到的中餐,口水啊,飞流直下三千尺, 但是,如此高昂的价格,俺们仅仅处于望梅止渴 的阶段啊。亲们,也来看看你喜欢哪道菜呢? 这事呢是基于我们最近新购买的一款软件,老板 要求要尽快熟练使用,考虑菜单涉及到可变的菜 品名称、价格、图片等可变数据和可变图片,这 款可变数据打印软件就排上用场了~~~所以我顺 便用它来制作我此刻最喜欢的菜谱,想到如此多 佳肴顺便就提高我的工作热情了。。。“工作中 享乐”HOHO
准备: 1.Excel表中输入菜品分类、名称、价格、单位。 2.将菜品的照片以Excel表中的名称命名后集中 放入某文件夹中。 3.打开可变数据打印软件,按提示分别插入菜 谱的样图作为版面背景,导入菜单的EXCEL表。 4.将左边的数据源拖拉至菜谱中合适的位置, 并设置字体为“华文彩云三号”。 5.点击软件上方的“可变图片”-选“可变图片 框”,放置在菜单合适的位置,绑定到数据字 段“菜名”,格式化选项-后缀中输入“.png”。 6.也 可在页眉页脚添加一些饭店的信息等。
vfp自制主菜单调用菜单及工具栏
自制主菜单调用菜单及工具栏自制主菜单调用菜单及工具栏2011/11/5自制主菜单调用菜单及工具栏一、建立项目mainmenu二、建立菜单menu1.在项目中新建菜单menu2.文件和查看子菜单如图,其他的忽略不在说明,主要讲功能的实现:3.制作好菜单后,点击“显示”菜单选择“常规选项”,勾选顶层表单复选框,确定。
如图:点击“菜单”菜单选择“生成”,生成一个同名的菜单,确定。
如图:三、建立类库libs,派生于toolbar,建立工具栏。
如图Libs包含(command1、command2等按钮)Libs.init DECLARE INTEGER ShellExecute IN shell32.DLL INTEGER HWND, STRING,;STRING lpszFile,STRING ,STRING ,INTEGERLibs.Undock clea dlls Libs.caption 工具栏Libs.ControlBox 假Libs.Enabled 真Libs.ShowWindow 1-最上层表单Command1.click DO FORM frmwen1表单集formset(包含表单frmtools)Formset.init SET CLASSLIB TO Libs ADDITIVE &&打开包含工具栏的类库This.AddObject("mybar","libs") &&建立对象This.mybar.Show &&显示工具栏对象This.mybar.Dock(0) &&靠窗口上方停靠Formset.AutoRelease 真 FormsetFormset.visible 假FrmTools.Caption 无FrmTools.Desktop 假FrmTools.MDIForm 真FrmTools.ShowWindow 1-在顶层表单中FrmTools.visible 假 FrmTools2.建立主表单frmbegin,主表单的大部分属性在main中程序中。
自绘菜单的实现
自绘菜单的实现程序运行效果截图:自绘菜单实现作者:querw(北方工业大学 2000级计算机4班)邮箱:querw@在VCKBASE上读到<<一种漂亮的自绘菜单>> (/document/viewdoc/?id=537)作者:郑恒 (lbird).应用到我的工程里后发现:文章中提到的效果能很好的实现,但是有一点不方便:需要映射WM_DRAWITEM和WM_MEASUREITEM消息才能实现自画功能.这对于一个基于对话框的工程,或者仅仅需要弹出式菜单的工程来说很不方便.网上有一种很有名的自绘菜单:BCMenu(/~corkum/BCMenu.html)(在附带工程中也有BCMenu),在使用它的时候并不需要映射上述的两个消息就能实现自绘效果.这个问题让我觉得很困惑,MSDN也说明:MeasureItem()和DrawItem()两个虚函数是由框架调用的,并不用手工映射.可是若不映射上述的两个消息则显示不正常.(我查看了好多资料,直到现在还是不明白原因,呵呵:))既然BCMenu 可以不用映射WM_DRAWITEM和WM_MEASUREITEM就能实现自画功能,那么它肯定经过了特殊处理.果然,BCMenu::LoadMenu()对整个菜单作了处理.我注意到,如果菜单是弹出式的,那么不需要映射WM_DRAWITEM 和WM_MEASUREITEM就能实现自画功能.于是我在CMenuEx::LoadMenu()中重新构建了整个菜单,把所有的子菜单创建为弹出式的菜单使用API函数::CreatePopupMenu(),代码如下:BOOL CMenuEx::LoadMenu(UINT uMenu){//重新读入菜单,创建为popup菜单,才能自画(由框架调用MesureItem() 和 DrawItem()HMENU hMenu = ::CreateMenu();this->Attach(hMenu);CMenu Menu; //临时菜单(使用CMenu的LoadMenu()函数读入菜单,并以之为蓝本构建新的菜单)UINT uID;Menu.LoadMenu(uMenu);for(int i = 0; i < (int)Menu.GetMenuItemCount(); i++){uID = Menu.GetMenuItemID(i);if(uID == 0) //分隔符{::AppendMenu(hMenu,MF_SEPARATOR,0,NULL);}else if((int)uID == -1) //弹出菜单(即子菜单){CMenu *pSubMenu = Menu.GetSubMenu(i);//创建子菜单HMENU hSubMenu = ::CreatePopupMenu();CString strPopup;Menu.GetMenuString(i,strPopup,MF_BYPOSITION);::InsertMenu(hMenu,i,MF_BYPOSITION | MF_POPUP | MF_STRING,(UINT)hSubMenu,strPopup);//对子菜单递归调用ChangeMenuStyle(),把子菜单改为MF_OWNERDRAW风格ChangeMenuStyle(pSubMenu,hSubMenu);}else //正常的菜单项{CString strText;Menu.GetMenuString(uID,strText,MF_BYCOMMAND);AppendMenu(MF_STRING,uID,strText);}}Menu.DestroyMenu(); //销毁临时菜单return TRUE;}void CMenuEx::ChangeMenuStyle(CMenu *pMenu,HMENU hNewMenu){//关联为CMenuEx(关联为CMenuEx后才能自动重画//原因不明(CMenu封装的结果?)CMenuEx *pNewMenu;pNewMenu = new CMenuEx;pNewMenu->Attach(hNewMenu);m_SubMenuArr.Add(pNewMenu);UINT uID;int nItemCount = pMenu->GetMenuItemCount();for(int i = 0; i < nItemCount; i++){uID = pMenu->GetMenuItemID(i);if(uID == 0) //分隔符{::AppendMenu(hNewMenu,MF_SEPARATOR,0,NULL);//pNewMenu->AppendMenu(MF_SEPARATOR,0,NULL);CString strText;MENUITEM *pMenuItem = new MENUITEM;pMenuItem->uID = 0;pMenuItem->uIndex = -1;pMenuItem->uPositionImageLeft = -1;pMenuItem->pImageList = &m_ImageList;m_MenuItemArr.Add(pMenuItem);::ModifyMenu(hNewMenu,i,MF_BYPOSITION | MF_OWNERDRAW,-1,(LPCTSTR)pMenuItem); }else if(uID == -1) //弹出菜单(即子菜单){CMenu *pSubMenu = pMenu->GetSubMenu(i);HMENU hPopMenu = ::CreatePopupMenu();CString strPopup;pMenu->GetMenuString(i,strPopup,MF_BYPOSITION);::InsertMenu(hNewMenu,i,MF_BYPOSITION | MF_POPUP,(UINT)hPopMenu,strPopup);MENUITEM *pMenuItem = new MENUITEM;pMenuItem->uID = -1;pMenuItem->strText = strPopup;pMenuItem->uIndex = -1;pMenuItem->uPositionImageLeft = -1;pMenuItem->pImageList = &m_ImageList;m_MenuItemArr.Add(pMenuItem);::ModifyMenu(hNewMenu,i,MF_BYPOSITION | MF_OWNERDRAW,-1,(LPCTSTR)pMenuItem); ChangeMenuStyle(pSubMenu,hPopMenu);}else //正常的菜单项{CString strText;pMenu->GetMenuString(uID,strText,MF_BYCOMMAND);MENUITEM *pMenuItem = new MENUITEM;pMenuItem->uID = pMenu->GetMenuItemID(i);pMenu->GetMenuString(pMenuItem->uID,pMenuItem->strText,MF_BYCOMMAND); pMenuItem->uIndex = -1;pMenuItem->uPositionImageLeft = -1;pMenuItem->pImageList = &m_ImageList;m_MenuItemArr.Add(pMenuItem);UINT uState = pMenu->GetMenuState(i,MF_BYPOSITION);::AppendMenu(hNewMenu,MF_OWNERDRAW | MF_BYCOMMAND | uState,uID,(LPCTSTR)pMenuItem);}}}这样,利用标注的CMenu::LoadMenu()函数读入菜单,并根据这个菜单重新构建一个新的菜单,在新菜单中把所有的子菜单创建为弹出式菜单并关联一个CMenuEx类.根据需要,我提供了一个CMenuEx::LoadToolBar(UINT uToolBar, UINT uFace)接口.请注意它的两个参数:uToolBar是工具条的资源,uFace是一个替代位图的资源ID.因为VC6.0中做一个真彩工具栏并不是一件容易的事,所以我做了一个小动作:用IDE的资源编辑器随便编辑一个工具条,只要ID和菜单ID相对应即可,然后可以用外部编辑器编辑好真正要使用的位图(顺序和工具条资源的顺序一样),并把该位图作为uFace参数传入,菜单就可以有真彩图标了.CMenuEx还提供了如下三个接口BOOL ModifyMenuEx()BOOL AppendMenuEx()BOOL RemoveMenuEx()功能一目了然,只是增加了对自绘风格的处理,应用的时候只要像调用普通的CMenu::AppendMenu()等函数一样就自动拥有自绘风格了.我写这篇文章的目的在于提出菜单派生类调用MeasureItem()和DrawItem()的问题.至于实现漂亮的菜单界面主要工作当然还是在DrawItem()函数中做,有特殊需要的可以自行定义MENUITEM结构,重新写DrawItem()函数.我没有提供设置菜单附加位图的具体代码,相信这个不是问题,你可以很容易的通过重写DrawItem()实现.有必要提醒的是:有关一个菜单项的信息最好能完全从一个MENUITEM结构中取得,使virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMIS);virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS);两个函数完全不依赖于CMenuEx类的数据成员.要在工程中使用CMenuEx很简单:1.把MenuEx.h和MenuEx.cpp加入到你的工程中2.声明一个CMenuEx对象.例如m_Menu;3.调用m_Menu.LoadMenu(IDR_MENU1);读入菜单4.若需要使用菜单位图则调用m_Menu.LoodToolBar();效果如下:MenuEx.jpg,MenuExPopup.jpg最后,对<<一种漂亮的自绘菜单>> 的作者郑恒给予我的帮助表示衷心感谢!。
第3章 vc ++菜单和绘图
5.画矩形: .画矩形: Rectangle(int x1, int y1, int x2, int y2); ; Rectangle(LPCRECT lpRect); ; RoundRect (int x1,int y1,int x2,int y2,int x3,int y3); RoundRect(LPCRECT lpRect, POINT point); ; 6.画椭圆和圆: .画椭圆和圆: BOOL Ellipse(int x1, int y1, int x2, int y2); ; BOOL Ellipse(LPCRECT lpReCt); ;
下列填充函数不画边界线,只填充内部区域。 下列填充函数不画边界线,只填充内部区域。 FillRect (LPCRECT lpRect,CBrush *pBrush); , ) FillRgn (CRgn *pRgn,CBrush *pBrush); , ) FloodFill (int x,int y,COLORREF crColor); , , ) InvertRect (LPCRECT lpRect); ) InvertRgn ( CRgn *pRgn );
3.画直线: .画直线: LineTo (int x, int y); LineTo (POINT point); Polyline (LPPOINT lpPoints,int nCount); , 4.画弧: .画弧: Arc (int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4); ArcTo (int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);
第3章 菜单和绘图 章
自绘菜单的实现
自绘菜单的实现在这里提供一个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变量,并增加菜单项。
菜单详细制作教程一
菜单一说明文档效果图:如下:今天我们来学习制作菜单一,菜单一是一种比较典型的菜单,各大网站用的都是这种菜单样式。
今天的教程我们一步步的来讲解。
先通过效果实现。
然后效果优化,添加特效一,效果实现第一步。
新建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菜单都是横着的。
自绘菜单开发示例
{ ห้องสมุดไป่ตู้
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();
第五章菜单工具栏状态栏和对话框
11. 显示窗口列表(Window List)检查框:
决定是否显示所有打开的子窗体标题。
对MDI窗体和MDI子窗体有效,对普通窗体无效。
5.1 菜单设计
3.菜单设计的几项操作:
(1).设计下拉菜单 (2).设计子菜单或改变子菜单级别 (3).为菜单项分组
菜单名用减号“-” (4).为菜单项指定访问键和快捷键
5.4.2 通用对话框
三、通用对话框使用---打开/另存为对话框
属性
4.InitDir(初始化路径)属性:该属性用来指定打开对话框 中的初始目录,若不设置,系统则默认为“C:\My Documents\”。
sbrScrl
4
Scroll Lock 键。当激活滚动锁定时,用黑体显示字母 SCRL,反之,当停用滚动键时, 显示暗淡的字母。
sbrTime 5 Time。以系统格式显示当前时间。
sbrDate 6 Date。以系统格式显示当前日期。
5.3 状态栏(StatusBa源自 控件)3.状态栏事件响应及显示信息修改
2. 在ToolBar控件中添加按钮 (1)ToolBar控件
ToolBar控件包含一个按钮对象集合,该对象被用来创 建与应用程序相关联的工具栏。工具栏包含一些按钮,这 些按钮与应用程序菜单中各项的按钮对应,工具栏为用户 访问应用程序的最常用功能和命令提供了图形接口。
(2)为工具栏连接按钮 右键单击Toolbar控件,选择“属性”命令打开如图2所
False(缺省):选择“取消”按钮,没有错误警告。
2、 通用对话框的方法
除了Acton属性,VB还提供了一组方法用来打开不同类型对话框
ShowOpen
ShowSave ShowColor
CAD菜单学习
---- 第二段:菜单ac_bonus.mnu汉化后(片断)
***POP1
[&Bonus扩充]
ID_MNBnsLayr [- >图层&L]
ID_BnsLayman [图层管理&L...]^C^Clman
…… ……
***TOOLBARS
**TB_BONUS_LAYER_TOOLS
AUTO CAD 菜单学习
2007-05-14 16:30
一、 菜单文件是如何运作的?
如图1所示(略),AutoCAD系统的基础菜单文件放在AutoCAD安装目录下的\SUPPORT子目录中,共有五个文件。无论是AutoCAD系统的基础菜单,还是附加(局部)菜单或是用户自已定制的菜单,都是由.mnu/.mnc/.mns/.mnr/.mnl这五个文件组成。这五个文件组成了一个菜单的整体,但也并不是每一个菜单都包括全部的这五个文件。五个文件在菜单中起着各自的作用,但其作用是有主次之分的,其生成过程有也主从之分。要使用好菜单,必须明白这五个文件相互之间的关系和在菜单的调用过程中各自所起的作用。.mnu是模板菜单文件,除了.mnl文件外,其余三个文件最初都源出自于它。AutoCAD调用时自动对它进行编译,产生对应的.mnc和.mnr文件以及.mns文件。.mnc是.mnu文件编译后的版本,实际上.mnc 文件是AutoCAD真正直接执行的菜单文件。.mnr也是在.mnu文件编译时产生,它存放着菜单所使用的位图之类的菜单资源。最初的.mns文件也是.mnu文件被编译时由AutoCAD自动产生的,它的基本内容和.mnu文件类似,只是少了有关的说明和注释行。在.mnu文件被编译时,.mns文件和.mnc文件的菜单内容是一致的,但如果在AutoCAD的操作中,用户对菜单的作了更改,这些改动都记录在.mns文件中,所以.mns文件对应的是AutoCAD系统中当前菜单的内容。.mnl文件在内容上相对独立一些,它包含由菜单所使用的AutoLISP表达式,如各种命令简化指令的定义,还有层排序、指定层这样的LISP程序。当加载一个菜单文件时,如果系统中存在与菜单文件同名的.mnl文件,则这个.mnl文件也会被加载。
设 计 菜 单
Private Sub MnuDiv_Click() LblClass.Caption = "÷" LblTg.Caption = Trim(Str(Val(TxtOne.Text) / Val(TxtTwo.Text)))
End Sub Private Sub MnuMulti_Click()
Load Name属性值(新的Index属性值) 则要删除数组中现有的控,则使用:
UnLoad Name属性值(要删除的控件的Index属性值)
例如:
Load MnuAp(MnuAp.UBound + 1) '增加Index值连续的菜单项
Unload MnuAp(MnuAp.UBound) '删除MnuAp菜单数组中新增的菜单项 在程序中使用Load、Unload方法给菜单系统增加删除
IF Button= 2 Then PopupMenu 弹出式菜单名 Flags,X,Y,DefaultMenu
Else 其它语句
End If
⑥DefaultMenu参数用来提示默认的菜单项,是对应菜单 项的Name(名称)属性值。在弹出式菜单显示出来后,该 菜单项的显示字体为黑体。
1.4 菜单项的增减
③使用窗体对象的PopupMenu方法显示弹出式菜单的。 格式如下:
对象.PopupMenu 菜单名[,Flags][,x][,y][DefaultMenu]
几点说明: • “对象”参数是可省略的,是窗体的Name属性值; • “菜单名”是在菜单编辑器中设计时定义弹出式菜单的 主菜单项名称。
•Flags参数是一个数值或Visual Basic提供的符号常量, 用来指定弹出式菜单的位置等特性。 符号常量分为两组: •用于指定弹出式菜单的位置; •定义用户对弹出式菜单的操作。 Flags的两组参数可以单独使用,也可能同时使用。当同 时使用时,每组中取一个值然后两值相加得到Flags的值; 如果使用符号常量,则中间用or运算符连接。
c语言程序设计菜单
c语言程序设计菜单C语言程序设计菜单是一种在C语言程序中实现用户交互界面的方法,它允许用户通过选择不同的选项来执行不同的程序功能。
设计一个菜单通常需要考虑以下几个方面:1. 菜单的布局:菜单应该清晰、直观,易于用户理解。
通常包括选项列表和提示信息。
2. 选项的组织:选项应该按照逻辑顺序排列,使用户能够容易地找到他们想要的功能。
3. 输入的处理:程序需要能够识别用户的输入,并根据输入执行相应的操作。
4. 错误处理:程序应该能够处理无效输入,并给出相应的提示信息。
5. 循环结构:菜单通常使用循环结构,直到用户选择退出程序。
下面是一个简单的C语言程序设计菜单的示例:```c#include <stdio.h>int main() {int choice;do {printf("\n欢迎使用C语言程序设计菜单\n");printf("1. 计算两个数的和\n");printf("2. 计算两个数的差\n");printf("3. 退出程序\n");printf("请输入您的选择(1-3):");scanf("%d", &choice);switch(choice) {case 1:printf("您选择了计算两个数的和。
\n");// 计算和的代码break;case 2:printf("您选择了计算两个数的差。
\n");// 计算差的代码break;case 3:printf("您选择了退出程序。
\n");break;default:printf("无效的选择,请重新输入。
\n");}} while(choice != 3);return 0;}```在这个示例中,我们使用了一个`do-while`循环来实现菜单的重复显示,直到用户选择退出。
现代教育技术应用:菜单构造作图
菜单构造作图学习提要1.了解图形的度量和数据的计算方法。
2.掌握应用菜单构造作图和图形变换的方法(重点)。
3.掌握重要函数图像的画法(难点)。
用工具箱的绘图工具几乎可以作出所有图形。
这种作图类似于传统的尺规作图。
但有些图形仅靠工具箱作图实在是太慢了。
例如要作一条线段的中点,用工具作图通常要好几步。
若用构造菜单作图,只需要两步:(1)选取线段。
(2)单击“构造”菜单→“中点”即可。
也可以按快捷键“Ctrl+M”直接构造中点。
类似可以作两线的交点等。
一、对象上的点的构造选定任何一个“对象”或多个“对象”,单击“构造”菜单→“对象上的点”,几何画板将根据你选取的对象,构造出相应的点,点可以在对象上自由拖动。
二、直线型的构造选取两点,单击“构造”菜单→“线段”(“射线”或“直线”)就构造一条线段(射线或直线)。
例4 快速画菱形。
图7-8 菱形的构造基本步骤:(1)按住Shift键,用画点工具顺次画四个点;按“Ctrl+L”得一个四边形。
(2)按“Ctrl+M”同时作出四边中点,再按“Ctrl+L”连接四个中点即得菱形。
如图7-8所示。
后面仅选择第一个四边形(含四个顶点),按“Ctrl+H”隐藏原四边形。
三、平行线、垂线和角平分线的构造1. 平行线或垂线的画法选取给定的一点和一条直线,或选取几点和一条直线,或选定一点和几条直线,单击“构造”菜单的“平行线”或“垂线”选项,就能画出过点且平行或垂直于已知直线的平行线或垂线。
例5画平行四边形。
图7-9 平行四边形的构造基本步骤:(1)用画线工具画出平行四边形的邻边,并用标签工具标上字母。
如图 7-9所示。
(2)仅选取点A和线段BC,单击“构造”菜单→“平行线(E)”,画出过A点且与线段BC平行的直线;同样画出另一条过点C且与线段AB平行的直线;在选取点工具状态下,单击两条直线的相交处得交点。
(3)选取两条直线,单击“显示”菜单→“隐藏”平行线(可以使用快捷键:Ctrl+H)。
一种漂亮的自绘菜单
一种漂亮的自绘菜单以前还是菜鸟时就觉得QQ的菜单做得很漂亮,想着自已的程序如果有那种菜单多好。
现在积累了一定的知识,就自已设计了一个类似的菜单控件类。
并把它发表出来供大家使用和参考,难免有不足的地方请高手不吝赐教!菜单效果如下:一、CMenuEx菜单类主要接口函数:1、void InitMenu(CMenu *pMenu,UINT uToolBar,CToolBar *pToolBar);说明:这是最主要的一个接口。
如果要改变主窗口的菜单则应在主窗口的OnInitMenu(CMenu *pMenu)中调用该函数(如:m_menu.InitMenu(pMenu,IDR_MAINFRAME,&m_wndToolBar)),当然主窗口必须要有工具栏,才会产生菜单项位图。
最后还必须重载主窗口的OnMeasureItem()和OnDrawItem()。
并在两个函数中分别调用菜单类的另外两个接口DrawItem()和MeasureItem();2、void SetHighLightColor(COLORREF crColor);3、void SetBackColor(COLORREF);4、void SetTextColor(COLORREF);以上三个接口应该不用再说明。
QQ的菜单采用的颜色是SELECTTEXT_COLOR RGB(0,0,127)TEXT_COLOR RGB(0,0,0)BK_COLOR RGB(143,167,207) 效果不错5、void SetImageLeft(UINT idBmpLeft)说明:这也是个重要的接口。
要实现纵向位图(像“开始”菜单)。
可以在适当的地方调用该函数。
参数当然是位图的ID值。
注意选择位图时要选好看一点的哦!要记得高宽的比例。
6、void InitPopupMenu(CMenu *pMenu,UINT uToolBar,CToo lBar *pToolBar) 与InitMenu不同的是:InitMenu并不修改第一级菜单为自绘风格,而该函数有包括第一级菜单.但必须注意:该类的任一实例都只能调用这两个函数中的一个,不能一同使用!!!二、CMenuEx类的具体使用步骤:2.1 用CMenuEx类加载主窗口菜单的具体步骤:1、添加CMenuEx成员变量CMenuEx m_menu2、CMainFrame类添加WM_INITMENU消息,并在实现函数中加入代码:m_menu.InitMenu(pMenu,IDR_MAINFRAME,&m_wndToolBar);IDR_MAINFRAME是工具栏资源ID,m_wndToolBar是工具栏对象3、CMainFrame类添加WM_DRAWITEM和WM_MEASUREITEM消息,并在实现函数分加入:if(!nIDCtl) m_menu.DrawItem(lpDrawItemStruct);if(!nIDCtl) m_menu.MeasureItem(lpMeasureItemStruct);只须这三步就大功造成了!但是有时你会发现菜单的位图错位了,这不是程序的错。
Java 菜单按钮控制绘图程序
目录一、程序开发背景 (1)二、程序分析与设计 (1)(一)程序功能要求 (1)(二)程序模块结构设计 (1)1、程序流程 (1)2、模块化功能结构分析 (2)三、程序的设计与实现 (3)(一)图形界面 (3)(二)图形界面的实现 (3)四、系统测试 (4)五、总结 (10)六、附件(程序代码) (11)菜单按钮控制绘图程序一、程序开发背景进一步巩固Java课程中关于图形用户界面具体实现的知识,使用Eclipse开发平台来实现“菜单按钮控制绘图”课题。
二、程序分析与设计为了复习和巩固Java程序设计基础,和进一步理解和掌握Java 语言,学生要用Java语言设计一个完整的应用程序,使学生综合应用所学知识完成软件的分析、设计、调试和总结,可加深和巩固对理论教学和实验教学内容的掌握,使学生进一步掌握使用面向对象技术开发完整系统的方法。
(一)程序功能要求功能要求:实现简单绘图功能,具体要求:画直线,画空心或实心椭圆、画空心或实心矩形、画多边形(图形的位置和大小可在程序中设定)。
(二)程序模块结构设计1、程序流程用菜单和按钮控制绘图流程如图一所示图一菜单和按钮控制绘图流程图绘制图形:(1)直线(2)空心椭圆(3)实心椭圆(4)空心矩形(5)实心矩形(6)多边形2、模块化功能结构分析设计程序功能模块如图二所示用菜单和按钮控制绘图程序菜按单钮绘绘制制图图形形图二功能模块图菜单绘制图形要求:主菜单:直线、椭圆、矩形、多边形菜单项:(1)直线:直线(2)椭圆:实心椭圆、空心椭圆(3)矩形:实心矩形、空心矩形(4)多边形:多边形按钮项:直线、空心椭圆、实心椭圆、空心矩形,实心矩形、多边形三、程序的设计与实现(一)图形界面图形界面用于显示绘制的图形,界面主要包括4 个上标签、6个下标签和图形显示区域,其中上标签“椭圆”包含“实心椭圆”、“空心椭圆”两个子标签,“矩形”中又包含“实心矩形”,“空心矩形”两个子按钮。
(二)图形界面的实现图形界面的具体实现import java.awt.*;import java.awt.event.*;import javax.swing.*;以上代码用于导入以下程序所用到的包。
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,判断单击左键时鼠标是否位于自绘制的最大化、最小化、关闭按钮或图标区域,如是则执行相应的按钮操作。
2013duilib入门简明教程--完整的自绘标题栏(8)
2013duilib⼊门简明教程--完整的⾃绘标题栏(8)看了前⾯那么多教程,相信对duilib已有基本映像了,我们就快马加鞭,做出⼀个完整的⾃绘标题栏吧~看到下⾯这个效果图,⼩伙伴们是不是有点惊呆了呢~O(∩_∩)O~duilib实现以上效果⾮常简单, 1、将按钮图⽚的⽂件夹放到exe⽬录, 2、main.cpp的代码⽆需改动,只需改动XML,XML内容如下(受⽹页宽度限制,以下XML格式有点乱,请复制到本地的XML编辑器上,以⽅便查看):<?xml version="1.0" encoding="UTF-8"?><Window size="800,600" mininfo="600,400" caption="0,0,0,32" sizebox="4,4,4,4"><!-- 窗⼝的初始尺⼨(宽800,⾼600)、窗⼝的最⼩尺⼨(宽600,⾼400)、标题栏拖拽区域(⾼32)、可拖拽边框⼤⼩(这⾥添加sizebox后就可以拖拽边框调整⼤⼩了) <VerticalLayout bkcolor="#FFF0F0F0" bkcolor2="#FFAAAAA0"><!-- 整个窗⼝的背景⾊ --><!-- 标题栏区 --><HorizontalLayout height="32" bkcolor="#FFE6E6DC" bkcolor2="#FFAAAAA0"><!-- 标题栏背景⾊ bkcolor、bkcolor2、bkcolor3分别是渐变⾊的三个值--><VerticalLayout /><!-- 占空位,占据左边所有的空位--><VerticalLayout width="77"><!-- 右边三个控件所占的宽度--><Button name="minbtn" tooltip="最⼩化" float="true" pos="0,5,22,24" width="23" normalimage=" file='SysBtn\MinNormal.bmp' " hotimage=" file='SysBtn\MinFocus.bmp' " pushedimage=" file='SysBtn\MinFocus.bmp' "/> <Button name="maxbtn" tooltip="最⼤化" float="true" pos="22,5,44,24" width="23" normalimage=" file='SysBtn\MaxNormal.bmp' " hotimage=" file='SysBtn\MaxFocus.bmp' " pushedimage=" file='SysBtn\MaxFocus.bmp' "<Button name="restorebtn" visible="false" tooltip="还原" float="true" pos="22,5,44,24" width="23" normalimage=" file='SysBtn\StoreNormal.bmp' " hotimage=" file='SysBtn\StoreFocus.bmp' " pushedimage=" file='SysBtn\StoreFocus.b <Button name="closebtn" tooltip="关闭" float="true" pos="44,5,74,24" width="28" normalimage=" file='SysBtn\CloseNormal.bmp' " hotimage=" file='SysBtn\CloseFocus.bmp' " pushedimage=" file='SysBtn\CloseFocus.bmp' "</VerticalLayout></HorizontalLayout><!-- 客户区 --><HorizontalLayout><Button name="btnHello" text="Hello World"/></HorizontalLayout></VerticalLayout></Window>仅仅在XML⾥⾯加了20⾏代码,⼀个完整的标题栏居然就完成了!试试标题栏可以拖动不,试试可以最⼤化不,试试有提⽰条不,试试按钮外观会变化不,试试可以拖拽边框调整窗⼝⼤⼩不?必须都可以!虽然我们并没有处理以上消息,但是很多功能都已实现,因为WindowImplBase帮我们都做好了。
cad菜单学习(CADmenulearning)
cad菜单学习(CAD menu learning)Auto CAD菜单学习2007-05-14 16:30一、菜单文件是如何运作的?如图1所示(略),系统的基础菜单文件放在AutoCAD AutoCAD安装目录下的\支持子目录中,共有五个文件。
无论是AutoCAD系统的基础菜单,还是附加(局部)菜单或是用户自已定制的菜单,都是由。
MNU /跨国/。
MNS /。
MNR /。
MNL这五个文件组成。
这五个文件组成了一个菜单的整体,但也并不是每一个菜单都包括全部的这五个文件。
五个文件在菜单中起着各自的作用,但其作用是有主次之分的,其生成过程有也主从之分。
要使用好菜单,必须明白这五个文件相互之间的关系和在菜单的调用过程中各自所起的作用.. MNU是模板菜单文件,除了。
MNL文件外,其余三个文件最初都源出自于它。
汽车CAD调用时自动对它进行编译,产生对应的。
MNC和。
MNR文件以及。
MNS文件..跨国是。
MNU文件编译后的版本,实际上。
MNC文件是AutoCAD真正直接执行的菜单文件.. MNR也是在。
MNU文件编译时产生,它存放着菜单所使用的位图之类的菜单资源。
最初的。
MNS文件也是。
MNU文件被编译时由AutoCAD自动产生的,它的基本内容和。
MNU文件类似,只是少了有关的说明和注释行。
在。
MNU文件被编译时,跨国文件的菜单内容是一致的,文件和。
MNS。
但如果在AutoCAD 的操作中,The user has made changes to the menu, and these changes are recorded in the.Mns file, so the.Mns file corresponds to the contents of the current menu in the AutoCAD system. The.Mnl file is relatively independent in content. It contains the AutoLISP expressions used by the menus, such as the definition of various command simplification instructions, as well as LISP programssuch as layer sorting and specifying layers. When a menu file is loaded, the.Mnl file is loaded if there is a.Mnl file with the same name as the menu file.Two when to use menu and when to load menus with menuload?The AutoCAD load menu has two commands: menu and menuload. When to use menu and when to use nenuload? First of all, it must be understood that the AutoCAD menu is hierarchical and consists of a base menu and a local (or additional) menu.As the name suggests, the basic menu is AutoCAD, which is the basis of the menu. In AutoCAD, you can only use one menu file as the base menu, and acad.mnu is the default base menu when you install it. The menu command is dedicated to changing or reloading a base menu, and when AutoCAD starts, the default base menu is the menu that was last called through the menu command.Local menus and base menus make no difference on the file system. On the base menu, additional menu items can be added to the drop-down menu, and this additional menu can be referred to as a partial menu. Local menus are loaded using the menuload command. The Menuload command can also be called from the drop down menu,The method is: "Tools menu" (tool) > "Customize Menus" (custom menu)". With menuload, you can load multiple menu files at the same time.For existing drop-down menu items, you can choose Menu Bar (menu bar) to "Remove" ("remove") or "Insert" (insert) after enteringthe "Menu Customization" (menu customization) interface".The local menu that Menuload loads can be uninstalled with the menuunload command. The base menu loaded with the menu command can only be replaced by the next menu command loaded.Three, how to make the menu changes fixed and savedMenu customization, especially toolbars, is easier to customize, but after many people customize the toolbar, there is a problem: how can you save these changes so that you can use them again when you install AutoCAD? To solve this problem, first of all, you should clearly understand the loading process of the AutoCAD menu.AutoCAD is the default loading menu: menu command is issued, AutoCAD first loading the specified menu name.Mnc file; if the.Mnc does not exist, is looking for the name of the MNS file will be compiled into.Mnc file and finish loading; if the.Mnc and.Mns files do not exist, then find the.Mnu file and compile and load. According to the menu loading process, you can take the following measures:If you modify the menu template file.Mnu and make the changes work, you must delete the.Mns and.Mnc files before you start the AutoCAD system, or reload the.Mnu template menu file. Load.The MNU file should note that in the call menu dialog box, the file type is changed to "Menu template (*.mnu)" instead of the default "Menu files (*.mnc) *.mns", so that the.Mnu file can be selected.If in AutoCAD, to modify the menu with the AutoCAD function, these changes are automatically recorded in the.Mns file, in order to make modifications to fixed, before deleting the.Mns file, modify the content should be moved to the corresponding parts of the.Mnu file, and.Mnu file backup. If these changes are in the base menu acad.mnu, you should overwrite the original acad.mnu of the AutoCAD with the modified acad.mnu after the AutoCAD is reinstalled, and delete the existing acad.mnc and acad.mns files.If you change the menu after the AutoCAD startup, you want to cancel these changes, and restore the menu state before startup. You can call the acad.mnu menu template file with the menu command.Four, how to finish the AutoCAD menuIn AutoCAD, there are two more important menus, acad.mnu and ac_bonus.mnu (in AutoCAD 2000, the bouns functionality has been synthesized into the main menu). Acad.mnu is the default base menu, placed in the \SUPPORT subdirectory under the AutoCAD installation directory; ac_bonus.mnu is a typical add-on menu, placed in the \BONUS\CADTOOLS subdirectory under the AutoCAD installation directory. The Chinese version of the AutoCAD R14 menu is mainly for the two menus of Chinese, in AutoCAD 2000, only the acad.mnu localization.If you are ready to make any changes or other changes to the AutoCAD menu system, it is better to backup the two files immediately after the installation of the AutoCAD system torestore the original menu state when necessary.There are three kinds of commonly used menu localization methods:1. using dynamic translation software like four star or Chinese Tongli Fang, the Orient Express Chinese characters display menu. But with the AutoCAD menu in terms of a high degree of specialization, the Chinese software translation results are often unintelligible.2. do it yourself. Take a look at the following two paragraphs and see that it's easy to permanently "AutoCAD" the menu, but in essence it's just "translating words and terms". In addition, the purpose of doing it yourself is clearly translated to others. There is work problem, acad.mnu text length up to 100K, the total vocabulary is as can be imagined, but for the Windows version of the AutoCAD, used to the menu section only three parts: first, the drop-down menu section, marked as ***POPn; two, the toolbar definition section, marked as ***TOOLBARS; three, the status bar message day, mark ***HELPSTRINGS. For other sections of the acad.mnu, it can be done without chinese. To see more about the structure of the menu file, refer to the menu customization section in the AutoCAD help.---- paragraph 1: menu ac_bonus.mnu original text (fragment)***POP1[&Bonus]ID_MNBnsLayr - >&Layers]ID_BnsLayman, [&Layer, Manager...]^C^Clman ...... ......***工具栏* tb_bonus_layer_toolsid_tbbnslaye [ _toolbar(“加层工具”,_floating,_show,197, 172, 1)] ...... ......*** helpstringsid_bnsncopy [复制实体嵌套内部块和外部参照:拷贝实用程序]----第二段:菜单ac_bonus MNU汉化后(片断)。
java课设——用菜单按钮控制绘图
功能综述复习、巩固Java 语言的基础知识进一步加深对Java 语言的理解和掌握课程设计为学生提供了一个既动手又动脑、独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。
提高学生适应实际,实践编程的能力,培养学生在项目开发中团队合作精神、创新意识及能力。
实现简单绘图功能,具体要求:画直线,画空心或实心椭圆、画空心或实心矩形、画多边形(图形的位置和大小可在程序中设定)。
(一) 分析与设计说明本学期对于java 语言的学习,本程序运用图形界面和绘图功能,均已学过利用Eclipse 工具,采用java 语言解决问题。
运行程序,输入图形类型,并输入两个坐标参数(不超过界面的大小),再选择程序界面上方相应所需的菜单选项或下方的按钮,得到所需图形,完成功能的实现。
用菜单和按钮控制绘图设置图形菜单绘制按钮绘制直线空心椭圆实心椭圆 空心矩形 实心矩形多边形主多边形 椭圆矩形直线 直线多边形空心椭圆实心椭圆 空心矩形实心矩形(二)代码分析/图形界面的实现(图形界面包括2个标签,4个菜单,6个按钮,5个文本组件)//导入程序所需要的包import java.awt.*;import java.awt.event.*;import javax.swing.*;public class Draw extends JFrame implements ActionListener{ private static final long serialVersionUID = 1L;private static final int WIDTH=600;private static final int HEIGHT=600;JMenuBar menubar;JMenu menu1,menu2,menu3,menu4;JMenuItem item1,item2,item3,item4,item5,item6;JButton button1,button2,button3,button4,button5,button6;JLabel label1;Mypanel pane1=new Mypanel();DrawCanvas JD=null;//将图形界面设为名为“控制绘图”且长宽都为600的图形界面。
菜单制作
例2 在例1的基础上,把“位数”菜单改为快捷菜单 在例1的基础上, 位数”
(1)打开例1的应用程序,选定窗体,然后在菜单编辑器中将 (1)打开例 的应用程序,选定窗体, 打开例1 位数”菜单标题的“可见”框中的“ 取消(即不选中) “位数”菜单标题的“可见”框中的“√”取消(即不选中) (2)增加以下的MouseUp事件过程代码: (2)增加以下的 增加以下的MouseUp事件过程代码 事件过程代码: Private Sub Form_MouseUp(Button As Integer, _ Shift As Integer, X As Single, Y As Single) Single) If Button = 2 Then ‘检查是否右击,击左键为1 检查是否右击,击左键为1 PopupMenu mnu10 mnu10 End If If End Sub 程序运行时,右击窗体空白处,即会弹出快捷菜单, 程序运行时,右击窗体空白处,即会弹出快捷菜单,如图 所示: 所示:
“标题”(Caption)输入框 标题” Caption) 供输入标题,也会同时显示在菜单显示区。菜单项的访问 供输入标题,也会同时显示在菜单显示区。 (&字符 格式 字符)” 键,用“(&字符)”格式 “名称”(Name)输入框 名称”(Name)输入框 索引”(Index)输入框 输入框 “索引”(Index)输入框 快捷键”列表框 “快捷键”列表框 帮助上下文ID”输入框 “帮助上下文ID”输入框 协调位置” “协调位置”列表框 复选” “复选”框 有效” “有效”框 可见” “可见”框
End Sub
Private Sub Command2_Click() Dim r2 As Long If Text1.Text = "" Then MsgBox "请输入答案" "请输入答案 请输入答案" Exit Sub End If r2 = Val(Text1.Text) If r1 = r2 Then Label3.Caption = "正确" "正确 正确" Else Label3.Caption = "错误" "错误 错误" End If End Sub Private Sub Mnu30_Click() Mnu30_Click() End End Sub
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
菜单自绘方面的知识收藏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控件。
CtlID指定了自绘控件的ID值,而对于菜单项则不需要使用该成员。
itemID表示菜单项ID,也可以表示列表框或者组合框中某项的索引值,对于一个空的列表框或组合框,该成员的值为-1。
itemAction指定绘制行为,其取值可以为下表中所示值的一个或者多个的联合:ODA_DRAWENTIRE表示整个控件都需要被绘制;ODA_FOCUS表示控件需要在获得或失去焦点时被绘制;ODA_SELECT表示控件需要在选中状态改变时被绘制。
itemState指定了当前绘制操作时所绘项的状态,例如,如果菜单项应该被灰色显示,则可以指定ODS_GRAYED状态标志。
其取值可以为下表中所示值的一个或者多个的联合:ODS_CHECKED表示菜单项将被选中,该值只对菜单项有用;ODS_COMBOBOXEDIT在自绘组合框控件中只绘制选择区域;ODS_DEFAULT表示当前控件处于默认状态;ODS_DISABLED表示控件将被禁止;ODS_FOCUS表示控件需要输入焦点;ODS_GRAYED表示控件需要被灰色显示,该值只在绘制菜单时使用;ODS_HOTLIGHT表示鼠标指针位于控件之上时控件会显示高亮颜色(支持Windows 98/Me, Windows 2000/XP);ODS_SELECTED表示选中控件;hwndItem 指定了组合框、列表框和按钮等自绘控件的窗口句柄;如果自绘的对象时菜单项,则表示包含该菜单项的菜单句柄。
hDC指定了绘制操作所使用的设备环境。
rcItem指定了将被绘制的矩形区域。
这个矩形区域就是上面hDC的作用范围。
系统会自动裁剪组合框、列表框或按钮等控件的自绘制区域以外的部分。
也就是说rcItem中的坐标点(0,0)指的就是控件的左上角。
但是系统不裁剪菜单项,所以在绘制菜单项的时候,必须先通过一定的换算得到该菜单项的位置,以保证绘制操作在我们希望的区域中进行。
itemData这个成员变量最为关键,菜单自绘时所需要的图标、文本等信息都是通过它获取的,至于它的具体值,是通过CMenu类的CMenu::AppendMenu()、CMenu::InSertMenu()、CMenu::ModifMenu()等函数的调用来传递的。
菜单自绘仅仅重载CMenu::DrawItem()函数是不够的,还需要重载CMenu:: MeasureItem()函数,在这个函数里面填充MEASUREITEMSTRUCT结构,通知Windows 自绘控件的尺寸。
该函数的原形为:virtual void MeasureItem( LPMEASUREITEMSTRUCTlpMeasureItemStruct );该函数的参数为一个指向MEASUREITEMSTRUCT结构的指针对象,该对象结构为:typedef struct tagMEASUREITEMSTRUCT {UINT CtlType; //控件类型;UINT CtlID; //控件的ID识别号,它不包括菜单控件;UINT itemID; //菜单项的ID识别号;UINT itemWidth; //菜单项的宽度;UINT itemHeight; //菜单项的高度;DWORD itemData //自绘控件所需要的数据,} MEASUREITEMSTRUCT;上面这个结构中,成员变量CtlType等于ODT_COMBOBOX 时,表示当前控件为自绘型的组合框,等于ODT_LISTBOX 时表示当前控件为自绘列表控制件,等于ODT_MENU 时表示当前控件为自绘菜单。
对于组合框和列表框控件,成员变量itemData是通过相应的AddString()、InsertString()获取的,对于菜单控件,成员变量itemData与DRAWITEMSTRUCT结构中的itemData是一致的。
菜单自绘时所需要的图标资源,可以预先定义,使用时直接装载,但是这种方法比较呆板,另外一种方法是通过搜索状态条上的按钮信息,如果当前按钮的ID识别号与某一菜单项的ID 识别号一致,那末通过就将该按钮上的图标提取出来,作为菜单图标,如果菜单项与工具条上的所有按钮的ID都不相同,那么对该菜单项不画图标。
至于菜单的文本信息,直接采用用户自定义菜单的文本就可以了-- Visual C++中自绘菜单的实现应用程序中的菜单,在界面中占据了重要位置,它的效果如何,直接影响了整个程序的界面效果,正因为这个原因,当今流行的应用程序的菜单都支持附带图标、反映当前状态的功能,也就是说,菜单项上不再仅仅有文字,还有附带一个小小的图标,同时在用户操作菜单时,菜单能够以不同的状态反映用户的操作,这些功能的实现,可以大大,美化程序界面,增强程序的吸引力。
Visual C++为开发人员提供了应用程序自动生成方法,使开发人员可以避开繁琐的界面开发,专著于各种功能的具体实现。
虽然这种自动生成应用程序框架的手段方便了初级程序设计人员,但是它也有着先天的不足,那就是通过这种手段生成的应用程序界面比较简单,不适宜应用程序的推广。
对于Visual C++自动生成的框架程序,要实现菜单的上述功能,唯一的办法就是通过菜单自绘的手段来实现,本例将通过实现CMenu类的子类CmenuEx类,详细介绍了如何编程实现菜单的自绘,使应用程序中的菜单也可以拥有图标,并且能够反映用户的不同操作,下图为程序编译运行后的效果:图一、自绘菜单实现后的效果图一、实现方法:要实现漂亮的界面菜单,必须要启动菜单项的自绘功能,所谓菜单的自绘,就是让菜单自己管理自己的显示效果,为此,首先要作的就是设置菜单项的风格为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; //父窗口句柄或菜单句柄H DC hDC; //控件对应的绘图设备句柄RECT rcItem; //控件所占据的矩形区域DWORD itemData; //列表框或组合框中某一项的值}可以看出,上面的DRAWITEMSTRUCT结构包含了控件自绘时的各种信息。
其中,结构成员CtlType指定了控件的类型,其取值ODT_BUTTON表示按钮控件;ODT_COMBOBOX表示组合框控件;ODT_LISTBOX表示列表框控件;ODT_LISTVIEW表示列表视图控件;ODT_MENU菜单项;ODT_STATIC表示静态文本控件;ODT_TAB表示Tab控件。
CtlID指定了自绘控件的ID值,而对于菜单项则不需要使用该成员。
itemID表示菜单项ID,也可以表示列表框或者组合框中某项的索引值,对于一个空的列表框或组合框,该成员的值为-1。
itemAction指定绘制行为,其取值可以为下表中所示值的一个或者多个的联合:ODA_DRAWENTIRE表示整个控件都需要被绘制;ODA_FOCUS表示控件需要在获得或失去焦点时被绘制;ODA_SELECT表示控件需要在选中状态改变时被绘制。
itemState指定了当前绘制操作时所绘项的状态,例如,如果菜单项应该被灰色显示,则可以指定ODS_GRAYED状态标志。
其取值可以为下表中所示值的一个或者多个的联合:ODS_CHECKED表示菜单项将被选中,该值只对菜单项有用;ODS_COMBOBOXEDIT在自绘组合框控件中只绘制选择区域;ODS_DEFAULT表示当前控件处于默认状态;ODS_DISABLED表示控件将被禁止;ODS_FOCUS表示控件需要输入焦点;ODS_GRAYED表示控件需要被灰色显示,该值只在绘制菜单时使用;ODS_HOTLIGHT表示鼠标指针位于控件之上时控件会显示高亮颜色(支持Windows 98/Me, Windows 2000/XP);ODS_SELECTED表示选中控件;hwndItem 指定了组合框、列表框和按钮等自绘控件的窗口句柄;如果自绘的对象时菜单项,则表示包含该菜单项的菜单句柄。