나는 OwnerDrawFixeddraw 에 다음 기본 매개 변수와 정상DrawMode하지만 하여 drawString 방법 탭 타이틀을 을 TabControl가하는 같은 방법을 그리는 다른 결과를 제공 DrawMode을 설정하려합니다.TabControl의 탭에 텍스트를 그리는 방법은 TabControl과 똑같은 방법입니까?
아래 예제에서 텍스트가 으로 설정된 경우 Lorem ipsum 작동하지만 숫자로 설정하면 탭 영역 외부로 그려집니다. 그러나 TabControl 으로 DrawMode은 모든 것을 정확하게 그립니다. 수동으로 동일한 작업을 수행하는 방법은 무엇입니까?
using System.Drawing;
using System.Windows.Forms;
namespace TabWidthIssue
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
//var text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."; // Works fine!
var text = "1234567890-1234567890-1234567890-1234567890-1234567890-123456789X"; // Does not fit!
// TabControl with OwnerDrawFixed
var ownerDrawFixedTabControl = new TabControl()
{
DrawMode = TabDrawMode.OwnerDrawFixed,
Parent = this,
Dock = DockStyle.Top,
};
ownerDrawFixedTabControl.DrawItem += new DrawItemEventHandler(ownerDrawFixedTabControl_DrawItem);
ownerDrawFixedTabControl.TabPages.Add(new TabPage(text));
// TabControl with Normal
var normalTabControl = new TabControl()
{
DrawMode = TabDrawMode.Normal,
Parent = this,
Dock = DockStyle.Top,
};
normalTabControl.TabPages.Add(new TabPage(text));
}
void ownerDrawFixedTabControl_DrawItem(object sender, DrawItemEventArgs e)
{
var tabControl = sender as TabControl;
var tabPage = tabControl.TabPages[e.Index];
var format = new StringFormat
{
FormatFlags = StringFormatFlags.NoWrap,
Trimming = StringTrimming.None
};
using (var brush = new SolidBrush(Color.Black))
e.Graphics.DrawString(tabPage.Text, e.Font, brush, tabControl.GetTabRect(e.Index), format);
}
}
}
업데이트 1 "텍스트 그리기"의 작업은 같은 방법은 "텍스트 같은 방법으로 측정"에 의해 대체 될 수있다. 나는 그려야 할 텍스트의 크기를 알기 때문에 (DrawString
또는 DrawText
) 탭이 충분히 넓어야합니다. 너비는 TextRenderer.MeasureText
에서 생성 된 탭의 실제 너비와 일치하지 않습니다.
보기를 사용하여 [이 (http://stackoverflow.com/q/7268238/1997232). – Sinatr
모든 네이티브 컨트롤은 TextRenderer.DrawText()를 사용하여 텍스트를 렌더링합니다. DrawString()과 약간 다릅니다. 그렇지 않으면 탭이 텍스트에 맞게 충분히 넓은 지 확인하는 것이 좋습니다. 그 문자열처럼 대단히 비현실적인 것을 피하십시오. –
@HansPassant 탭의 너비는 텍스트를 기반으로 자동 계산됩니다. 탭 너비를 명시 적으로 지정하는 다른 방법이 있습니다 (다른 너비의 탭이 필요하기 때문에 'ItemSize'속성 제외). – Eugene