2014-04-24 7 views
4

vb.net 2010의 메뉴 항목의 왼쪽 여백에 숫자를 넣고 싶습니다만 이미지에만 설정할 수있는 것 같습니다. 그래서, 난 거기에 원하는 번호로 이미지를 만들려고 노력했습니다. Graphics.DrawString(). 다양한 방법을 시도했지만 결과 이미지를 메뉴 항목 자체의 텍스트처럼 보이게 할 수는 없습니다.이 방법이 있습니까? 여기에 현재 코드가 있습니다. 텍스트를 측정하기 위해 이미지를 할당 한 다음 올바른 크기로 다시 할당하는 것은 버전 3에 관한 것입니다. 꽤 못 생겼지 만 측정 방법을 모르겠습니다. 여기 vb.net에서 메뉴 항목과 일치하는 텍스트 그리기

mnuItem = New ToolStripMenuItem 
numPeople = CInt(Math.Ceiling(Rnd() * 20)) 

' Calculate the size of the text 
qImg = New Bitmap(1, 1) 
sf.Alignment = StringAlignment.Center 
sf.LineAlignment = StringAlignment.Center 
gr = Graphics.FromImage(qImg) 
gr.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias 
sz = gr.MeasureString(numPeople, mnuItem.Font, New Point(0, 0), sf) 
w = CInt(Math.Ceiling(sz.Width)) 
h = CInt(Math.Ceiling(sz.Height)) 
m = Math.Max(w, h) 

' Now allocate an image of the correct size 
qImg = New Bitmap(m, m) 
gr = Graphics.FromImage(qImg) 
gr.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias 
gr.DrawString(numPeople, mnuItem.Font, Brushes.Black, New RectangleF((m - w)/2, (m - h)/2, w, h), sf) 

mnuItem.Image = qImg 

이주는 무엇의 몇 가지 예입니다 - 메뉴 항목 텍스트를 비교하는 방법을 퍼지 여백 텍스트 (이미지)주의 : 나는 시도했다

Example menu with fuzzy textExample menu with fuzzy text

모든 TextRenderingHint 옵션을 사용하고 일부는 다른 것보다 낫지 만 메뉴 텍스트를 선명하게 보여주는 것도 없습니다. 그 모양에 더 가까워 질 수있는 방법이 있습니까?

+0

당신이하여 drawString을 위해 다른 브러쉬 나 폰트를 시도하십시오 ("다른 이름으로 저장"항목) 내 시스템에 다음과 같이 나타납니다()? – TimG

+0

'DrawString'의 브러쉬 선택은 색상을 변경하는 것으로 제한됩니다. 글꼴에 관해서는 메뉴 텍스트와 일치 시키려면 메뉴의 글꼴을 사용하는 것이 가장 좋은 방법이라고 생각합니다. 그렇지 않은 경우입니까? – dsl101

+0

System.Drawing.Brush 클래스의 모든 기능을 시도하지 않았습니다. Brushes와 같을 것입니다 .Black은 Brush 또는 SolidBrush와 같지만 결코 알 수 없습니다. TextRenderer로 승자를 얻은 것 같습니다. 명성. – TimG

답변

1

은 당신이 당신의 자신의 ToolStripMenuItem을 만드는 시도 해 봤나 클래스의 상단에있는 Imports System.Drawing.Drawing2D 라인이 필요합니다?

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 

제대로 표시하려면 계산을 수행하지 않지만 가능한 것으로 생각합니다. 그것은

enter image description here

+0

환상적 - 대우를받습니다. mnuItem.tag의 값도 전달할 수 있었고 다른 코드의 MeasureString 호출과 결합하여 모든 것이 완벽하게 정렬되었습니다. 감사! – dsl101

1

이것은 나를 당황하게했고, 배경색을 추가하자마자 텍스트가 원하는대로 표시되기 때문에 버그라고 결론 내릴 수 있습니다.

해결책이 있습니다. Professional Colors 클래스에서 파생 된 그라데이션 브러시를 사용하여 텍스트를 그리기 전에 비트 맵 배경에 사각형을 그립니다.

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 

enter image description here

당신은

+0

정말 재미있는 접근 방법이며, 먼저 시도했지만 문제가 발견되었습니다 (여기에 설명에 스크린 샷을 넣을 수는 없습니다). 비록 내가 관리했던 것보다 훨씬 좋았지 만, mnuItem.Height x mnuItem.Height에서 생성 된 qImg는 메뉴 자체보다 약간 작았습니다. 결국 이미지가 mnuItem에 할당 될 때 축소가 발생하는지 확실하지 않았습니다. 그러나 그라디언트가 정렬되지 않은 텍스트 주위에 경계선을 남겼습니다. 결국 코드와 텍스트가 완전히 깨끗해 졌기 때문에 아래의 @ sallushan의 메소드를 사용했다. – dsl101

+0

예 게시 한 후 눈치 채지 못한 것으로 나타났습니다 (그레이의 음영이기 때문에 색 구성표에서 눈에 띄지 않습니다). 메뉴의 그래디언트 표준 너비가 30 픽셀이고 작성된 비트 맵의 ​​크기가 24 픽셀이므로 약간의 불일치. 이것은 보상받을 수 있지만 @sallushan은 훨씬 더 좋은 해결책을 가지고 있습니다 (나는 그것을 upvoted했습니다) –