Использование эллипса GDI32, подобного .NET DrawEllipse

#c# #.net #winapi #graphics #gdi

#c# #.net #winapi #графика #gdi

Вопрос:

В C # я могу нарисовать эллипс в контексте экранного устройства, взятого из калькулятора Windows (calc.exe ) окно с использованием системы .NET.Графика.Метод DrawEllipse.

Я хотел бы иметь возможность делать то же самое с помощью метода GDI32 Ellipse. Как я могу заставить Ellipse выводиться на экран?

В следующем коде эта строка работает: CalculatorGraphics.DrawEllipse(удалено, 50, 50, 50, 50); Но в этой строке нет: PlatformInvokeGDI32.Ellipse(hDC, 100, 100, 100, 100); В чем же проблема?

         //In size variable we shall keep the size of the window.
        SIZE size;

        //Win32 API functions are imported in classes
        //PlatformInvokeGDI32
        //PlatformInvokeUSER32.cs

        //Get handle of calc.exe window.
        IntPtr hwnd = PlatformInvokeUSER32.FindWindow("SciCalc", "Calculator");

        //Get window dimensions
        PlatformInvokeUSER32.RECT rect;
        PlatformInvokeUSER32.GetWindowRect(hwnd, out rect);
        size.cx = rect._Right - rect._Left;
        size.cy = rect._Bottom - rect._Top;

        //Get the device context of Calculator.
        IntPtr hDC = PlatformInvokeUSER32.GetDC(hwnd);

        //Draw on the Calculator surface.
        Graphics CalculatorGraphics = Graphics.FromHdc(hDC);
        Color colorRed = Color.FromName("Red");
        Pen penRed = new Pen(colorRed);
        CalculatorGraphics.DrawEllipse(penRed, 50, 50, 50, 50);
        CalculatorGraphics.Save();

        PlatformInvokeGDI32.COLORREF cl;
        cl.R = 255;
        cl.G = 0;
        cl.B = 0;

        PlatformInvokeGDI32.SetDCBrushColor(hDC, cl);
        PlatformInvokeGDI32.SetDCPenColor(hDC, cl);
        //PlatformInvokeGDI32.SetBkColor(hDC, cl);
        PlatformInvokeGDI32.Ellipse(hDC, 100, 100, 100, 100);
        PlatformInvokeGDI32.SaveDC(hDC);


        //Here we make a compatible device context in memory for screen device context.
        IntPtr hMemDC = PlatformInvokeGDI32.CreateCompatibleDC(hDC);


        //Create a compatible bitmap of window size and using screen device context.
        m_HBitmap = PlatformInvokeGDI32.CreateCompatibleBitmap(hDC, size.cx, size.cy);

        //As m_HBitmap is IntPtr we can not check it against null. For this purspose IntPtr.Zero is used.
        if (m_HBitmap != IntPtr.Zero)
        {
            //Here we select the compatible bitmap in memeory device context and keeps the refrence to Old bitmap.
            IntPtr hOld = (IntPtr)PlatformInvokeGDI32.SelectObject(hMemDC, m_HBitmap);
            //We copy the Bitmap to the memory device context.
            PlatformInvokeGDI32.BitBlt(hMemDC, 0, 0, size.cx, size.cy, hDC, 0, 0, PlatformInvokeGDI32.SRCCOPY);
            //We select the old bitmap back to the memory device context.
            PlatformInvokeGDI32.SelectObject(hMemDC, hOld);
            //We delete the memory device context.
            PlatformInvokeGDI32.DeleteDC(hMemDC);
            //We release the screen device context.
            PlatformInvokeUSER32.ReleaseDC(hwnd, hDC);
            //Image is created by Image bitmap handle and returned.
            return System.Drawing.Image.FromHbitmap(m_HBitmap);
        }
        //If m_HBitmap is null retunrn null.
        return null;
 

Комментарии:

1. Аргументы означают разные вещи. Вы рисуете эллипс 0x0.

2. Спасибо. Теперь я вижу, что мне нужен PlatformInvokeGDI32.Ellipse(hDC, 100, 100, 200, 200);

Ответ №1:

Я вижу, как я неправильно понял определение метода Ellipse.

Последние два параметра метода Ellipse для обозначения расстояния от самой левой точки и самой правой точки. Вместо этого они ссылаются на положение самой правой точки и самой нижней точки.

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

 Ellipse(hDC, 100, 100, 200, 200);
 

Означает примерно то же самое, что

 DrawEllipse(penRed, 100, 100, 100, 100); 
 

Вот документация MSDN по методу Ellipse:

hdc [in] дескриптор контекста устройства.

nLeftRect [в] координате x в логических координатах верхнего левого угла ограничивающего прямоугольника.

nTopRect [в] координате y в логических координатах верхнего левого угла ограничивающего прямоугольника.

nRightRect [в] координате x в логических координатах нижнего правого угла ограничивающего прямоугольника.

nBottomRect [в] координате y в логических координатах нижнего правого угла ограничивающего прямоугольника.