C# 自定义绘制(多层)嵌入式TabControls错误
我有一个winform应用程序,它有3层深的tabcontrols。我正在使用下面的类动态地为选项卡着色。当它为嵌入的tabcontrol设置颜色时,它会调整大小C# 自定义绘制(多层)嵌入式TabControls错误,c#,winforms,.net-3.5,tabcontrol,ownerdrawn,C#,Winforms,.net 3.5,Tabcontrol,Ownerdrawn,我有一个winform应用程序,它有3层深的tabcontrols。我正在使用下面的类动态地为选项卡着色。当它为嵌入的tabcontrol设置颜色时,它会调整大小 A first chance exception of type 'System.ComponentModel.Win32Exception' occurred in System.Windows.Forms.dll 我需要为这些做些不同的事情吗?如果我注释掉对tabRenderer的嵌入表单调用,那么我不会得到这些错误。我没有正确
A first chance exception of type 'System.ComponentModel.Win32Exception' occurred in System.Windows.Forms.dll
我需要为这些做些不同的事情吗?如果我注释掉对tabRenderer的嵌入表单调用,那么我不会得到这些错误。我没有正确地处理我的对象吗
这完全是另外一回事吗?我嵌入选项卡控件的方式
我的程序当前外观的示例如下-->
(来源:)
自 如您所见,有3层选项卡控件。这在程序中发生两次,都会导致上述错误。总共有6个对tabRenderer的调用,因为有5个选项卡控件。1个顶级、3个二级和2个三级 用于为选项卡控件着色的代码:
public class psTabRenderer
{
private TabControl _tabControl;
private Color _fillColor;
private Color _selectedFillColor;
private Color _textColor;
private Color _selectedTextColor;
public psTabRenderer(TabControl tabControl, Color fillColor, Color selectedFillColor, Color textColor, Color selectedTextColor)
{
_tabControl = tabControl;
_fillColor = fillColor;
_selectedFillColor = selectedFillColor;
_textColor = textColor;
_selectedTextColor = selectedTextColor;
_tabControl.DrawMode = TabDrawMode.OwnerDrawFixed;
_tabControl.DrawItem += TabControlDrawItem;
}
private void TabControlDrawItem(object sender, DrawItemEventArgs e)
{
TabPage currentTab = _tabControl.TabPages[e.Index];
Rectangle itemRect = _tabControl.GetTabRect(e.Index);
var fillBrush = new SolidBrush(_fillColor);
var textBrush = new SolidBrush(_textColor);
var sf = new StringFormat
{
Alignment = StringAlignment.Center,
LineAlignment = StringAlignment.Center
};
//If we are currently painting the Selected TabItem we'll
//change the brush colors and inflate the rectangle.
if (Convert.ToBoolean(e.State & DrawItemState.Selected))
{
fillBrush.Color = _selectedFillColor;
textBrush.Color = _selectedTextColor;
itemRect.Inflate(2, 2);
}
//Set up rotation for left and right aligned tabs
if (_tabControl.Alignment == TabAlignment.Left || _tabControl.Alignment == TabAlignment.Right)
{
float rotateAngle = 90;
if (_tabControl.Alignment == TabAlignment.Left)
rotateAngle = 270;
var cp = new PointF(itemRect.Left + (itemRect.Width / 2), itemRect.Top + (itemRect.Height / 2));
e.Graphics.TranslateTransform(cp.X, cp.Y);
e.Graphics.RotateTransform(rotateAngle);
itemRect = new Rectangle(-(itemRect.Height / 2), -(itemRect.Width / 2), itemRect.Height, itemRect.Width);
}
//Next we'll paint the TabItem with our Fill Brush
e.Graphics.FillRectangle(fillBrush, itemRect);
//Now draw the text.
e.Graphics.DrawString(currentTab.Text, e.Font, textBrush, (RectangleF)itemRect, sf);
//Reset any Graphics rotation
e.Graphics.ResetTransform();
//Finally, we should Dispose of our brushes.
fillBrush.Dispose();
textBrush.Dispose();
}
}
我这样称呼它:
private void frmMCPEmployment_Load(object sender, EventArgs e)
{
FormPaint();
}
public void FormPaint()
{
// ToDo: This call to the Tab Renderer is throwing a Win32 "Error Creating Window Handle"
new psTabRenderer(tclEmployment, Color.LightSteelBlue, Color.Khaki, Color.Black, Color.Black);
}
好的,我回答了我自己的问题 我相信,当我的应用程序加载时,它开始触发每个Forms Load()事件,然后触发它的嵌入式Forms Load()事件,以此类推。我在load事件中抛出了对TabRenderer的调用,发生了一些我不理解的事情。我将调用调出一个PaintTabs()函数,然后等待第一个函数完成,然后再调用下一个函数(我想是吧?) 无论哪种方式,它都不再产生任何错误。我现在从顶级TabControl中这样称呼它:
public void PaintTabs()
{
new psTabRenderer(tclWWCModuleHost, Color.LightSteelBlue, Color.Khaki, Color.Black, Color.Black);
FrmWwcMemberHost.PaintTabs();
FrmWwcMcpHost.PaintTabs();
FrmCaseNotes.PaintTabs();
}