Нарисуйте прямоугольник с помощью собственного метода заливки белым фоном

Я использую собственные методы для рисования прямоугольника в форме. когда я использую метод graphics.DrawRectangle, прямоугольник будет правильно отрисовываться. Но при использовании собственного метода, такого как код ниже, он всегда заполняет белый фон внутри прямоугольника.

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.BackColor = Color.Yellow;
    }

protected override void OnPaint(PaintEventArgs e)
{
    Rectangle rect = new Rectangle(20,20,100,30);
    e.Graphics.DrawRectangle(new Pen(Color.Red, 1), rect);
    IntPtr hdc = e.Graphics.GetHdc();
    DrawRectangle(hdc, Pens.Red, new Rectangle(25, 60, 100, 30));
    e.Graphics.ReleaseHdc();
    base.OnPaint(e);
}

public void DrawRectangle(IntPtr hdc, Pen pen, Rectangle rect)
{
    IntPtr hpen = IntPtr.Zero;
    try
    {
        hpen = CreatePen((int)pen.DashStyle, (int)pen.Width, (int)new RGB(pen.Color).ToInt32());
        SelectObject(hdc, hpen);
        RectangleCE(hdc, rect.Left, rect.Top, rect.Right, rect.Bottom);
    }
    finally
    {
        if (hpen != IntPtr.Zero)
            DeleteObject(hpen);
    }
}

[DllImport("gdi32")]
public static extern IntPtr CreatePen(int penStyle, int width, int color);


[DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
public static extern IntPtr SelectObject(IntPtr hdc, IntPtr obj);

[DllImport("gdi32.dll", EntryPoint = "Rectangle", SetLastError = true)]
public static extern uint RectangleCE(IntPtr hdc, int leftRect, int topRect, int rightRect, int bottomRect);

[DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
public static extern int DeleteObject(IntPtr hObject);

/// <summary>
/// Selects a red, green, blue (RGB) color based on the arguments supplied and the color capabilities of the output device
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct RGB
{
    /// <summary>
    /// The reserved fields.
    /// </summary>
    private byte r, g, b, reserved;

    /// <summary>
    /// Initializes a new instance of the <see cref="RGB"/> struct.
    /// </summary>
    /// <param name="colorIn">The color value.</param>
    public RGB(Color colorIn)
    {
        r = colorIn.R;
        g = colorIn.G;
        b = colorIn.B;
        reserved = 0;
    }

    /// <summary>
    /// Convert the RGB color value to integer value.
    /// </summary>
    /// <returns>Returns the converted value.</returns>
    public int ToInt32()
    {
        var colors = new byte[4];
        colors[0] = r;
        colors[1] = g;
        colors[2] = b;
        colors[3] = reserved;
        return BitConverter.ToInt32(colors, 0);
    }
}

}

Пожалуйста, найдите прикрепленное изображение, в котором форма была заполнена желтым цветом. Первый прямоугольник рисуется с использованием метода graphics.DrawRectangle, а второй - с использованием указанного выше собственного метода.

введите описание изображения здесь

Кто-нибудь подскажет, как нарисовать прямоугольник без заливки белого фона, используя вышеуказанный собственный метод?


person Jagadeesan    schedule 18.07.2017    source источник
comment
Думаю, вам стоит создать прозрачную кисть :)   -  person Laurent Lequenne    schedule 18.07.2017


Ответы (1)


Функция Прямоугольник рисует прямоугольник текущим пером, а также заполняет внутреннюю часть текущей кистью.

https://msdn.microsoft.com/en-us/library/aa269219(v=vs.60).aspx

Вы можете изменить текущую кисть с помощью SelectObject, как показано ниже. Но установка Color.Transparent будет считаться белым цветом.

var yColor = (uint) new RGB(Color.Yellow).ToInt32();
SelectObject(hdc, CreateSolidBrush(yColor));
hpen = CreatePen((int)pen.DashStyle, (int)pen.Width, (uint)new RGB(pen.Color).ToInt32());
SelectObject(hdc, hpen);
RectangleCE(hdc, rect.Left, rect.Top, rect.Right, rect.Bottom);

Если вы не хотите заливать интерьер, вам нужно использовать функцию FrameRect. Но при использовании этой функции толщина линии всегда равна 1. Мы не можем ее настроить.

https://msdn.microsoft.com/en-us/library/dd144838(v=vs.85).aspx

var rect2 = new RECT(rect);
FrameRect(hdc, ref rect2, CreateSolidBrush((uint)new RGB(Color.Red).ToInt32()));
person Selvamz    schedule 19.07.2017