why? why not? :) (For my article XPExplorerBar[^] I'm doing animation with transparency which can be quite slow using GDI+. Thought I might try the same thing with GDI since it is hardware accelerated to see if I can get a decent performance boost) Do you mean you can't call it, or it does nothing? It doesn't do anything, yet GradientFill returns that it was successful. This is what I have so far: [DllImport("Msimg32.dll", CharSet=CharSet.Auto, SetLastError=true)] public static extern bool GradientFill(IntPtr hdc, TRIVERTEX[] pVertex, int dwNumVertex, ref GRADIENT_RECT pMesh, int dwNumMesh, int dwMode); [StructLayout(LayoutKind.Sequential)] public struct TRIVERTEX { public long x; public long y; public ushort Red; public ushort Green; public ushort Blue; public ushort Alpha; } [StructLayout(LayoutKind.Sequential)] public struct GRADIENT_RECT { public ulong UpperLeft; public ulong LowerRight; } public bool FillRectangle(IntPtr hdc, Color startColor, Color endColor, int x, int y, int width, int height) { TRIVERTEX[] vert = new TRIVERTEX[2]; GRADIENT_RECT rect = new GRADIENT_RECT(); vert[0].x = x; vert[0].y = y; vert[0].Red = (ushort) (startColor.R << 8); vert[0].Green = (ushort) (startColor.G << 8); vert[0].Blue = (ushort) (startColor.B << 8); vert[0].Alpha = 0; vert[1].x = x + width; vert[1].y = y + height; vert[1].Red = (ushort) (endColor.R << 8); vert[1].Green = (ushort) (endColor.G << 8); vert[1].Blue = (ushort) (endColor.B << 8); vert[1].Alpha = 0; rect.UpperLeft = 0; rect.LowerRight = 1; return GradientFill(hdc, vert, 2, ref rect, 1, 0); } "I think I speak on behalf of everyone here when I say huh?" - Buffy