Tienes que usar regiones, ya sean elípticas, rectangulares o mejor las poligonales.
Creo que existe otro post algo parecido para una región cuadrada con bordes redondeados.
Ejemplo para poligonal:
Código Delphi
[-]
type TPoligonoN=array[0..30] of Tpoint;
const POLIGONO_1:TPoligonoN=(
(x:0;y:0),(x:41;y:32),(x:63;y:30),(x:87;y:35),(x:127;y:1),(x:119;y:65),(x:127;y:85),
(x:127;y:104),(x:119;y:130),(x:127;y:137),(x:112;y:139),(x:127;y:157),(x:101;y:149),
(x:116;y:167),(x:87;y:157),(x:80;y:160),(x:80;y:179),(x:73;y:191),(x:62;y:191),
(x:53;y:180),(x:52;y:161),(x:41;y:157),(x:17;y:170),(x:28;y:151),(x:0;y:158),
(x:16;y:139),(x:0;y:140),(x:10;y:129),(x:0;y:107),(x:0;y:85),(x:8;y:65)
);
var
poligono:TPoligonoN;
regGl:HRGN;
...
poligono:=POLIGONO_1;
regGl:=CreatePolygonRgn(poligono,31,ALTERNATE);SetWindowRgn(self.handle,regGl,false);