لماذا بلادي بورلاند C + + منشئ 5 الأشكال مع الضوابط الراسية اليمين تظهر بشكل غير صحيح على ويندوز فيستا؟

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

سؤال

وبعد أن أمضى سن صغيرة تبحث عن حل، وبعد أن وجدت الآن أنه، وأنا أحسب هذا من شأنه أن تكون جيدة لتوثيق لتجاوز المكدس. لذا جوابي سوف تتبع اليمنى في الدقيقة على هذا السؤال.

وكنت تستخدم بورلاند C + + منشئ 5. وهذا ينطبق أيضا على الأرجح إلى إصدار ما يعادل دلفي. كان لي نموذج مع TButton على TPanel. تم تعيين الزر لakRight، akBottom. ويندوز إكس بي وويندوز مسبق، كان كل شيء على ما يرام. على ويندوز فيستا، وذلك باستخدام ايرو، ظهر زر 4 بكسل بعيدا إلى اليمين. استمر ترسيخ للعمل بشكل جيد.

وهناك مثال آخر نموذج مع TComboBox الذي كان akTop، akRight، akLeft. ويبدو أن السرد 4 بكسل واسعة جدا على ويندوز فيستا.

وبالعودة إلى نظرة "الكلاسيكية" ويندوز فيستا جعل كل شيء يبدو بشكل صحيح.

هل كانت مفيدة؟

المحلول

وأول شيء حاولت لم يعمل: خمنت أن المشكلة لا علاقة لها حدود نافذة أوسع على ويندوز فيستا. أنا أحسب UpdateAnchorRules في VCL تم احتساب بطريقة أو بأخرى بشكل غير صحيح نظرا إلى اختلاف بين عرض التصميم والعرض الفعلي للنافذة ويندوز فيستا. وعند النظر إلى مصدر VCL، كان من الواضح أن تغيير المراسي من شأنها أن تسبب UpdateAnchorRules ليتم استدعاؤها مرة أخرى و (أمل) حساب بشكل صحيح، لأنه كان الآن عرض الفعلي للشكل متاح.

وأضاف I

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

لمنشئ شكل بلدي.

ولا الفرح. كان سلوك غير متأثر تماما.

وأنا أحسب أن هذا قد يكون في العملية في وقت مبكر جدا، لذلك انتقلت نفس رمز لطريقة FormShow، على قدم المساواة دون جدوى. كما المحاولة الأخيرة، لقد غيرت تصميم النموذج للم يعد لدينا akRight لزر وغيرت رمز ل

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

... التي فشلت أيضا - السلوك غير متأثر تماما، غير ان كسرت المواقع من زر على XP في حالة أن حجم حفظها من النموذج (التي قرأت من التسجيل وينطبق على النموذج في FormShow) لم يكن الافتراضي.

وبعد أن أضاف للطن المتري الواحد من التعليمات البرمجية التصحيح إخراج عرض النموذج، وعرضها على الزر، يسار زر، ClientRect النموذج، وما إلى ذلك في نقاط مختلفة خلال حياته النموذج، لقد وجدت هذه المشكلة. لسبب ما (يفترض تزال ذات الصلة نافذة الحدود - أنا لم يتمكن من معرفة بالضبط ما هو السبب)، VCL وفتح نافذة مع عرض 4 بكسل أقل مما كان ينبغي أن يكون. عرض حصلت على تصحيح بعد ذلك بوقت قصير، ولكن بحلول ذلك الوقت، رسو (وUpdateAnchorRules) قد حددت بالفعل المواقع من بكسل زر 4 بعيدا إلى اليمين.

والإصلاح و:

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

وهذا بتصحيح العرض الأولي للنموذج، وذلك باستخدام حجم مختلفة من الحدود كما ذكرت من قبل ويندوز فيستا. أنه يسبب السلوك الصحيح على ويندوز فيستا مع الحفاظ على إصدارات Windows الأخرى (ويندوز فيستا مع نظرة "الكلاسيكية").

وآمل أن يساعد هذا شخص.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top