¿Por qué mi Builder de Borland C ++ 5 formas con los controles de derecha aparecen incorrectamente anclado en Vista?

StackOverflow https://stackoverflow.com/questions/525517

Pregunta

Después de pasar una pequeña edad en busca de la solución y habiendo ahora encontré, pensé que sería bueno para documentar de desbordamiento de pila. Así que mi respuesta va a seguir inmediatamente después de esta cuestión.

Yo estaba utilizando Borland C ++ Builder 5. Esto probablemente también se aplica a la versión equivalente de Delphi. Tenía un formulario con un TButton en un TPanel. El botón se establece en Akright, akBottom. En XP y anteriores de Windows, todo estaba bien. En Vista, el uso de Aero, apareció el botón 4 píxeles demasiado a la derecha. El anclaje continuó trabajando bien.

Otro ejemplo fue un formulario con un TComboBox que tenía akTop, Akright, akLeft. El combo apareció 4 píxeles demasiado ancho en Vista.

Volviendo al aspecto "clásico" en Vista hizo que todo aparece correctamente.

¿Fue útil?

Solución

Lo primero que he intentado no ha funcionado: supuse que el problema tenía que ver con los bordes de las ventanas más amplias sobre Vista. Supuse UpdateAnchorRules en VCL se calculan de alguna manera incorrecta debido a la diferencia entre la anchura diseño y la anchura real de la ventana de Vista. En cuanto a la fuente VCL, estaba claro que el cambio de los anclajes causaría UpdateAnchorRules a ser llamados de nuevo y (con suerte) calculan correctamente, ya que ahora tenía el ancho real del formulario disponible.

añadí

TAnchors t = BlahBtn->Anchors;
t >> akRight;
BlahBtn->Anchors = t;
t << akRight;
BlahBtn->Anchors = t;

para el constructor de mi forma.

No hay alegría. El comportamiento fue totalmente afectada.

Me imaginé que esto podría ser demasiado pronto en el proceso, por lo que se trasladó el mismo código para el método FormShow, igualmente sin éxito. Como último intento, he cambiado el diseño del formulario para que ya no Akright para el botón y cambió el código de

TAnchors t = BlahBtn->Anchors;
t << akRight;
BlahBtn->Anchors = t;

... que fracasó también - el comportamiento afectados en absoluto, aparte de eso me rompió el posicionamiento del botón en XP en el caso de que el tamaño salvado de la forma (que leí fuera del registro y se aplica a la forma en FormShow) no era el valor por defecto.

Habiendo añadió una tonelada métrica de código de depuración la salida de la anchura de la forma, anchura del botón, a la izquierda del botón, ClientRect de la forma, etc. en varios puntos durante la vida de la forma, he encontrado el problema. Por alguna razón (probablemente todavía relacionados con ventanas frontera-- No he conseguido averiguar exactamente cuál era la razón), VCL estaba abriendo la ventana con el ancho de 4 píxeles por debajo de lo que debería haber sido. La anchura consiguió corrigió poco después, pero en ese momento, el anclaje (y UpdateAnchorRules) ya había fijado el posicionamiento del botón de 4 píxeles demasiado a la derecha.

La solución fue:

void __fastcall TFooBarDlg::CreateParams(TCreateParams &Params)
{
    TForm::CreateParams(Params);
    int i = GetSystemMetrics(SM_CXSIZEFRAME);
    Params.Width=Params.Width+(2*(i-4));
}

Esto corrige la anchura inicial de la forma, utilizando el tamaño diferente de la frontera según lo informado por Vista. Hace que el comportamiento correcto en Vista, manteniendo que en otras versiones de Windows (Vista y con aspecto "clásico").

Espero que esto ayude a alguien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top