在vb.net中绘制与菜单项匹配的文本
我想在vb.NET2010中的菜单项的左边空白处放一个数字,但这似乎只能设置为图像。因此,我一直在尝试使用在vb.net中绘制与菜单项匹配的文本,.net,vb.net,gdi+,drawstring,toolstripmenu,.net,Vb.net,Gdi+,Drawstring,Toolstripmenu,我想在vb.NET2010中的菜单项的左边空白处放一个数字,但这似乎只能设置为图像。因此,我一直在尝试使用Graphics.DrawString()创建一个带有我想要的数字的图像。我尝试了各种方法,但我无法使生成的图像看起来像菜单项本身中的文本-有什么方法可以做到这一点吗?这是我当前的代码(分配一个图像来测量文本,然后以正确的大小重新分配大约是这个版本的第3版-非常难看,但我不知道如何测量) 这里有几个例子可以说明这一点——请注意,边距文本(图像)与菜单项文本相比是多么模糊: 我已经尝试了所有
Graphics.DrawString()
创建一个带有我想要的数字的图像。我尝试了各种方法,但我无法使生成的图像看起来像菜单项本身中的文本-有什么方法可以做到这一点吗?这是我当前的代码(分配一个图像来测量文本,然后以正确的大小重新分配大约是这个版本的第3版-非常难看,但我不知道如何测量)
这里有几个例子可以说明这一点——请注意,边距文本(图像)与菜单项文本相比是多么模糊:
我已经尝试了所有的
textrendinghint
选项,其中一些选项比其他的好,但是没有一个能提供菜单文本的清晰外观。有没有办法更接近这种外观?这让我困惑了一段时间,我认为这是一个错误,因为只要你添加背景颜色,文本就会按你的意愿显示出来
我有一个解决办法给你。它使用从类派生的渐变笔刷在绘制文本之前在位图的背景中绘制矩形
Dim mnuItem = TestToolStripMenuItem
Dim numPeople = CInt(Math.Ceiling(Rnd() * 20))
Dim qImg = New Bitmap(mnuItem.Height, mnuItem.Height)
Using gr = Graphics.FromImage(qImg)
Dim sz = gr.MeasureString(numPeople, mnuItem.Font)
Dim w = CInt(Math.Ceiling(sz.Width))
Dim h = CInt(Math.Ceiling(sz.Height))
Dim linGrBrush As New LinearGradientBrush( _
New Point(0, 0), _
New Point(qImg.Width, 0), _
ProfessionalColors.ToolStripGradientBegin, _
ProfessionalColors.ToolStripGradientEnd)
gr.FillRectangle(linGrBrush, New Rectangle(0, 0, qImg.Width, qImg.Height))
gr.DrawString(numPeople, mnuItem.Font, Brushes.Black, New Point((qImg.Width / 2) - (w / 2), (qImg.Height / 2) - (h / 2)))
End Using
mnuItem.Image = qImg
您需要类顶部的
Imports System.Drawing.Drawing2D
行您是否尝试过创建自己的ToolStripMenuItem
Class CustomToolStripMenuItem
Inherits System.Windows.Forms.ToolStripMenuItem
Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
e.Graphics.DrawString("11", Me.Font, System.Drawing.Brushes.Black, New System.Drawing.PointF(0, 0))
End Sub
End Class
我没有做任何计算来正确显示它,但我认为你可以做到。在我的系统上显示如下(请参见“另存为”项)
您是否为DrawString()尝试过其他画笔或字体?
DrawString
的画笔选择似乎仅限于更改颜色。至于字体,我认为如果我想让它与菜单文本匹配,使用菜单的字体将是最好的选择-不是这样吗?我还没有尝试System.Drawing.Brush类的所有功能。它看起来像刷子。黑色和刷子或SolidBrush一样,但你永远不知道。听起来你用TextRenderer赢了。事实上,在MSDN中发现了这一点。我尝试一下:如果你为Windows窗体控件绘制文本,考虑使用Stask.WINDOWS。Forth.TSuppEnter类,而不是Studio.Drutg.Cug类。TextRenderer绘制更清晰的文本,该文本与Windows用于在Windows窗体之外绘制控件的文本更为匹配。TextRenderer是其中之一,TextRenderingHint.AntiAlias越严重。这不是菜单使用的,它使用ClearTypeGridFit。位图也无法工作,您无法使其与渐变背景正确混合。您必须重写ProfessionalToolStripRenderer.DrawItemCheck()。这是一种非常有趣的方法,我首先尝试了它,但发现了一个问题(无法在此处的注释中显示屏幕截图)。虽然它看起来比我管理的要好得多,但从mnuItem.Height x mnuItem.Height生成的qImg比菜单本身略小-不确定在最后将图像分配给mnuItem时是否会发生缩放。但它在文本周围留下了一个边框,渐变没有完全对齐。最后,我采用了@sallushan下面的方法,因为它的代码少得多,文本完全干净。是的,我在发布后注意到了这一点(在我的配色方案中,它不是那么明显,因为它是灰色的)这是因为菜单上渐变的标准宽度是30像素,而创建的位图的大小是24像素,这有点不匹配。这是可以补偿的,但是@sallushan有一个更好的解决方案(我投了更高的票),非常棒——非常棒。我也能够在mnuItem.tag中传递值,并结合来自其他代码的MeasureString调用,所有内容都完美地排列在一起。谢谢
Class CustomToolStripMenuItem
Inherits System.Windows.Forms.ToolStripMenuItem
Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
e.Graphics.DrawString("11", Me.Font, System.Drawing.Brushes.Black, New System.Drawing.PointF(0, 0))
End Sub
End Class