Pourquoi mon Builder Borland C ++ 5 formes avec les contrôles de droite ancrés apparaissent de façon incorrecte sur Vista?

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

Question

Après avoir passé un petit âge à la recherche de la solution et ayant maintenant trouvé, je pensais que ce serait bon de documenter pour débordement de la pile. Donc, ma réponse suivra juste après cette question.

J'utilisais Borland C ++ Builder 5. Cela vaut sans doute aussi à la version équivalente de Delphi. J'ai eu une forme avec un TButton sur un TPanel. Le bouton a été réglé sur akRight akBottom. Sur XP et avant de Windows, tout allait bien. Sur Vista, en utilisant Aero, le bouton est apparu 4 pixels trop loin vers la droite. L'ancrage a continué à fonctionner correctement.

Un autre exemple est une forme avec un TComboBox qui avait akTop, akRight, akLeft. Le combo est apparu 4 pixels trop large sur Vista.

De retour à l'aspect « classique » sur Vista fait tout semble correctement.

Était-ce utile?

La solution

La première chose que j'ai essayé ne fonctionne pas: je deviné que le problème avait à voir avec les bordures de fenêtres plus larges sur Vista. Je me suis UpdateAnchorRules à VCL calculait en quelque sorte de manière incorrecte en raison de la différence entre la largeur de la conception et la largeur réelle de la fenêtre sur Vista. En regardant la source VCL, il était clair que la modification des points d'ancrage causerait UpdateAnchorRules à appeler à nouveau et (espérons) calculer correctement, car il avait maintenant la largeur réelle du formulaire disponible.

ajouté

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

au constructeur de ma forme.

Pas de joie. Le comportement était tout à fait non affecté.

Je me suis dit que cela pourrait être trop tôt dans le processus, donc déplacé le même code à la méthode FormShow, également sans succès. En dernier essai, j'ai changé la conception de la forme de ne plus akRight pour le bouton et changé le code

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

... qui a échoué aussi - un comportement tout à fait non affecté, autre que je me suis cassé le positionnement du bouton sur XP dans le cas où la taille enregistrée de la forme (que je lis sur le registre et appliquer à la forme FormShow) n'a pas été la valeur par défaut.

Après avoir ajouté une tonne métrique de code de débogage sortie la largeur de la forme, la largeur du bouton, à gauche du bouton, ClientRect de la forme, etc., à divers points pendant la durée de vie de la forme, je trouve le problème. Pour une raison quelconque (probablement encore racontais fenêtre frontière - je ne l'ai pas réussi à savoir exactement quelle était la raison), VCL s'ouvrait la fenêtre avec la largeur de 4 pixels inférieure à ce qu'elle aurait dû être. La largeur corrigée a obtenu peu de temps après, mais à ce moment-là, l'ancrage (et UpdateAnchorRules) avait déjà fixé le positionnement du bouton 4 pixels trop loin vers la droite.

Le correctif est:

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

Ceci corrige la largeur initiale de la forme, en utilisant la taille DIFFERENTES de la frontière tel que rapporté par Vista. Il provoque le comportement correct sur Vista tout en conservant sur d'autres versions de Windows (Vista et avec look « classique »).

Espérons que cela aide quelqu'un.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top