How to possible to find out the number of rows painted in the WinForms TabControlAdv?
Count the painted rows in TabControlAdv
It is possible by deriving TabControlAdv and count the number of rows when TabPageAdv is painted.
C#
public int GetNumOfRows()
{
float minHeight = 0, currentLineHeight = 0, maxHeight = 0;
int rows = 1;
SizeF preferedTabSize = SizeF.Empty;
SizeF overlappedSize = SizeF.Empty;
Graphics g = this.CreateGraphics();
SizeF prefSize = new SizeF(this.ClientRectangle.Width, this.ClientRectangle.Height);
overlappedSize = TabRendererFactory.GetRegisteredExtender
(this.m_tabPanelRenderer.TabPanelData.TabStyle).GetOverlapSize(this.m_tabPanelRenderer.TabPanelData.TabSize);
overlappedSize.Height += this.m_tabPanelRenderer.TabPanelData.AdjustTopGap;
float usedUpLineWidth = overlappedSize.Width;
float availableWidth = prefSize.Width;
int i=0;
foreach (ITabRenderer render in this.m_tabPanelRenderer.Renderers)
{
preferedTabSize = ((ITabRenderer)this.m_tabPanelRenderer.Renderers[i]).GetPreferredSize(g);
if (preferedTabSize.Width + usedUpLineWidth <= availableWidth || usedUpLineWidth <= overlappedSize.Width)
{
// enough space available in current line
usedUpLineWidth += preferedTabSize.Width;
}
else
{
// move to next line
minHeight += currentLineHeight;
rows++;
// This item becomes the first item in the new line
usedUpLineWidth = overlappedSize.Width + preferedTabSize.Width;
if (maxHeight < currentLineHeight)
maxHeight = currentLineHeight;
currentLineHeight = 0F;
}
if (currentLineHeight < preferedTabSize.Height)
currentLineHeight = preferedTabSize.Height;
i++;
}
return rows;
}
public bool ShouldDrawVisible(ITabData tdata)
{
return (tdata.TabVisible);
}
VB
Public Function GetNumOfRows() As Integer Dim minHeight As Single = 0, currentLineHeight As Single = 0, maxHeight As Single = 0 Dim rows As Integer = 1 Dim preferedTabSize As SizeF = SizeF.Empty Dim overlappedSize As SizeF = SizeF.Empty Dim g As Graphics = Me.CreateGraphics() Dim prefSize As SizeF = New SizeF(Me.ClientRectangle.Width, Me.ClientRectangle.Height) overlappedSize = TabRendererFactory.GetRegisteredExtender (Me.m_tabPanelRenderer.TabPanelData.TabStyle).GetOverlapSize(Me.m_tabPanelRenderer.TabPanelData.TabSize) overlappedSize.Height += Me.m_tabPanelRenderer.TabPanelData.AdjustTopGap Dim usedUpLineWidth As Single = overlappedSize.Width Dim availableWidth As Single = prefSize.Width Dim i As Integer=0 For Each render As ITabRenderer In Me.m_tabPanelRenderer.Renderers preferedTabSize = (CType(Me.m_tabPanelRenderer.Renderers(i), ITabRenderer)).GetPreferredSize(g) If preferedTabSize.Width + usedUpLineWidth <= availableWidth OrElse usedUpLineWidth <= overlappedSize.Width Then '' enough space available in current line usedUpLineWidth += preferedTabSize.Width Else '' move to next line minHeight += currentLineHeight rows += 1 '' This item becomes the first item in the new line usedUpLineWidth = overlappedSize.Width + preferedTabSize.Width If maxHeight < currentLineHeight Then maxHeight = currentLineHeight End If currentLineHeight = 0F End If If currentLineHeight < preferedTabSize.Height Then currentLineHeight = preferedTabSize.Height End If i += 1 Next render Return rows End Function Public Function ShouldDrawVisible(ByVal tdata As ITabData) As Boolean Return (tdata.TabVisible) End Function