GDI RoundRect на Compact Framework: сделайте прямоугольник с закругленными углами прозрачным снаружи - PullRequest
2 голосов
/ 18 сентября 2009

Я использую функцию RoundRect GDI для рисования скругленного прямоугольника в следующем примере: .NET CF Custom Control: RoundedGroupBox

Поскольку все элементы управления являются квадратными, он также рисует углы за пределами скругленного прямоугольника. Как я могу сделать это пространство за пределами прямоугольника прозрачным?

Метод OnPaint:

protected override void OnPaint(PaintEventArgs e)
        {
            int outerBrushColor = HelperMethods.ColorToWin32(m_outerColor);
            int innerBrushColor = HelperMethods.ColorToWin32(this.BackColor);

            IntPtr hdc = e.Graphics.GetHdc();
            try
            {
                IntPtr hbrOuter = NativeMethods.CreateSolidBrush(outerBrushColor);
                IntPtr hOldBrush = NativeMethods.SelectObject(hdc, hbrOuter);
                NativeMethods.RoundRect(hdc, 0, 0, this.Width, this.Height, m_diametro, m_diametro);
                IntPtr hbrInner = NativeMethods.CreateSolidBrush(innerBrushColor);
                NativeMethods.SelectObject(hdc, hbrInner);
                NativeMethods.RoundRect(hdc, 0, 18, this.Width, this.Height, m_diametro, m_diametro);
                NativeMethods.SelectObject(hdc, hOldBrush);
                NativeMethods.DeleteObject(hbrOuter);
                NativeMethods.DeleteObject(hbrInner);
            }
            finally
            {
                e.Graphics.ReleaseHdc(hdc);
            }

            if (!string.IsNullOrEmpty(m_roundedGroupBoxText))
            {
                Font titleFont = new Font("Tahoma", 9.0F, FontStyle.Bold);
                Brush titleBrush = new SolidBrush(this.BackColor);
                try
                {
                    e.Graphics.DrawString(m_roundedGroupBoxText, titleFont, titleBrush, 14.0F, 2.0F);
                }
                finally
                {
                    titleFont.Dispose();
                    titleBrush.Dispose();
                }
            }

            base.OnPaint(e);
        }

OnPaintBackground:

protected override void OnPaintBackground(PaintEventArgs e)
{
   if (this.Parent != null)
   {
        SolidBrush backBrush = new SolidBrush(this.Parent.BackColor);
        try
        {
            e.Graphics.FillRectangle(backBrush, 0, 0, this.Width, this.Height);
        }
        finally
        {
            backBrush.Dispose();
        }
    }
}

Спасибо!

1 Ответ

1 голос
/ 18 сентября 2009

При использовании стандартных управляемых операций вам нужно сделать «внешний» цвет (который выходит за округленную часть) конкретным цветом (пурпурный - общий), а затем использовать SetColorKey , чтобы установить этот цвет как прозрачный .

Эта статья MSDN содержит основы того, как вы этого добьетесь.

РЕДАКТИРОВАТЬ 1

Так как вы выполняете операции GDI, вы также можете продолжить это. Если бы вы рисовали изображение с информацией о прозрачности, вы могли бы использовать альфа-смешение , но в этом случае вам нужно нарисовать всю «кнопку» в отдельный буфер, а затем P / Invoke MaskBlt скопировать его в DC формы (это то, что делает CF, когда вы используете прозрачность colorkey). Вот пример рабочего стола , но процесс тот же.

...