Warum mein Borland C ++ Builder 5 bildet mit der rechten verankerten Kontrollen erscheinen nicht richtig auf Vista?

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

Frage

Nachdem ein kleines Alter der Suche nach der Lösung verbracht und jetzt ist es gefunden zu haben, ich dachte, das wäre gut für Stack-Überlauf zu dokumentieren. Also meine Antwort wird nach dieser Frage richtig folgen.

war ich Borland C ++ Builder 5. Verwendung Dies ist wahrscheinlich auf die äquivalente Version von Delphi gilt auch. Ich hatte eine Form mit einer TButton auf einem TPanel. Die Taste wurde auf akRight gesetzt, akBottom. Unter XP und vor Windows war alles in Ordnung. Unter Vista mit Aero erschien die Taste 4 Pixel zu weit nach rechts. Die Verankerung weiterhin gut funktionieren.

Ein weiteres Beispiel war eine Form mit einem TComboBox der akTop, akRight, akLeft hatte. Die Combo erschien 4 Pixel zu breit auf Vista.

Rückkehr zu dem "klassischen" Look auf Vista machte alles richtig angezeigt.

War es hilfreich?

Lösung

Das erste, was ich versuchte, habe nicht funktioniert: Ich vermuten, dass das Problem mit dem breiteren Fensterrahmen auf Vista zu tun hat. Ich dachte UpdateAnchorRules in VCL irgendwie falsch zwischen der Baubreite und der tatsächlichen Breite des Fensters auf Vista aufgrund der Differenz rechnet. Mit Blick auf der VCL Quelle, war klar, dass die Anker zu ändern UpdateAnchorRules verursachen würde wieder aufgerufen werden und (hoffentlich) korrekt berechnen, da es nun die tatsächliche Breite des Formulars zur Verfügung hatte.

Ich habe

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

zu meiner Form Konstruktor.

Keine Freude. Das Verhalten war völlig unberührt.

dachte ich, dies zu früh in dem Prozess sein könnte, so den gleichen Code auf die Technologieformular Methode bewegte, ebenso erfolglos. Als letzten Versuch, änderte es das Design der Form nicht mehr zu akRight für die Schaltfläche hat und verändern den Code

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

... die gescheitert zu - Verhalten völlig unberührt, außer dass ich brach die Positionierung der Taste auf XP in dem Fall, dass die gespeicherte Größe des Formulars (die ich von der Registrierung ausgelesen und auf die Form gilt Technologieformulare) war nicht der Standard.

eine Tonne Debug-Code hinzugefügt Nachdem die Breite der Form, Breite der Schaltfläche links der Taste ausgibt, ClientRect der Form usw. an verschiedenen Punkten während des gesamten Lebensdauer des Formulars, fand ich das Problem. Aus irgendeinem Grund (vermutlich noch Fenster-Grenze bezogene - ich habe es nicht geschafft, genau herauszufinden, was der Grund dafür war), VCL öffnete das Fenster mit der Breite 4 Pixel unter dem, was es hätte sein sollen. Die Breite wurde kurz darauf korrigiert, aber von diesem Punkt der Verankerung (und UpdateAnchorRules) hatte bereits die Positionierung der Taste 4 Pixel zu weit nach rechts festgelegt.

Das Update war:

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

Dies korrigiert die anfängliche Breite der Form, die unterschiedliche Größe der Grenze unter Verwendung eines von Vista berichtet. Es bewirkt, dass das richtige Verhalten auf Vista, während es auf andere Windows-Versionen (und Vista mit „klassischem“ Look) beibehalten wird.

Hoffe, das hilft jemand.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top