【问题标题】:Vertical Text on Right-Aligned TabControl右对齐 TabControl 上的垂直文本
【发布时间】:2010-01-08 20:21:01
【问题描述】:

试图让 tabcontrol 的每个选项卡上的文本垂直显示。因为我从来没有涉足过控制,什么不是,我有点卡住了。找到了一些代码来让文本显示为好像它向左旋转一样。我希望它显示为好像它在选项卡上向右(垂直)旋转。骨架代码如下:

Protected Sub OnDrawItem(ByVal sender As Object, ByVal e As DrawItemEventArgs) Handles TabControl1.DrawItem
    'MyBase.OnDrawItem(e)'
    Dim tc As TabControl = DirectCast(sender, TabControl)
    Dim g As Graphics = e.Graphics
    Dim rectf As RectangleF
    Dim isVertical As Boolean = (tc.Alignment > TabAlignment.Bottom)
    Dim off As Integer = 1 : If (e.State And sel) = sel Then off = -1
    Dim textFormat As New StringFormat(StringFormatFlags.NoClip _
                               Or StringFormatFlags.NoWrap)
    With textFormat
        .HotkeyPrefix = System.Drawing.Text.HotkeyPrefix.Show
        .Alignment = StringAlignment.Center
        .LineAlignment = StringAlignment.Center
    End With


    With e.Bounds
        If isVertical Then
            ' tabs are aligned left or right'
            If tc.Alignment = TabAlignment.Left Then
                Dim m As New System.Drawing.Drawing2D.Matrix
                m.Translate(0, .Height - tc.TabPages(0).Top)
                m.RotateAt(270, New PointF(.X, .Y))
                g.Transform = m
                rectf = New RectangleF(.Left - tc.TabPages(0).Top, .Top + off, _
                                       .Height, .Width)
            ElseIf tc.Alignment = TabAlignment.Right Then
                'Dim m As New System.Drawing.Drawing2D.Matrix'
                'm.Translate(0, .Height - tc.TabPages(0).Top)'
                'm.RotateAt(270, New PointF(.X, .Y))'
                'g.Transform = m'
                'rectf = New RectangleF(.Left - tc.TabPages(0).Top, .Top + off, _'
                '                       .Height, .Width)'
                ' Here is where the tab should go to rotate the text about 180 degrees'
            End If
        Else
            ' tabs are aligned top or bottom'
            rectf = New RectangleF(.X, .Y + off, .Width, .Height)
        End If
    End With


    Dim col As Color
    Select Case (e.State And notsf)
        Case DrawItemState.Disabled
            col = SystemColors.GrayText
        Case DrawItemState.HotLight
            col = SystemColors.HotTrack
        Case Else
            col = SystemColors.MenuText
    End Select


    g.DrawString(tc.TabPages(e.Index).Text, _
                 tc.Font, _
                 New SolidBrush(col), _
                 rectf, _
                 textFormat)

    If isVertical Then g.ResetTransform()

    If (e.State And selfoc) = selfoc Then
        ControlPaint.DrawFocusRectangle(g, _
                  [Rectangle].Inflate(e.Bounds, -1, -1))
    End If
    textFormat.Dispose()
End Sub 

【问题讨论】:

    标签: winforms tabcontrol ownerdrawn ondrawitem


    【解决方案1】:

    我假设您正在使用 XAML,这可以通过样式实现

    添加这些样式:

        <!-- Simple Splitter Style -->
        <Style x:Key="SimpleSplitterStyle" TargetType="controls:GridSplitter">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="controls:GridSplitter">
                        <Grid x:Name="Root" IsHitTestVisible="{TemplateBinding IsEnabled}">
                            <Rectangle Fill="{TemplateBinding Background}" StrokeThickness="0"/>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    
        <!-- Tab Item Header (Right) -->
        <Style x:Key="RightTabItemHeader" TargetType="ContentControl">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ContentControl">
                        <ContentPresenter Cursor="{TemplateBinding Cursor}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" ContentTemplate="{TemplateBinding ContentTemplate}">
                            <layout:LayoutTransformer >
                                <layout:LayoutTransformer.LayoutTransform>
                                    <RotateTransform Angle="90"/>
                                </layout:LayoutTransformer.LayoutTransform>
                                <ContentPresenter Margin="5,0,5,0" />
                            </layout:LayoutTransformer>
                        </ContentPresenter>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    
        <!-- Tab Item Header (Left) -->
        <Style x:Key="LeftTabItemHeader" TargetType="ContentControl">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ContentControl">
                        <ContentPresenter Cursor="{TemplateBinding Cursor}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" ContentTemplate="{TemplateBinding ContentTemplate}">
                            <layout:LayoutTransformer >
                                <layout:LayoutTransformer.LayoutTransform>
                                    <RotateTransform Angle="-90"/>
                                </layout:LayoutTransformer.LayoutTransform>
                                <ContentPresenter Margin="5,0,5,0" />
                            </layout:LayoutTransformer>
                        </ContentPresenter>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    
        <!-- Tab Item Style -->
        <Style x:Key="TabItemStyle" TargetType="controls:TabItem">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="controls:TabItem">
                        <Grid x:Name="Root">
                            <Grid x:Name="TemplateTopSelected" Visibility="Collapsed" Canvas.ZIndex="1">
                                <Border Margin="-2,-2,-2,0" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1,1,1,0" CornerRadius="3,3,0,0">
                                    <Border BorderBrush="#FFFFFFFF" BorderThickness="1" CornerRadius="1,1,0,0">
                                        <Border.Background>
                                            <LinearGradientBrush EndPoint=".7,1" StartPoint=".7,0">
                                                <GradientStop Color="#FFFFFFFF" Offset="0"/>
                                                <GradientStop Color="#F9FFFFFF" Offset="0.375"/>
                                                <GradientStop Color="#E5FFFFFF" Offset="0.625"/>
                                                <GradientStop Color="#C6FFFFFF" Offset="1"/>
                                            </LinearGradientBrush>
                                        </Border.Background>
                                        <Grid>
                                            <Rectangle Fill="#FFFFFFFF" Margin="0,0,0,-2"/>
                                            <ContentControl x:Name="HeaderTopSelected" FontSize="{TemplateBinding FontSize}" Foreground="{TemplateBinding Foreground}" IsTabStop="False" Cursor="{TemplateBinding Cursor}" HorizontalAlignment="{TemplateBinding HorizontalAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalAlignment}"/>
                                        </Grid>
                                    </Border>
                                </Border>
                                <Border x:Name="FocusVisualTop" Margin="-2,-2,-2,0" IsHitTestVisible="false" Visibility="Collapsed" BorderBrush="#FF6DBDD1" BorderThickness="1,1,1,0" CornerRadius="3,3,0,0"/>
                                <Border x:Name="DisabledVisualTopSelected" Margin="-2,-2,-2,0" IsHitTestVisible="false" Opacity="0" Background="#8CFFFFFF" CornerRadius="3,3,0,0"/>
                            </Grid>
                            <Grid x:Name="TemplateTopUnselected" Visibility="Collapsed">
                                <Border x:Name="BorderTop" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1" CornerRadius="3,3,0,0">
                                    <Border x:Name="GradientTop" BorderBrush="#FFFFFFFF" BorderThickness="1" CornerRadius="1,1,0,0">
                                        <Border.Background>
                                            <LinearGradientBrush EndPoint=".7,1" StartPoint=".7,0">
                                                <GradientStop Color="#FFFFFFFF" Offset="0"/>
                                                <GradientStop Color="#F9FFFFFF" Offset="0.375"/>
                                                <GradientStop Color="#E5FFFFFF" Offset="0.625"/>
                                                <GradientStop Color="#C6FFFFFF" Offset="1"/>
                                            </LinearGradientBrush>
                                        </Border.Background>
                                        <Grid>
                                            <ContentControl x:Name="HeaderTopUnselected" FontSize="{TemplateBinding FontSize}" Foreground="{TemplateBinding Foreground}" IsTabStop="False" Cursor="{TemplateBinding Cursor}" HorizontalAlignment="{TemplateBinding HorizontalAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalAlignment}"/>
                                        </Grid>
                                    </Border>
                                </Border>
                                <Border x:Name="DisabledVisualTopUnSelected" IsHitTestVisible="false" Opacity="0" Background="#8CFFFFFF" CornerRadius="3,3,0,0"/>
                            </Grid>
                            <Grid x:Name="TemplateBottomSelected" Visibility="Collapsed" Canvas.ZIndex="1">
                                <Border Margin="-2,0,-2,-2" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1,0,1,1" CornerRadius="0,0,3,3">
                                    <Border BorderBrush="#FFFFFFFF" BorderThickness="1" CornerRadius="0,0,1,1">
                                        <Border.Background>
                                            <LinearGradientBrush EndPoint=".7,1" StartPoint=".7,0">
                                                <GradientStop Color="#FFFFFFFF" Offset="0"/>
                                                <GradientStop Color="#F9FFFFFF" Offset="0.375"/>
                                                <GradientStop Color="#E5FFFFFF" Offset="0.625"/>
                                                <GradientStop Color="#C6FFFFFF" Offset="1"/>
                                            </LinearGradientBrush>
                                        </Border.Background>
                                        <Grid>
                                            <Rectangle Fill="#FFFFFFFF" Margin="0,-2,0,0"/>
                                            <ContentControl x:Name="HeaderBottomSelected" FontSize="{TemplateBinding FontSize}" Foreground="{TemplateBinding Foreground}" IsTabStop="False" Cursor="{TemplateBinding Cursor}" HorizontalAlignment="{TemplateBinding HorizontalAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalAlignment}"/>
                                        </Grid>
                                    </Border>
                                </Border>
                                <Border x:Name="FocusVisualBottom" Margin="-2,0,-2,-2" IsHitTestVisible="false" Visibility="Collapsed" BorderBrush="#FF6DBDD1" BorderThickness="1,0,1,1" CornerRadius="0,0,3,3"/>
                                <Border x:Name="DisabledVisualBottomSelected" Margin="-2,0,-2,-2" IsHitTestVisible="false" Opacity="0" Background="#8CFFFFFF" CornerRadius="0,0,3,3"/>
                            </Grid>
                            <Grid x:Name="TemplateBottomUnselected" Visibility="Collapsed">
                                <Border x:Name="BorderBottom" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1" CornerRadius="0,0,3,3">
                                    <Border x:Name="GradientBottom" BorderBrush="#FFFFFFFF" BorderThickness="1" CornerRadius="0,0,1,1">
                                        <Border.Background>
                                            <LinearGradientBrush EndPoint=".7,1" StartPoint=".7,0">
                                                <GradientStop Color="#FFFFFFFF" Offset="0"/>
                                                <GradientStop Color="#F9FFFFFF" Offset="0.375"/>
                                                <GradientStop Color="#E5FFFFFF" Offset="0.625"/>
                                                <GradientStop Color="#C6FFFFFF" Offset="1"/>
                                            </LinearGradientBrush>
                                        </Border.Background>
                                        <Grid>
                                            <ContentControl x:Name="HeaderBottomUnselected" FontSize="{TemplateBinding FontSize}" Foreground="{TemplateBinding Foreground}" IsTabStop="False" Cursor="{TemplateBinding Cursor}" HorizontalAlignment="{TemplateBinding HorizontalAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalAlignment}"/>
                                        </Grid>
                                    </Border>
                                </Border>
                                <Border x:Name="DisabledVisualBottomUnSelected" IsHitTestVisible="false" Opacity="0" Background="#8CFFFFFF" CornerRadius="0,0,3,3"/>
                            </Grid>
                            <Grid x:Name="TemplateLeftSelected" Visibility="Collapsed" Canvas.ZIndex="1">
                                <Border Margin="-2,-2,0,-2" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1,1,0,1" CornerRadius="3,0,0,3">
                                    <Border BorderBrush="#FFFFFFFF" BorderThickness="1" CornerRadius="1,0,0,1">
                                        <Border.Background>
                                            <LinearGradientBrush EndPoint=".7,1" StartPoint=".7,0">
                                                <GradientStop Color="#FFFFFFFF" Offset="0"/>
                                                <GradientStop Color="#F9FFFFFF" Offset="0.375"/>
                                                <GradientStop Color="#E5FFFFFF" Offset="0.625"/>
                                                <GradientStop Color="#C6FFFFFF" Offset="1"/>
                                            </LinearGradientBrush>
                                        </Border.Background>
                                        <Grid>
                                            <Rectangle Fill="#FFFFFFFF" Margin="0,0,-2,0"/>
                                            <ContentControl x:Name="HeaderLeftSelected" FontSize="{TemplateBinding FontSize}" Foreground="{TemplateBinding Foreground}" IsTabStop="False" Cursor="{TemplateBinding Cursor}" HorizontalAlignment="{TemplateBinding HorizontalAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalAlignment}" Style="{StaticResource LeftTabItemHeader}"/>
                                        </Grid>
                                    </Border>
                                </Border>
                                <Border x:Name="FocusVisualLeft" Margin="-2,-2,0,-2" IsHitTestVisible="false" Visibility="Collapsed" BorderBrush="#FF6DBDD1" BorderThickness="1,1,0,1" CornerRadius="3,0,0,3"/>
                                <Border x:Name="DisabledVisualLeftSelected" Margin="-2,-2,0,-2" IsHitTestVisible="false" Opacity="0" Background="#8CFFFFFF" CornerRadius="3,0,0,3"/>
                            </Grid>
                            <Grid x:Name="TemplateLeftUnselected" Visibility="Collapsed">
                                <Border x:Name="BorderLeft" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="3,0,0,3">
                                    <Border x:Name="GradientLeft" BorderBrush="#FFFFFFFF" BorderThickness="1" CornerRadius="1,0,0,1">
                                        <Border.Background>
                                            <LinearGradientBrush EndPoint=".7,1" StartPoint=".7,0">
                                                <GradientStop Color="#FFFFFFFF" Offset="0"/>
                                                <GradientStop Color="#F9FFFFFF" Offset="0.375"/>
                                                <GradientStop Color="#E5FFFFFF" Offset="0.625"/>
                                                <GradientStop Color="#C6FFFFFF" Offset="1"/>
                                            </LinearGradientBrush>
                                        </Border.Background>
                                        <Grid>
                                            <ContentControl x:Name="HeaderLeftUnselected" FontSize="{TemplateBinding FontSize}" Foreground="{TemplateBinding Foreground}" IsTabStop="False" Cursor="{TemplateBinding Cursor}" HorizontalAlignment="{TemplateBinding HorizontalAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalAlignment}" Style="{StaticResource LeftTabItemHeader}"/>
                                        </Grid>
                                    </Border>
                                </Border>
                                <Border x:Name="DisabledVisualLeftUnSelected" IsHitTestVisible="false" Opacity="0" Background="#8CFFFFFF" CornerRadius="3,0,0,3"/>
                            </Grid>
                            <Grid x:Name="TemplateRightSelected" Visibility="Collapsed" Canvas.ZIndex="1">
                                <Border Margin="0,-2,-2,-2" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="0,1,1,1" CornerRadius="0,3,3,0">
                                    <Border BorderBrush="#FFFFFFFF" BorderThickness="1" CornerRadius="0,1,1,0">
                                        <Border.Background>
                                            <LinearGradientBrush EndPoint=".7,1" StartPoint=".7,0">
                                                <GradientStop Color="#FFFFFFFF" Offset="0"/>
                                                <GradientStop Color="#F9FFFFFF" Offset="0.375"/>
                                                <GradientStop Color="#E5FFFFFF" Offset="0.625"/>
                                                <GradientStop Color="#C6FFFFFF" Offset="1"/>
                                            </LinearGradientBrush>
                                        </Border.Background>
                                        <Grid>
                                            <Rectangle Fill="#FFFFFFFF" Margin="-2,0,0,0"/>
                                            <ContentControl x:Name="HeaderRightSelected" FontSize="{TemplateBinding FontSize}" Foreground="{TemplateBinding Foreground}" IsTabStop="False" Cursor="{TemplateBinding Cursor}" HorizontalAlignment="{TemplateBinding HorizontalAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalAlignment}" Style="{StaticResource RightTabItemHeader}"/>
                                        </Grid>
                                    </Border>
                                </Border>
                                <Border x:Name="FocusVisualRight" Margin="0,-2,-2,-2" IsHitTestVisible="false" Visibility="Collapsed" BorderBrush="#FF6DBDD1" BorderThickness="0,1,1,1" CornerRadius="0,3,3,0"/>
                                <Border x:Name="DisabledVisualRightSelected" Margin="0,-2,-2,-2" IsHitTestVisible="false" Opacity="0" Background="#8CFFFFFF" CornerRadius="0,3,3,0"/>
                            </Grid>
                            <Grid x:Name="TemplateRightUnselected" Visibility="Collapsed">
                                <Border x:Name="BorderRight" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1" CornerRadius="0,3,3,0">
                                    <Border x:Name="GradientRight" BorderBrush="#FFFFFFFF" BorderThickness="1" CornerRadius="0,1,1,0">
                                        <Border.Background>
                                            <LinearGradientBrush EndPoint=".7,1" StartPoint=".7,0">
                                                <GradientStop Color="#FFFFFFFF" Offset="0"/>
                                                <GradientStop Color="#F9FFFFFF" Offset="0.375"/>
                                                <GradientStop Color="#E5FFFFFF" Offset="0.625"/>
                                                <GradientStop Color="#C6FFFFFF" Offset="1"/>
                                            </LinearGradientBrush>
                                        </Border.Background>
                                        <Grid>
                                            <ContentControl x:Name="HeaderRightUnselected" FontSize="{TemplateBinding FontSize}" Foreground="{TemplateBinding Foreground}" IsTabStop="False" Cursor="{TemplateBinding Cursor}" HorizontalAlignment="{TemplateBinding HorizontalAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalAlignment}" Style="{StaticResource RightTabItemHeader}"/>
                                        </Grid>
                                    </Border>
                                </Border>
                                <Border x:Name="DisabledVisualRightUnSelected" IsHitTestVisible="false" Opacity="0" Background="#8CFFFFFF" CornerRadius="0,3,3,0"/>
                            </Grid>
                            <Border x:Name="FocusVisualElement" Margin="-1" IsHitTestVisible="false" Visibility="Collapsed" BorderBrush="#FF6DBDD1" BorderThickness="1" CornerRadius="3,3,0,0"/>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    

    然后您可以将其分配给每个选项卡项:

                <controls:TabControl TabStripPlacement="Right" Margin="4">
                <controls:TabItem Header="First" Style="{StaticResource TabItemStyle}">
                    <controls:TreeView>
                        <controls:TreeViewItem Header="Parent 1" />
                        <controls:TreeViewItem Header="Parent 2">
                            <controls:TreeViewItem Header="Child 1">
                                <controls:TreeViewItem Header="Grandchild 1" />
                            </controls:TreeViewItem>
                        </controls:TreeViewItem>
                        <controls:TreeViewItem Header="Parent 3">
                            <controls:TreeViewItem Header="Child 1">
                                <controls:TreeViewItem Header="Grandchild 1" />
                                <controls:TreeViewItem Header="Grandchild 2" />
                            </controls:TreeViewItem>
                        </controls:TreeViewItem>
                    </controls:TreeView>
                </controls:TabItem>
                <controls:TabItem Header="Second" Style="{StaticResource TabItemStyle}">
                    <controls:TreeView>
                        <controls:TreeViewItem Header="Parent 1" />
                        <controls:TreeViewItem Header="Parent 2">
                            <controls:TreeViewItem Header="Child 1">
                                <controls:TreeViewItem Header="Grandchild 1" />
                            </controls:TreeViewItem>
                        </controls:TreeViewItem>
                        <controls:TreeViewItem Header="Parent 3">
                            <controls:TreeViewItem Header="Child 1">
                                <controls:TreeViewItem Header="Grandchild 1" />
                                <controls:TreeViewItem Header="Grandchild 2" />
                            </controls:TreeViewItem>
                        </controls:TreeViewItem>
                        <controls:TreeViewItem Header="Parent 4">
                            <controls:TreeViewItem Header="Child 1">
                                <controls:TreeViewItem Header="Grandchild 1" />
                                <controls:TreeViewItem Header="Grandchild 2" />
                                <controls:TreeViewItem Header="Grandchild 3" />
                                <controls:TreeViewItem Header="Grandchild 4" />
                                <controls:TreeViewItem Header="Grandchild 5" />
                                <controls:TreeViewItem Header="Grandchild 6" />
                                <controls:TreeViewItem Header="Grandchild 7" />
                                <controls:TreeViewItem Header="Grandchild 8" />
                            </controls:TreeViewItem>
                        </controls:TreeViewItem>
                    </controls:TreeView>
                </controls:TabItem>
            </controls:TabControl>
    

    现在您可以从上/下/右/左更改,文本将在右/左垂直。在这个例子中我只留下了顶部和底部,但这应该会给你很多关于如何控制这些选项卡的想法。

    【讨论】:

      【解决方案2】:

      我不使用 VB 或 WinForms,因此以下内容不会出现在代码中并包含一些猜测。如果没有屏幕截图,也很难从描述中知道与您想要的内容有什么不同。我是否认为您只是希望标签的标题文本以另一种方式旋转 180 度,即文本的“顶部”靠在标签的左侧或标签的右侧,无论现在不是哪个?

      If tc.Alignment = TabAlignment.Right Then ... 分支中,RotateAt 调用正在旋转您的文本:

      m.RotateAt(270, New PointF(.X, .Y))
      

      您需要将 270 更改为 90 以使文本向另一个方向旋转。

      (您熟悉设置这样的转换矩阵吗?同样的原则适用于 OpenGL 或 DirectX 编程。如果不熟悉,请发表评论,我会解释/链接。)

      如果您只是这样做,那么文本很可能是不可见的,因为它会被旋转到您正在绘制的位图之外。您需要翻译它,使文本的开头位于右上角。这就是我上面提到的猜测出现的地方:我不熟悉您正在使用的图形框架的坐标系,所以我不知道要翻译哪个方向。很抱歉,我不能给你工作代码,但我只是没有 Visual Studio 和 .Net Winforms 控件来试验:) 我可以看到你已经在做这些事情了:

      m.Translate(0, .Height - tc.TabPages(0).Top)
      

      我的猜测是您需要更改此设置,使 X 坐标 (0) 为 .Width.Width - [text height, calculate this],并且您可能还需要考虑 Y 坐标中的文本宽度。 (文本“高度”和“宽度”就好像文本是水平/正常绘制的。)我很确定.Net的绘图框架可能包括GraphicsTextHeight(...)TextWidth(...)方法,如果没有我相信这些名字很容易找到 :) TextRect() 也许?

      (如果我坐在你的电脑前并试图通过纯粹的猜测来解决这个问题,我会编写这段代码,以便它在一个大位图的中间旋转文本,修改它使其位于左上角位图在一个选项卡大小的矩形内的正确位置,然后将代码移动到选项卡绘图方法。省去了有一个小选项卡并运行它并在它不可见时进入“我的文本在哪里?”的所有麻烦,因为它被绘制在错误的坐标处。)

      【讨论】:

        猜你喜欢
        • 2013-09-07
        • 1970-01-01
        • 2012-02-24
        • 1970-01-01
        • 1970-01-01
        • 2021-06-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多