OnPaint无法正确绘制

时间:2012-01-09 02:22:51

标签: c# coordinates onpaint

Visual Studio 2008 SP1 C#Windows应用程序

我正在写作并直接绘制到主窗体,并且在重新绘制屏幕时出现问题。在程序启动时,屏幕正确绘制。在3-4秒内再显示两条油漆消息(屏幕上没有动作或动作),屏幕使用屏幕坐标(我认为)而不是客户端坐标绘制。原始字符串不会被删除。

为了将问题简化为最简单的形式,我开始了一个新的C#windows应用程序。除了在主窗体上绘制一个字符串外,它什么都不做。 (请参阅下面的代码段)如果启动程序,将出现字符串,然后第二个字符串将出现在左上方。如果重新启动程序并将表单移向屏幕的左上角,则两个字符串几乎重合。这就是为什么我认为第二个画面使用屏幕坐标。

以下是代码 - 如果您有任何帮助,请提前感谢您。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Junk
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    protected override void OnPaint(PaintEventArgs eventArgs)
    {
        using (Font myFont = new System.Drawing.Font("Helvetica", 40,  FontStyle.Italic))
            {
            eventArgs.Graphics.TranslateTransform(0, 0);
            Point p;
            eventArgs.Graphics.DrawString("Hello C#", myFont, System.Drawing.Brushes.Red, 200, 200);
            } //myFont is automatically disposed here, even if an exception was thrown            
    }
}
}

1 个答案:

答案 0 :(得分:0)

我相信该方法旨在绘制屏幕坐标,就像您观察的那样。获得想要实现的结果的一种方法是将客户端坐标转换为方法所期望的屏幕坐标。

protected override void OnPaint(PaintEventArgs eventArgs)
{
    using (Font myFont = new System.Drawing.Font("Helvetica", 40,  FontStyle.Italic))
        {
        eventArgs.Graphics.TranslateTransform(0, 0);
        Point p = this.PointToScreen(new Point(200, 200));
        eventArgs.Graphics.DrawString("Hello C#", myFont, System.Drawing.Brushes.Red, p);
        } //myFont is automatically disposed here, even if an exception was thrown            
}