紧凑框架上的GDI RoundRect:使圆角矩形在透明外部

时间:2009-09-18 15:39:33

标签: c# compact-framework custom-controls transparency

我使用RoundRect GDI函数绘制一个圆角矩形,如下例所示:.NET CF自定义控件: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 个答案:

答案 0 :(得分:1)

使用标准托管操作时,您需要将“外部”颜色(圆角部分之外)设置为特定颜色(洋红色是常见颜色),然后使用SetColorKey将该颜色设置为透明。 / p>

This MSDN article有关于如何实现它的基础知识。

编辑1

由于你是P /调用你的GDI操作,你也可以继续。如果您正在使用透明度信息绘制图像,则可以使用alpha blending,但在这种情况下,您需要将整个“按钮”绘制到单独的缓冲区,然后P / Invoke MaskBlt将其复制到Form的DC(这是CF使用colorkey透明度时所做的事情)。 Here's a desktop example,但过程是一样的。