OnPaint не рисует правильно - PullRequest
1 голос
/ 09 января 2012

Visual Studio 2008 SP1 C # Windows-приложение

Я пишу и рисую прямо в основной форме, и у меня возникла проблема с перерисовкой экрана.При запуске программы экран рисует правильно.Еще два сообщения рисования следуют через 3-4 секунды (без действия или движения на экране), и экран раскрашивается с использованием координат экрана (я думаю) вместо клиентских координат.Исходная строка не стирается.

Чтобы свести проблему к ее простейшему виду, я запустил новое приложение для Windows на C #.Он ничего не делает, кроме как нарисовать строку в главной форме.(См. Фрагмент кода ниже). Если вы запустите программу, появится строка, а затем появится вторая строка выше и слева.Если вы перезапустите программу и переместите форму к верхнему левому углу экрана, две строки будут почти совпадать.Вот почему я думаю, что вторая краска использует экранные координаты.

Вот код - Заранее спасибо за любую помощь, которую вы можете оказать.

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 голосов
/ 09 января 2012

Я считаю, что метод предназначен для рисования координат экрана, как вы наблюдаете.Один из способов получить результаты, которых вы хотите достичь, - преобразовать имеющиеся у вас клиентские координаты в координаты экрана, которые ожидает метод.

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            
}
...