internal static void DrawRectangle(this Gdi32.HDC hdc, Rectangle rectangle, Gdi32.HPEN hpen) { using var penScope = new Gdi32.SelectObjectScope(hdc, hpen); using var ropScope = new Gdi32.SetRop2Scope(hdc, Gdi32.R2.COPYPEN); using var brushScope = new Gdi32.SelectObjectScope(hdc, Gdi32.GetStockObject(Gdi32.StockObject.HOLLOW_BRUSH)); Gdi32.Rectangle(hdc, rectangle.X, rectangle.Y, rectangle.Right, rectangle.Bottom); }
internal unsafe static void DrawLine(this Gdi32.HDC hdc, Gdi32.HPEN pen, int x1, int y1, int x2, int y2) { using var ropScope = new Gdi32.SetRop2Scope(hdc, Gdi32.R2.COPYPEN); using var bkScope = new Gdi32.SetBkModeScope(hdc, Gdi32.BKMODE.TRANSPARENT); using var selection = new Gdi32.SelectObjectScope(hdc, pen); Point oldPoint = new Point(); Gdi32.MoveToEx(hdc, x1, y1, &oldPoint); Gdi32.LineTo(hdc, x2, y2); Gdi32.MoveToEx(hdc, oldPoint.X, oldPoint.Y, &oldPoint); }
internal static void DrawRectangle( this Gdi32.HDC hdc, int left, int top, int right, int bottom, Gdi32.HPEN hpen) { using var penScope = new Gdi32.SelectObjectScope(hdc, hpen); using var ropScope = new Gdi32.SetRop2Scope(hdc, Gdi32.R2.COPYPEN); using var brushScope = new Gdi32.SelectObjectScope(hdc, Gdi32.GetStockObject(Gdi32.StockObject.NULL_BRUSH)); Gdi32.Rectangle(hdc, left, top, right, bottom); }
/// <summary> /// Draws lines with the <paramref name="hpen"/> using points defined in <paramref name="lines"/>. /// </summary> /// <param name="lines"> /// MUST be a mulitple of 4. Each group of 4 represents x1, y1, x2, y2. /// </param> internal unsafe static void DrawLines(this Gdi32.HDC hdc, Gdi32.HPEN hpen, ReadOnlySpan <int> lines) { Debug.Assert((lines.Length % 4) == 0); using var ropScope = new Gdi32.SetRop2Scope(hdc, Gdi32.R2.COPYPEN); using var bkScope = new Gdi32.SetBkModeScope(hdc, Gdi32.BKMODE.TRANSPARENT); using var selection = new Gdi32.SelectObjectScope(hdc, hpen); Point oldPoint = new Point(); for (int i = 0; i < lines.Length; i += 4) { Gdi32.MoveToEx(hdc, lines[i], lines[i + 1], &oldPoint); Gdi32.LineTo(hdc, lines[i + 2], lines[i + 3]); Gdi32.MoveToEx(hdc, oldPoint.X, oldPoint.Y, null); } }
private void DrawReversibleFrame(IntPtr handle, Rectangle rectangle, Color backColor) { //Bug # 71547 <subhag> to make drag rect visible if any the dimensions of the control are 0 if (rectangle.Width == 0) { rectangle.Width = 5; } if (rectangle.Height == 0) { rectangle.Height = 5; } // Copy of ControlPaint.DrawReversibleFrame, see VSWhidbey 581670 // If ControlPaint ever gets overrloaded, we should replace the code below by calling it: // ControlPaint.DrawReversibleFrame(handle, rectangle, backColor, FrameStyle.Thick); // ------ Duplicate code---------------------------------------------------------- Gdi32.R2 rop2; Color graphicsColor; if (backColor.GetBrightness() < .5) { rop2 = Gdi32.R2.NOTXORPEN; graphicsColor = Color.White; } else { rop2 = Gdi32.R2.XORPEN; graphicsColor = Color.Black; } using var dc = new User32.GetDcScope(handle); using var pen = new Gdi32.ObjectScope(Gdi32.CreatePen(Gdi32.PS.SOLID, 2, ColorTranslator.ToWin32(backColor))); using var rop2Scope = new Gdi32.SetRop2Scope(dc, rop2); using var brushSelection = new Gdi32.SelectObjectScope(dc, Gdi32.GetStockObject(Gdi32.StockObject.NULL_BRUSH)); using var penSelection = new Gdi32.SelectObjectScope(dc, pen); Gdi32.SetBkColor(dc, ColorTranslator.ToWin32(graphicsColor)); Gdi32.Rectangle(dc, rectangle.X, rectangle.Y, rectangle.Right, rectangle.Bottom); // ------ Duplicate code---------------------------------------------------------- }