2017-07-18 3 views
1

Ich verwende die nativen Methoden, um das Rechteck in einem Formular zu zeichnen. Wenn ich die graphics.DrawRectangle-Methode verwende, wird das Rechteck richtig gezeichnet. Wenn Sie jedoch die native Methode wie den unten stehenden Code verwenden, wird immer der weiße Hintergrund innerhalb des Rechtecks ​​ausgefüllt.Zeichnen Rechteck mit nativen Methode füllt mit weißem Hintergrund

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); 
    } 
} 

}

finden Sie das beigefügte Bild, das in der Form wurde durch gelbe Farbe gefüllt. Das erste Rechteck zeichnet mit der graphics.DrawRangle-Methode und das zweite mit der obigen nativen Methode.

enter image description here

Bitte jemand empfehlen, wie das Rechteck zu zeichnen, ohne weißen Hintergrund füllt die oben nativen Methode?

+0

Ich denke, man sollte eine transparente Bürste erstellen :) –

Antwort

1

Rechteck Funktion zeichnet ein Rechteck mit dem aktuellen Stift und auch füllt das Innere mit aktuellen Pinsel.

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

können Sie den aktuellen Pinsel AuswählenObjekt wie unter Verwendung ändern. Die Einstellung von Color.Transparent wird jedoch als weiße Farbe betrachtet.

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); 

Wenn Sie nicht das Innere füllen wollen, dann müssen Sie die FrameRect Funktion verwenden. Aber mit dieser Funktion, Dicke der Linie immer 1. Wir können es nicht einstellen.

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())); 
Verwandte Themen