问个VB。NET问题!在VB。NET中除了用API外还有什么方法做OFFICE菜单??

e800 2003-09-30 08:14:17
在VB。NET中除了用API外还有什么方法做OFFICE菜单??
...全文
54 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
szch 2003-12-03
  • 打赏
  • 举报
回复
MENUITEM自绘是没问题,但是想问问如何把3D改为FLAT样式
liyoukebit 2003-12-02
  • 打赏
  • 举报
回复
受益匪浅
cnhgj 2003-12-02
  • 打赏
  • 举报
回复

.NET WinForm菜单DIY

作者:佚名

今天和大家讨论一下对菜单的改造。网上有不少好控件,都能实现在Menu里加入图片,但是少有更改Menu中的字体与颜色的。其实,我们通过对.net自带控件的操作,就可以实现加图片与改字体与颜色的目标。本文主要是讨论字体与颜色的更改。如下图所示:



通过菜单项的改变,窗体上的“天气真热”Label会相应地改变字体与前景色。

有的朋友会问,一般的控件不是只要设置font、forecolor、backcolor属性不就能达到Henry要做的事情了吗?但是Menu不行,原因是:Menu的父类是Component,不是Control!而那些属性是Control类的,如果Menu是从Control类继承下来的,当然就不会有我这篇小文的存在意义了。所以我们应该把Menu称为组件,以示与Control的派生控件相区别。大家以后使用控件时,也要注意一下它的父类是什么,以明确是否能进行某项功能的实现。

Menu内含三个类:MainMenu(主菜单)、ContextMenu(弹出菜单)、MenuItem(菜单项)其中,MainMenu和ContextMenu都是容器,MenuItem 类提供使我们得以配置菜单项的外观和功能的属性。因此,我们的工作主要就是针对MenuItem去的。上图实现的是在ContextMenu菜单,MainMenu的形式也是一样的。

现在我们是要做打破常规的事,所以要将MenuItem的OwnerDraw设为true,接管下绘制菜单项的重任,自已动手DIY一把。

那么我们来分析一下,当OwnerDraw设为true之后,哪些事件或方法是需要我们重写的。查一下MSDN就可以看到:DrawItem事件是当OwnerDraw设为true后发生的,接着查一下它的帮助,看一下事件处理程序中的事件数据是如何定义的。

[MSDN]:事件处理程序接收一个 DrawItemEventArgs 类型的参数,它包含与此事件相关的数据。下列 DrawItemEventArgs 属性提供特定于此事件的信息。

属性
说明
属性
说明

BackColor 获取所绘制的项的背景色
Graphics
获取要在其上绘制项的图形表面

Bounds
获取表示所绘制项的边界的矩形
Index
获取所绘制项的索引值

Font 获取分配给所绘制项的字体
State
获取所绘制项的状态

ForeColor 获取所绘制项的前景色




果然,我们需要的三个属性全都在这了!那么,我们实现这一事件不就行了?我按MSDN的例子实现了它,可是,出来的效果却不对,ContextMenu的宽度与高度都只有一点点大。看来是没有设置好MenuItem的宽与高了。

Item的宽与高在哪设置?MenuItem的属性中并没有这两项,找来找去,最后在MeasureItem事件中找到了。

属性
说明

Graphics
获取要测量的 Graphics 对象

Index
获取或设置需要有高度和宽度的项索引

ItemHeight
获取或设置由 Index 指定的项高度

ItemWidth
获取或设置由 Index 指定的项宽度


也就是说,我们想要绘制出MenuItem,必须先计算出将要绘制的Item的宽度与高度。在这里需要说明的是,项的宽度与高度不光是由文字部分决定的,还取决于item中的图片部分,所以我们的计算公式是:

项的宽度=图片的宽度+文字的宽度

项的高度=max (图片的高度,文字的高度)

本文没有加入自定义图片,只是加入了一个圆点的选项符号,它是由DrawMenuGlyph共享方法实现的。那么它的高度与宽度是如何界定的呢?很简单,使用SystemInformation.MenuCheckSize就可确定在选定菜单项旁显示选中标记的图像的尺寸。圆点的默认大小是高宽皆为13像素。DrawMenuGlyph是会根据我们给出的图片的位置大小绘制圆点的大小的。所以,我们还必须在DrawItem事件中给出图片的大小:

图片的高度=文字的高度

图片的宽度=图片的默认宽度*放大的倍数=图片的默认宽度*文字的高度\图片的默认高度

昏头昏脑地说了这么多,还是用代码来描述更为清晰:

Dim oldMenuItem As New MenuItem()

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Me.ContextMenu = New ContextMenu()

Dim MenuText As New ArrayList()

MenuText.Add("宋体")

MenuText.Add("黑体")

MenuText.Add("楷体_GB2312")

Dim MyMenuItem(MenuText.Count - 1) As MenuItem

Dim i As Integer

For i = 0 To MyMenuItem.Length - 1

MyMenuItem(i) = New MenuItem(MenuText(i))

MyMenuItem(i).OwnerDraw = True '每一项都要设

MyMenuItem(i).RadioCheck = True '每一项的选项钮都开启

'指向单击事件的处理程序

AddHandler MyMenuItem(i).Click, _

New EventHandler(AddressOf MenuItem_Click)

'指向MeasureItem事件的处理程序

AddHandler MyMenuItem(i).MeasureItem, _

New MeasureItemEventHandler(AddressOf MenuItem_MeasureItem)

'指向DrawItem事件的处理程序

AddHandler MyMenuItem(i).DrawItem, _

New DrawItemEventHandler(AddressOf MenuItem_DrawItem)

ContextMenu.MenuItems.Add(MyMenuItem(i))

Next i

'记录下初始选中的项

oldMenuItem = ContextMenu.MenuItems(0)

oldMenuItem.Checked = True

End Sub

Private Sub MenuItem_Click(ByVal obj As Object, ByVal e As EventArgs)

oldMenuItem.Checked = False '改变原有的菜单项的选取状态

oldMenuItem = CType(obj, MenuItem) '转型处理

oldMenuItem.Checked = True '设置现选中的菜单项的选取状态

Select Case oldMenuItem.Text '根据菜单内容设置label的色彩

Case "宋体"

Label1.ForeColor = Color.Red

Case "黑体"

Label1.ForeColor = Color.Green

Case "楷体_GB2312"

Label1.ForeColor = Color.Blue

End Select

'根据菜单内容设置label的字体

Label1.Font = New Font(oldMenuItem.Text, Label1.Font.Size)

Invalidate()

End Sub

Private Sub MenuItem_MeasureItem(ByVal obj As Object,ByVal e As MeasureItemEventArgs)

Dim mi As MenuItem = CType(obj, MenuItem)

Dim fnt As New Font(mi.Text, 12, FontStyle.Bold) '12是字体的大小

Dim szf As SizeF = e.Graphics.MeasureString(mi.Text, fnt, 1000)

'得到文本的宽度

e.ItemWidth = CInt(Math.Ceiling(szf.Width))

'得到文本的高度

e.ItemHeight = CInt(Math.Ceiling(szf.Height))

'项的宽度=文本的宽度+图片的宽度

e.ItemWidth += SystemInformation.MenuCheckSize.Width * _

e.ItemHeight \ SystemInformation.MenuCheckSize.Height

End Sub

Private Sub MenuItem_DrawItem(ByVal obj As Object, _

ByVal e As DrawItemEventArgs)

Dim mi As MenuItem = CType(obj, MenuItem)

Dim g As Graphics = e.Graphics

Dim br As Brush

Dim fnt As New Font(mi.Text, 12, FontStyle.Bold) '12是字体的大小

Dim rectCheck As Rectangle = e.Bounds '这样做是把选钮图片的高度设为文本的高度

rectCheck.Width = SystemInformation.MenuCheckSize.Width * _

rectCheck.Height \ SystemInformation.MenuCheckSize.Height

Dim rectText As Rectangle = e.Bounds

rectText.X += rectCheck.Width 'item的宽度=图片的宽度+文字的宽度

e.DrawBackground()'重写这个函数,可以实现选中项的XP效果

'绘制表示选中的圆点。如果想加入图片,请在这里考虑一下

If (e.State And DrawItemState.Checked) <> 0 Then

ControlPaint.DrawMenuGlyph(g, rectCheck, MenuGlyph.Bullet)

End If

'设置选项的前景色

If (e.State And DrawItemState.Selected) <> 0 Then

br = SystemBrushes.HighlightText '选中的会变成蓝底白字

Else

Select Case mi.Text

Case "宋体"

br = New SolidBrush(Color.Red)

Case "黑体"

br = New SolidBrush(Color.Green)

Case "楷体_GB2312"

br = New SolidBrush(Color.Blue)

End Select

End If

g.DrawString(mi.Text, fnt, br, RectangleF.op_Implicit(rectText))

End Sub

您动手试一下吧,很快就会明白实现的原理了。然后对其进行扩展,就能实现极富个性的菜单了。本文仅是起了一个头,更深入的研究,还需要您自己去钻研。

gordenfl 2003-12-02
  • 打赏
  • 举报
回复
好象有专门的空间啊!
y1g1y1 2003-12-02
  • 打赏
  • 举报
回复
http://ygyuan.yeah.net/

免费控件.
smbee 2003-10-11
  • 打赏
  • 举报
回复
我不建议使用外部控件,如果你在发布应用的时候总会遇到版权的问题,所以还是自己做吧,这不是很难的,我就是自己做的。
beyond004 2003-10-11
  • 打赏
  • 举报
回复
我使用C1控件,感觉不错。建议使用
e800 2003-10-11
  • 打赏
  • 举报
回复
dxq(懒虫)
有没有做好了的源代码??
发过来给我看看呀!!
shong2111@163.com
kwklover 2003-10-01
  • 打赏
  • 举报
回复
可以自己写,我现在学的这本书有教,不过代码很多,看起来头大
Kain 2003-10-01
  • 打赏
  • 举报
回复
很简单的
其实网上有很多这样的例子
只要重写menuitem类的DrawItem等方法就可以了
树莓派 2003-10-01
  • 打赏
  • 举报
回复
最好的控件:DOTNETBAR,能够作出所有VS.NET的效果!
wisecloud 2003-09-30
  • 打赏
  • 举报
回复
有啊!我以前在VB6里一直用的是 ActiveBar2 。
现在向你推荐 SharpUI for .Net 。可轻松实现Office界面功能,包括 VS.NET 的工具箱!
具体请看: http://www.datadynamics.com/
dxq 2003-09-30
  • 打赏
  • 举报
回复
可以继承MenuItem,然后自己绘制。我都是自己做的,效果不错
01 , 01.txt 《 VB6.0通过MSChart控件调用数据库 》 02 , 02.txt 《 用VB6实现动态增减控件 》 03 , 03.txt ActiveX控件的创建 04 , 04.txt ADO控件和DATA控件的冲突(不能共存)的解决方法 05 , 05.txt Combo的自动查询技术 06 , 06.txt DirectX7.0使用心得(1) 07 , 07.txt DirectX7.0使用心得(2) 08 , 08.txt DirectX7.0使用心得(3) 09 , 09.txt FSO对象模型在VB的应用 10 , 10.txt MsComm 控件的文字传输范例 11 , 11.txt Office或IE4风格的ToolBar 12 , 12.txt Regsvr32.exe注册控件的具体用法 13 , 13.txt TextBox的自动调节 14 , 14.txt TextBox实现打印机效果 15 , 15.txt TreeView的基本操作 16 , 16.txt VB5DBGRID控件在VB6使用 17 , 17.txt VB6.0动态加载ActiveX控件漫谈 18 , 18.txt VB与MS-Draw开发通用作图软件 19 , 19.txt VBAPP对象及其应用 20 , 20.txt VBlist控件的功能扩充 21 , 21.txt VB防止将重复项目添加到列表框控件 22 , 22.txt VB用Multimedia MCI控件开发多媒体应用 23 , 23.txt Win ApiVB的妙用 24 , 24.txt WINDOWS SCRIPT HOST对象在VB的使用 25 , 25.txt 安装向导生成程序组并建立多个程序项 26 , 26.txt 保存复选框选项 27 , 27.txt 不用OCX来创建自己的控件(一) 28 , 28.txt 成组更新控件属性 29 , 29.txt 创建数据驱动窗体 30 , 30.txt 得到鼠标位置 31 , 31.txt 调整 Combo 下拉部分的宽度 32 , 32.txt 动态加入控件到VB控件数组 33 , 33.txt 对ListView的列排序 34 , 34.txt 放一个Combo到Toolbar 35 , 35.txt 改变 ListIndex而不发生 Click 事
1,create.ZIP 不用OCX来创建自己的控件(4KB)2,rganimate.ZIP 动画控件(35KB)3,rgassistant.ZIP 允许你创建一个Microsoft Office97那样的助手!(65KB)4,rgsysmoncal.ZIP 日期控件(35KB)5,datadrn.ZIP 创建数据驱动窗体(7KB)6,tooltip.zip 利用VB建立ToolTip窗口(4KB)7,trans.zip 建立透明的窗口(2KB)8,Anicur.zip 在窗口建立动画光标(2KB)9,toolbar.zip 建立浮动工具栏的例程(22KB)10,winrgn.zip 建立不规则的窗口(2KB)11,winhole.zip 建立一个间有洞的窗口(2KB) 12,split.zip 分割窗口并动态调整分割区域(类似于Windows的资源管理器)(18KB)13,rubrect.zip 在屏幕上出现抓取窗口(8KB)14,hidebtn.zip 隐藏Win9X任务栏上的“开始”按钮(2KB)15,console.zip 利用API函数建立控制台窗口(4KB)16,startinm.zip 将一个程序的窗口作为你的窗口的MDI子窗口(3KB)17,desktop.zip 一个可以动态排列桌面图标和动态改变屏幕分辨率的程序(29KB)18,rgdock.zip 建立类似Office工具栏的Docking Window(56KB)19,comboex.zip 一个非常cool的范例,可以在窗口建立一个类似于Windows Explore的地址栏的图标下拉ComboBox。其还包含了其它的许多技巧(32KB)20,dyncontrol.zip 动态建立控件的范例(3KB)21,listitemdrag.zip 演示如何将列表框的条目拖放到另一个列表框(2KB)22,ownerdrawmenu.zip 演示建立图形菜单,同一般的图形菜单不同,通过该程序建立的菜单当光标移动到菜单项上时,该项一样可以象Word97菜单项一样突出显示(11KB)23,traybar.zip 一个可以隐藏任务栏(Traybar)上的开始按钮、Switch Bar、快速启动按钮、任务栏图标、桌面图标的程序(3KB)24,windowsplacement.zip 更改Windows程序在Switch bar上的位置(3KB)25,tooltips.zip 利用Windows API实现的可显示多行文字的ToolTip(5KB)26,deskicon.zip 当你设置Windows的桌面墙纸之后,是否觉得桌面图标文字下的色块十分碍眼呢,这个程序可以使图标文字透明的显示在桌面上。还可以改变桌面图标文字的颜色以及图标文字下色快的颜色(2KB)27,animatedtitlebar.zip 这个程序可以使你的窗口的Title Bar动起来。很有趣的(26KB)28,resizr.zip 一个带源码以及演示的Resizer控件,就象Windows资源管理器的文件夹列表同文件列表之间的Resizer棒一样(7KB)29,taskbar.zip 一个带源码以及演示的TaskBar控件,可以让你的窗口象Windows的TaskBar一样(6KB)30,xeditor.zip 一个利用VB编写的功能比较完备的文本编辑器(172KB)31,custominputbox.zip 这个程序演示如何改变缺省的InputBox的貌(10KB)32,controlpopmenu.zip 这个程序演示如何控制控件的缺省弹出菜单(例如TextBox),是完全控制而不只是隐藏和显示(3KB)33,coolmenu.zip 一个很Cool的菜单程序,可以把你的菜单改造成象Office系列的带图标的菜单(33KB)34,covereffect.zip 一个实现程
1,listview.ZIP 演示使用listview控制, 作出资源管理器目录树的效果 (7KB)2,dirview.ZIP 装入整个 c 盘目录到 treeview (4KB)3,progress.ZIP 演示使用win95的进度条(3KB)4,progbar.ZIP 进度条演示(4KB)5,slider.ZIP 使用滑动控制(6KB)6,statusbar.ZIP 控制状态条的例子(10KB) 7,tabstrip.ZIP tabstrip控制的例子 (10KB)8,treeview.ZIP 存储/恢复treeview的例子(10KB) 9,treelist.ZIP 使用treeview和listview显示数据库的数据 (7KB)10,combohg.ZIP 改变combobox的下拉高度(2KB) 11,dragtree.ZIP 拖拉树节点的例子(7KB) 12,lvstyles.ZIP 演示listview控制的例子(27KB) 13,make_toolbar_flat.ZIP 实现浮动工具条的例子(1KB) 14,code_coolbar.ZIP ie4风格的工具条(26KB)15,djmeter.ZIP 实现进度条的例子(10KB) 16,dupes.ZIP 一个combobox的例子(3KB) 17,formdsgn.ZIP 演示改变控件的大小和移动控件的例子(9KB)18,tvcheckboxes.ZIP treeview和checkbox的例子(9KB)19,tveventcancel.ZIP 使用treeview的简单例子(12KB) 20,tvnode-hitem.ZIP 在treeview的节点处使用图形(6KB)21,timedmsg.ZIP 对windows的标准对话框还可以加上时间限制的例子(9KB)22,browsedlg.ZIP 通过对一系列的 api 及 shell32.dll 的调用来实现 windows 各种标准浏览选择对话框。此源代码为 vb4 设计。对后来版本同样适用(8KB) 23,listtips.ZIP listbox使每一item有不同的tip(2KB) 24,newctl.ZIP 动态创建控件的例子,解决了vb5不能"无生有"的毛病(2KB)25,colourdg.ZIP 调用windows的颜色对话框, 不需用到"comdlg32.ocx"(3KB) 26,clipbutton.ZIP 在我们使用 vb 的 code 编辑器时,其粘贴、复制、剪切按钮能随着当前的选择情况而进行适当的调整,本程序演示了类似的功能, 作者:jin(kenj@163.net)(3KB) 27,clipview.ZIP 使用 windows 剪贴板(16KB) 28,richedit.ZIP 利用richtext实现的编辑器(3KB) 29,srchlist.ZIP 在 list 控件里进行增量查询(4KB)30,savetree.ZIP 以文件方式保存和恢复treeview(7KB)31,kenjLV1.zip ListView的API效果演示(10KB)32,txtsrch.zip 在Text实现快速增量查询(4KB)33,TracBar.zip 滚动条模块,与 VB 的滚动条比较,该模块支持动态生成, 支持触发消息(7KB)34,treedrag.zip TreeView 节点拖动、增加、删除等功能演示(8KB)35,wordwrap.zip 在 TextBox 自动换行(2KB)36,combosrc.zip 在 COMBO 的增量查询(2KB)37,progman.zip 制作安装程序必备,此模块包含的SUB及Function能帮你出专业的安装程序(2KB)38,messageboxdemo.zip 用API调出MessageBox框!(6KB)39,associate.zip 建立关联程序的例子。本程序演示把 .bar 文件与 NotePad建立关联(3KB)40,tbar97.zip 制作的一个类似Office97的工具栏,除了不能移动,其他都极为相似!(24KB)41,combomagic.zip 在 COMBO 的增量查询(3KB)42,cursortest.zip 鼠标控制演示。提供了一个鼠标控制的类,包括移动、限制隐藏等功能(4KB)43,cpu.zip 监视 CPU 使用情况的例子(4KB)44,cdfind.zip 找出系统光驱的盘符(3KB)45,up.zip 数字大写转换程序(4KB)46,ktext.zip VB编程突破64K的文本显示限制(2KB)47,menudemo.zip 使用API改变菜单,使之具有几列,如同Windows的开始菜单一样(4KB)48,clipcur.zip 限制鼠标的移动区域(2KB)49,findlist.zip 在ListBox快速搜寻字符串(5KB)50,getword.zip 读取鼠标所在位置的单词(5KB)51,filemanager.zip 文件管理器(8KB)52,mousedemo.zip 一些鼠标例子演示(3KB)53,calendar.zip 一个小小的日历程序(4KB)54,hotkey.zip VB编程热键应用一例(3KB)55,noalt+f4.zip 去掉窗体关闭按钮 (2KB)56,cpuinf.zip 取得CPU的报告(16KB)57,viewpw.zip 密码查看器,可查看"***"的字符(7KB)58,regdemo.zip 向注册表建立关联文件(3KB)59,cipher.zip 加密/解密字符串的例子(3KB)60,browsefolders5.zip 浏览一个子目录(3KB)61,easymail.zip 文件加密/解密的例子(5KB)62,encstrings.zip 加密/解密字符串的例子(2KB)63,keybinf.zip 键盘信息报告例子(2KB)64,reginq.zip 读取注册表的例子,利用了API可读注册表所有的项目(4KB)65,wpchanger.zip Windows墙纸更改事例 (3KB)66,vbtozip.zip 用VB压缩文件(最简单的方法)(2KB)67,anicursor.zip 演示如何使用动画光标 VB源码(7KB)68,cfdemo.zip 不用CommonDialog控件,使用API调用字体对话框 VB源码(281KB)69,cmdlgd.zip 替换 Windows 公共对话框的 DLL 和演示程序的源代码,具有HOOK 功能(86KB)70,colordlg.zip 不用CommonDialog控件,使用API调用颜色对话框 VB源码(4KB)71,commondialogs.zip Windows 公共对话框的源代码,包含文件、打印机、颜色、字体、游览对话框(7KB)72,cpuinfo.zip 得到CPU的详细信息 VB源码(16KB)73,fileprops.zip 演示如何调用 Windows 资源管理器的文件属性对话框(7KB)74,progbar121.zip 进程杆控件的源代码。具有水平、垂直,渐变,显示文本和百分比,播放声音的功能,不会让您失望。(12KB)75,subcls328.zip 一个子类的源代码,包含菜单、MDI窗体背景等8个演示程序(46KB)76,taskbar.zip 把应用程序的图标放在任务栏的右侧,是一个控件源代码(6KB)77,vbthread.zip 用VB实现多线程 VB源码(15KB)78,ini_vb6.zip 用WindowsAPI访问INI文件(8KB)79,syshotkey.zip 创建一个系统级的热键,无论你的程序是否获得焦点热键不生效 (4KB)80,win98mi.zip Win98多显示器支持演示(31KB)81,message.zip 拦截Windows消息(8KB)82,viewdoc.zip 用系统默认程序查看并打印文档 (7KB)83,srcset.zip 改变屏幕到16位彩色的演示 (2KB)84,moduleini.zip 访问、修改INI的函数(1KB)85,listapp.zip 枚举系统正在运行的程序(包括隐含的) (5KB)86,hidebtn.zip 隐藏Win9X任务栏上的“开始”按钮(2KB)87,win95grp.zip 获得Windows9X下开始|程序所有的程序组(16KB)88,clipview.zip 如何查看剪贴板的带格式文本 (42KB)89,sysinfo.zip 获得系统的信息:硬盘、显示器、内存... (3KB)90,zm.zip 取得计算机所有Modem的名称(2KB)91,custmnu2.zip 又一个菜单的例子(5KB)92,collSRC.zip 程序收集1.0版 (214KB)93,countdown.zip 一个倒计时的程序(10KB)94,00951404.zip 利用热键操作实现一键通(55KB)95,system_v.zip 系统监视器,可以实时监视正在运行的程序,并关闭他(29KB)

16,549

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧