Las propiedades añadidas a TRoundEdit son las siguientes:
1.- sbRound: Un nuevo estilo de borde en la propiedad BorderStyle que redondea el Edit.
2.- BorderColor: El color del borde redondeado. Solo activo si BorderStyle = bsRound.
3.- BorderRadio: Radio de curvatura de las esquinas (0 a 12). Activo si BorderStyle = bsRound.
El efecto se consigue creando una región que esconda las esquinas y capturando el mensaje WM_NCPAINT para pintar el borde del color deseado.
La función de redondeo es privada, para uso interno de TRoundEdit:
procedure TRoundEdit.SetRound(Value: boolean); var Rgn: HRGN; begin Rgn:= 0; if Value then Rgn := CreateRoundRectRgn(0, 0, Width+1, Height+1, FBorderRadio-2, FBorderRadio-2) ; SetWindowRgn(Handle, Rgn, true); DeleteObject(Rgn); end;
La función que responde al mensaje WM_NCPAINT:
procedure TRoundEdit.WMNCPaint(var Message: TMessage); var Brush: TBrush; Pen: TPen; DC: HDC; Clip: integer; begin if (BorderStyle <> bsRound) or not inherited Ctl3D then begin inherited; exit; end; DC:= GetWindowDC(Handle); Brush:= TBrush.Create; Pen:= TPen.Create; Pen.Color:= BorderColor; Brush.Color:= Color; ExcludeClipRect(DC, 4, 4, Width-4, Height-4); Windows.SelectObject(DC, Brush.Handle); Windows.SelectObject(DC, Pen.Handle); Windows.Rectangle(DC, 0, 0, Width, Height); Brush.Style:= bsClear; Windows.RoundRect(DC, 0, 0, Width, Height, FBorderRadio, FBorderRadio); Windows.ReleaseDC(Handle, DC); Brush.Destroy; Pen.Destroy; end;
La instalación del componente se realiza manualmente desde el menú Component -> Install Component.
El código completo lo subo en el archivo adjunto.
Espero que os sea de utilidad.
Saludos.