Отображение повернутой строки - DataGridView.RowPostPaint - PullRequest
2 голосов
/ 09 апреля 2010

Я хочу отобразить длинную повернутую строку на заднем плане одной из моих строк в DataGridView. Однако это:

private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
    if (e.RowIndex == 0)
    {
        ...
        //Draw the string
        Graphics g = dataGridView1.CreateGraphics();
        g.Clip = new Region(e.RowBounds);
        g.RotateTransform(-45);
        g.DrawString(printMe, font, brush, e.RowBounds, format);
    }
}

не работает, потому что текст обрезается до того, как повернуто.

Я также сначала попытался нарисовать на Bitmap, но, кажется, есть проблема с рисованием прозрачных растровых изображений - текст получается чисто черным.

Есть идеи?

1 Ответ

0 голосов
/ 10 апреля 2010

Я понял это. Проблема заключалась в том, что растровые изображения, по-видимому, не имеют прозрачности, даже если вы используете PixelFormat.Format32bppArgb. Рисование строки заставило его нарисовать на черном фоне, поэтому было так темно.

Решением было скопировать строку с экрана на растровое изображение, нарисовать на растровом изображении и скопировать ее обратно на экран.

g.CopyFromScreen(absolutePosition, Point.Empty, args.RowBounds.Size);

//Draw the rotated string here

args.Graphics.DrawImageUnscaledAndClipped(buffer, args.RowBounds);

Вот полный список кодов для справки:

private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs args)
{
    if(args.RowIndex == 0)
    {
        Font font = new Font("Verdana", 11);
        Brush brush = new SolidBrush(Color.FromArgb(70, Color.DarkGreen));
        StringFormat format = new StringFormat
        {
            FormatFlags = StringFormatFlags.NoWrap | StringFormatFlags.NoClip,
            Trimming = StringTrimming.None,
        };

        //Setup the string to be printed
        string printMe = String.Join(" ", Enumerable.Repeat("RUNNING", 10).ToArray());
        printMe = String.Join(Environment.NewLine, Enumerable.Repeat(printMe, 50).ToArray());

        //Draw string onto a bitmap
        Bitmap buffer = new Bitmap(args.RowBounds.Width, args.RowBounds.Height);
        Graphics g = Graphics.FromImage(buffer);
        Point absolutePosition = dataGridView1.PointToScreen(args.RowBounds.Location);
        g.CopyFromScreen(absolutePosition, Point.Empty, args.RowBounds.Size);
        g.RotateTransform(-45, MatrixOrder.Append);
        g.TranslateTransform(-50, 0, MatrixOrder.Append); //So we don't see the corner of the rotated rectangle
        g.DrawString(printMe, font, brush, args.RowBounds, format);

        //Draw the bitmap onto the table
        args.Graphics.DrawImageUnscaledAndClipped(buffer, args.RowBounds);
    }
}
...