社区
VB
帖子详情
问个VB。NET问题!在VB。NET中除了用API外还有什么方法做OFFICE菜单??
e800
2003-09-30 08:14:17
在VB。NET中除了用API外还有什么方法做OFFICE菜单??
...全文
56
13
打赏
收藏
问个VB。NET问题!在VB。NET中除了用API外还有什么方法做OFFICE菜单??
在VB。NET中除了用API外还有什么方法做OFFICE菜单??
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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,然后自己绘制。我都是自己做的,效果不错
Vb
XPMenu
API
Microsoft
Office
XP
菜单
.rar
还淡入淡变关闭效果的
VB
仿Windows XP 风格
菜单
,现在很多程序员希望其
菜单
能够转换成 MS
Office
XP 和 VS .NET 风格,
Vb
XPMenu
API
就是这样一个动态库,它能使
VB
程序员仅通过几行代码就轻而易举地实现这些流行
菜单
。...
vb
控件开发 开发ocx
Win
Api
在
VB
中
的妙用 24 , 24.txt WINDOWS SCRIPT HOST对象在
VB
中
的使用 25 , 25.txt 安装向导生成程序组并建立多个程序项 26 , 26.txt 保存复选框选项 27 , 27.txt 不用OCX来创建自己的控件(一) 28 , 28.txt 成组...
计算机二级(
VB
)
该课程面向对象: 备考计算机二级(
VB
)的课程 备课期末考试 自学
VB
程序设计 课程注意提高学习者实战技巧,授课过程
中
以实际操作演示为主,帮助学习者快速地掌握编程的实际
方法
和技巧。 课程以2019年计算机二级大纲...
VB
编程资源大全(源码 控件)
功能
做
在一个OCX控件
中
,包含源程序(53KB) 41,pluginmodel.zip
VB
插件实现:通过建立Active Exe来实现插件的程序。包括服务器程序和插件调用程序,参见压缩包
中
的说明(30KB) 42,hotkeyctrl.zip Hotkey...
VB
编程资源大全(源码 控制)
利用了
API
可读注册表
中
所有的项目(4KB) 65,wpchanger.zip Windows墙纸更改事例 (3KB) 66,
vb
tozip.zip 用
VB
压缩文件(最简单的
方法
)(2KB) 67,anicursor.zip 演示如何使用动画光标
VB
源码(7KB)...
VB
16,553
社区成员
110,527
社区内容
发帖
与我相关
我的任务
VB
VB技术相关讨论,主要为经典vb,即VB6.0
复制链接
扫一扫
分享
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章