【发布时间】:2014-09-28 05:48:00
【问题描述】:
我正在编写一个可视化应用程序:它从 XML 加载建筑几何图形并将其绘制在屏幕上。 建筑物由矩形房间组成,其中很多 - 所以我想在上面画上他们的名字。
我使用this 教程在我的表单中翻转 Y 轴,因为构建存储在笛卡尔坐标中的数据。并将它们全部转换为经典的 Windows“y 成长”系统,而绘图看起来很奇怪。
我还需要缩放并将我的“场景”翻译到左下角。
而且,我最后的痛苦,我需要再次翻转我的文字 - 因为它也会翻转!
正如tutorial 所说,我需要:
- 翻转 Y 轴、缩放并将场景移动到所需位置
- 在笛卡尔坐标系中绘制建筑几何体(只是矩形)
- 返回“Y 向下增长”系统,再次缩放和移动
- 在这个“经典”系统中绘制文本
但文字坐标无效!
它们从正确的位置向下移动 :(
所以这是我的问题 - 如何正确计算 Windows 窗体对象中的新文本坐标。
void VisualizerForm_Paint(object sender, PaintEventArgs e)
{
// Setup graphics output settings
var g = e.Graphics;
g.Clear(Color.White);
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.PageUnit = GraphicsUnit.Pixel;
// Move coordinate system center to the bottom left corner,
// scale it to user-defined scale value and flip Y axis (mul it scale to -1)
g.ScaleTransform(m_scale, -m_scale, MatrixOrder.Append);
g.TranslateTransform(50, Height - 50, MatrixOrder.Append);
// ... Draw some complex building geometry ...
// Draw building room
var customPen = new Pen(Color.Black, 1.0f / g.DpiX);
var rect = new RectangleF(box.X1, box.Y1, (box.X2 - box.X1), (box.Y2 - box.Y1));
g.DrawRectangle(customPen, box.X1, box.Y1, (box.X2 - box.X1), (box.Y2 - box.Y1));
GraphicsState gs = g.Save();
// First reset transform matrix
g.ResetTransform();
// Then again scale and move scene, but now with classic down-incresed Y axis
g.ScaleTransform(m_scale, m_scale, MatrixOrder.Append);
g.TranslateTransform(50, Height - 50, MatrixOrder.Append);
// All Y coords now must be inverted :/ *sigh*
box.Y1 *= -1.0f;
box.Y2 *= -1.0f;
rect = new RectangleF(box.X1, box.Y1, Math.Abs(box.X2 - box.X1), Math.Abs(box.Y2 - box.Y1));
// FIXME: This text is drawing in incorrect place
var fnt = new Font("Arial", 40f / g.DpiX, FontStyle.Bold, GraphicsUnit.Pixel);
g.DrawString("ID: " + box.Id, fnt, Brushes.Black, rect, stringFormat);
g.Restore(gs);
}
【问题讨论】:
标签: c# .net winforms drawing gdi+