Perché il mio Borland C ++ Builder 5 moduli con i controlli da destra ancorata appaiono in modo errato su Vista?

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

Domanda

Dopo aver trascorso una piccola età alla ricerca di una soluzione e avendo ora l'ho trovato, ho pensato che questo sarebbe bene per documentare per Stack Overflow. Quindi la mia risposta seguirà subito dopo questa domanda.

Sono stato utilizzando Borland C ++ Builder 5. Lo stesso vale probabilmente anche per la versione equivalente di Delfi. Ho avuto un form con un TButton su un TPanel. Il pulsante è stato impostato su Akright, akBottom. Su XP e prima di Windows, tutto andava bene. Su Vista, utilizzando Aero, il pulsante è apparso 4 pixel troppo a destra. L'ancoraggio ha continuato a funzionare bene.

Un altro esempio è un modulo con un TComboBox che aveva akTop, Akright, akLeft. Il combo è apparso 4 pixel troppo largo su Vista.

Tornando al look "classico" su Vista ha reso tutto viene visualizzato correttamente.

È stato utile?

Soluzione

La prima cosa che ho provato non ha funzionato: ho capito che il problema aveva a che fare con i bordi delle finestre più ampie su Vista. Ho pensato UpdateAnchorRules in VCL è stato in qualche modo calcolando in modo non corretto a causa della differenza tra la larghezza di progettazione e la larghezza effettiva della finestra su Vista. Guardando alla fonte VCL, era chiaro che cambiare le ancore causerebbe UpdateAnchorRules di essere chiamato di nuovo e (si spera) calcolano correttamente, dal momento che ora aveva la larghezza effettiva del modulo disponibile.

Ho aggiunto

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

al costruttore della mia forma.

Nessuna gioia. Il comportamento era del tutto inalterato.

Ho pensato che questo potrebbe essere troppo presto nel processo, così commosso lo stesso codice al metodo FormShow, ugualmente senza successo. Come ultimo tentativo, ho cambiato il design del modulo per avere più Akright per il pulsante e ha cambiato il codice per

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

... che non è riuscito troppo - un comportamento del tutto inalterato, diverso da quello che ho rotto il posizionamento del pulsante su XP nel caso in cui la dimensione salvata del modulo (che ho letto dal Registro di sistema e applicare alla forma in FormShow) non era il default.

Dopo aver aggiunto una tonnellata di codice di debug emettere la larghezza del modulo, larghezza del pulsante, a sinistra del pulsante, ClientRect della forma, ecc in vari punti durante la vita del modulo, ho trovato il problema. Per qualche motivo (presumibilmente ancora window-border-correlate - Non sono riuscito a scoprire esattamente che cosa il motivo era), VCL stava aprendo la finestra con la larghezza di 4 pixel sotto di quello che avrebbe dovuto essere. La larghezza ottenuto corretto poco dopo, ma a quel punto, l'ancoraggio (e UpdateAnchorRules) aveva già fissato il posizionamento del pulsante 4 pixel troppo a destra.

La correzione era:

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

Questa corregge la larghezza iniziale della forma, utilizzando la dimensione diversa del confine, come riportato da Vista. Essa provoca il comportamento corretto su Vista, pur mantenendo su altre versioni di Windows (Vista e con look "classico").

Spero che questo aiuti qualcuno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top