GDI RoundRect em Compact Framework: make arredondado retângulo de fora transparente
-
22-07-2019 - |
Pergunta
Eu estou usando a função RoundRect GDI para desenhar um retângulo arredondado seguinte exemplo: NET Controle CF Custom: RoundedGroupBox
Porque todos os controles são quadrados, mas também desenhar os cantos fora do retângulo arredondado. Como posso fazer este espaço deixado fora do retângulo transparente?
O método 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);
}
Um a 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();
}
}
}
Obrigado!
Solução
Ao usar operações gerenciadas padrão, você precisa para tornar a cor "exterior" (que, fora a parte arredondada) uma cor específica (magenta é comum), em seguida, usar SetColorKey para conjunto essa cor como transparente.
Este artigo MSDN tem as noções básicas de como você iria alcançá-lo.
Editar 1
Uma vez que você é P / Invocando as suas operações GDI, você também pode continuar com isso. Se estivesse desenhando uma imagem com informações de transparência, você pode usar alpha misturando , mas neste caso você precisa desenhar todo o seu "botão" para um buffer separado e, em seguida, P / Invoke MaskBlt para copiá-lo para DC do formulário (que é o que o CF está fazendo quando você usa transparência colorkey). Aqui está um exemplo de desktop , mas o processo é o mesmo.