2014-10-11 42 views
0

我想旋转显示中的文本。我试图通过拖动矩形来说明字符串的位置,以说明DrawString方法的区域。RotateTransformed DrawString的位置鼠标

我正在使用RotateTransform和TranslateTransform,它工作正常。但是,拖动时,鼠标光标不会转换为停留在正在拖动的矩形的底角。

我错过了什么......? ;-)

下面是一些示例代码,吸引到基地Windows窗体,可以直接粘贴到Windows窗体

Public Class Form1 
Dim drawingShape As Boolean = False 
Dim mDown, mPos As Point 
Dim bitMap1 As Bitmap 
Dim txt As String = "Hello folks, here is some text" 
Dim angle As Integer = 0 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    bitMap1 = New Bitmap(Me.Width, Me.Height) 
End Sub 

Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles MyBase.Paint 
    If drawingShape Then 
     e.Graphics.RotateTransform(angle, Drawing2D.MatrixOrder.Append) 
     e.Graphics.TranslateTransform(mDown.X, mDown.Y, Drawing2D.MatrixOrder.Append) 
     Dim rect As New Rectangle(0, 0, mPos.X - mDown.X, mPos.Y - mDown.Y) 
     e.Graphics.DrawRectangle(Pens.Red, rect) 
     e.Graphics.DrawString(txt, New Font("Calibri", 12), Brushes.Green, rect) 
     e.Graphics.ResetTransform() 
    End If 
End Sub 

Private Sub Form1_MouseDown(sender As Object, e As MouseEventArgs) Handles MyBase.MouseDown 
    mDown = e.Location 
    drawingShape = True 
End Sub 

Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles MyBase.MouseMove 
    mPos = e.Location 
    Me.Refresh() 
End Sub 

Private Sub Form1_MouseUp(sender As Object, e As MouseEventArgs) Handles MyBase.MouseUp 
    Dim g As Graphics = Graphics.FromImage(bitMap1) 
    g.RotateTransform(angle, Drawing2D.MatrixOrder.Append) 
    g.TranslateTransform(mDown.X, mDown.Y, Drawing2D.MatrixOrder.Append) 
    Dim rect As New Rectangle(0, 0, mPos.X - mDown.X, mPos.Y - mDown.Y) 
    g.DrawString(txt, New Font("Calibri", 12), Brushes.Blue, rect) 
    'g.ResetTransform() 
    g.Dispose() 
    Me.BackgroundImage = bitMap1 
    drawingShape = False 
    angle += 45 
End Sub 

末级

+0

'xxxTransform'变换相关Graphics对象不是整个应用的方面。您需要手动转换鼠标位置。例如,当angle = 90时,MDown == Rect Left,所以只有在向左移动时才会更高。以正常的角度(角度= 0)收集矩形可能更容易(少代码),然后只转换成品;也许使用临时bmp,直到用户说OK。使用TextRender而不是DrawString,文本看起来可能更好。 – Plutonix 2014-10-11 11:38:54

+0

[这个答案](http://stackoverflow.com/q/23623490/1070452)是我刚刚谈论的一个例子,只是一个基本的矩形 – Plutonix 2014-10-11 12:08:05

回答

0

你可以使用“Cursor.X and ‘Cursor.Y将鼠标定位在您想要的位置。

0

感谢您的输入。我最终有它的工作,更新的代码如下。我使用了System.Windows.Vector的矢量例程和System.Windows.Media.Matrix的矩阵。这些提供矩阵乘法功能。不知道这是否被认为是好的做法,因为像Point这样的类与System.Drawing类发生冲突。

注意:这些载体类需要程序通过创建描述由于鼠标按钮被点击的拖动运动矢量来引用WindowsBase

程序工作。因为这个矢量是在拖动文本显示框的同时创建的 - 即该框已被旋转以显示它 - 矢量将被转换回它将绘制正常水平矩形时的情况。该水平矩形(“标准化矩形”)是随后旋转以实现当前拖动的文本显示框。

的代码只需要一个基本的形式来运行

Public Class Form1 
Dim drawingShape As Boolean = False     ' True during mouse-drag 
Dim mDown, mPos As Point       ' Mouse-Button-Down, and current mouse position 
Dim bitMap1 As Bitmap        ' Background display to hold drawn items 
Dim txt As String = "Hello folks, here is some text" 
Dim angle As Integer = 0       ' Angle to rotate text through (0 = along X-axis) 
Dim rect As Rectangle        ' Rectangle holding text - which is then transformed 
Dim vecRectDiag As New Windows.Vector    ' Vector TopLeft-BotRight of rect holding text 
Dim mxIdentWin As System.Windows.Media.Matrix  ' Identity matrix for resetting before rotating 
Dim mxNegAngle As System.Windows.Media.Matrix  ' Matrix to transform mouse cursor vector back to horizontal 
Dim botRight As Point        ' Bottom-right corner of rect rectangle 
Dim mVecWin As New Windows.Vector     ' Vector showing mouse movement since mouse-button-down 
Dim pen1red, pen2yel, pen3turq, pen4lime, pen5corn As Pen 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    bitMap1 = New Bitmap(Me.Width, Me.Height) 
    mxIdentWin = New Windows.Media.Matrix(1, 0, 0, 1, 0, 0)   ' Identity matrix 
End Sub 

Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles MyBase.Paint 
    If drawingShape Then 
     e.Graphics.TranslateTransform(-mDown.X, -mDown.Y, Drawing2D.MatrixOrder.Append) 
     e.Graphics.RotateTransform(angle, Drawing2D.MatrixOrder.Append) 
     e.Graphics.TranslateTransform(mDown.X, mDown.Y, Drawing2D.MatrixOrder.Append) 
     e.Graphics.DrawRectangle(Pens.Red, rect) 
     e.Graphics.DrawString(txt, New Font("Calibri", 12), Brushes.Green, rect) 
     e.Graphics.ResetTransform() 
    End If 
End Sub 

Private Sub Form1_MouseDown(sender As Object, e As MouseEventArgs) Handles MyBase.MouseDown 
    mDown = e.Location     ' Location of mouse button click 
    drawingShape = True 
    mxNegAngle = mxIdentWin    ' Reset the negative-rotate matrix... 
    mxNegAngle.Rotate(-angle)   ' ... and re-rotate with the new angle 
End Sub 

Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles MyBase.MouseMove 
    mPos = e.Location 
    mVecWin = New Windows.Vector(mPos.X - mDown.X, mPos.Y - mDown.Y)  ' Vector showing the real mouse movement 
    vecRectDiag = Windows.Vector.Multiply(mVecWin, mxNegAngle)    ' Vector to the normalised horizontal rectangle - which now needs transforming 
    botRight = New Point(CInt(mDown.X + vecRectDiag.X), CInt(mDown.Y + vecRectDiag.Y))  ' Bottom right of normalised horizontal rectangle 
    rect = New Rectangle(mDown.X, mDown.Y, botRight.X - mDown.X, botRight.Y - mDown.Y) 
    If drawingShape Then Me.Refresh() 
End Sub 

Private Sub Form1_MouseUp(sender As Object, e As MouseEventArgs) Handles MyBase.MouseUp 
    Dim g As Graphics = Graphics.FromImage(bitMap1) 
    g.TranslateTransform(-mDown.X, -mDown.Y, Drawing2D.MatrixOrder.Append) 
    g.RotateTransform(angle, Drawing2D.MatrixOrder.Append) 
    g.TranslateTransform(mDown.X, mDown.Y, Drawing2D.MatrixOrder.Append) 
    g.DrawString(txt, New Font("Calibri", 12), Brushes.Blue, rect) 
    g.ResetTransform() 
    g.Dispose() 
    Me.BackgroundImage = bitMap1 
    drawingShape = False 
    angle += 45 
End Sub 

End Class