Cambio de tamaño suave en una forma / ventana sin bordes en Delphi
Estoy tratando de cambiar el tamaño de una forma sin bordes, pero cuando aumento el tamaño con el lado derecho / inferior, obtengo un espacio entre el borde y el área del cliente anterior que depende de la velocidad con la que mueva el mouse.
El efecto es más notable cuando cambia el tamaño desde el borde izquierdo o incluso desde la esquina inferior izquierda, es horrible en todas partes (probé con otras aplicaciones comerciales y también sucede). Este efecto también ocurre cuando cambio a un borde considerable, pero no es tan horrible como cuando elimino los bordes del formulario
El diseño del formulario consiste en un panel superior que realiza la función de la barra de título (con algunos tImages y botones), y algunos otros paneles que muestran otra información (como una nota, otros controles, etc.)
Hay un fragmento de mi código en el que capturo el botón del mouse y envío un mensaje a Windows, pero también intenté hacerlo manualmente con resultados similares
Activar el búfer doble para el panel superior evita el parpadeo, pero cambiar el tamaño del panel no se sincroniza con el cambio de tamaño del formulario, por lo que aparece un espacio o parte del panel que desaparece
procedure TOutputForm.ApplicationEvents1Message( var Msg: tagMSG;
var Handled: Boolean );
const
BorderBuffer = 5;
var
X, Y: Integer;
ClientPoint: TPoint;
direction: integer;
begin
Handled := false;
case Msg.message of
WM_LBUTTONDOWN:
begin
if fResizable then
begin
if fSides = [sTop] then
direction := 3
else if fSides = [sLeft] then
direction := 1
else if fSides = [sBottom] then
direction := 6
else if fSides = [sRight] then
direction := 2
else if fSides = [sRight, sTop] then
direction := 5
else if fSides = [sLeft, sTop] then
direction := 4
else if fSides = [sLeft, sBottom] then
direction := 7
else if fSides = [sRight, sBottom] then
direction := 8;
ReleaseCapture;
SendMessage( Handle, WM_SYSCOMMAND, ( 61440 + direction ), 0 );
Handled := true;
end;
end;
WM_MOUSEMOVE:
begin
// Checks the borders and sets fResizable to true if it's in a "border"
// ...
end; // mousemove
end; // case
end;
¿Cómo podría evitar esa área y / o forzar que las ventanas se vuelvan a dibujar? Estoy usando Delphi pero una solución genérica (o en otro idioma) o incluso una dirección para avanzar estaría bien para mí
Gracias de anteman