سؤال

كيف أقوم بإنشاء عنصر تحكم في الزر (مع CreateWindow من أ BUTTON window) ذات حجم قياسي على مستوى النظام (خاصة الارتفاع) يتوافق مع بقية تطبيقات Windows؟يجب بالطبع أن آخذ DPI في الاعتبار وربما الإعدادات الأخرى.

ملاحظة: استخدام USE_CW_DEFAULT بالنسبة للعرض والارتفاع ينتج عنه زر بحجم 0،0، لذلك هذا ليس حلاً.

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

المحلول 2

في عالم مثالي خالي من المتاعب..

لإنشاء زر بحجم قياسي، يتعين علينا القيام بذلك:

LONG units = GetDialogBaseUnits();
m_hButton = CreateWindow(TEXT("BUTTON"), TEXT("Close"), 
                 WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 
                 0, 0, MulDiv(LOWORD(units), 50, 4), MulDiv(HIWORD(units), 14, 8),
                 hwnd, NULL, hInst, NULL);

أين 50 و 14 هي أبعاد DLU المعنية، 4 و 8 هي وحدات قالب الحوار الأفقي والرأسي على التوالي، بناءً على GetDialogBaseUnits() وظيفة ملاحظات التوثيق.


لا شيء مثالي

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

للحصول على وحدات "الحوار" الأساسية الخاصة بك، يجب عليك استرداد مقاييس النص الحالية باستخدام GetTextMetrics() واستخدم ارتفاع الحرف ومتوسط ​​العرض (tmHeight و tmAveCharWidth التابع TEXTMETRIC البنية على التوالي) وترجمتها باستخدام MulDiv بنفسك، إلا إذا أنت في حوار، إذن MapDialogRect() سوف تفعل كل هذه المهمة بالنسبة لك.

لاحظ أن tmAveCharWidth تقريبي فقط متوسط ​​عرض الأحرف الفعلي لذا يوصى باستخدام a GetTextExtentPoint32() تعمل على مجموعة أحرف أبجدية بدلاً من ذلك.

يرى:


بديل أبسط

إذا كانت الأزرار هي عنصر التحكم الوحيد الذي تريد تغيير حجمه تلقائيًا، فيمكنك أيضًا استخدامه BCM_GETIDEALSIZE رسالة Button_GetIdealSize() ماكرو (نظام التشغيل Windows XP والإصدارات الأحدث فقط) لاسترداد العرض والارتفاع الأمثل الذي يناسب أي شيء يحتوي عليه الزر، على الرغم من أنه يبدو قبيحًا جدًا دون تطبيق أي هوامش حول نص الزر.

نصائح أخرى

هذا ما يجب أن يقوله MSDN: مواصفات وإرشادات التصميم - التصميم المرئي:تَخطِيط.

الحجم الافتراضي للزر هو 50 × 14 وحدة DLU، والتي يمكن حسابها بالبكسل باستخدام الأمثلة الموضحة لـ GetDialogBaseUnits.

ال MapDialogRect يبدو أن الوظيفة تقوم بالحساب نيابةً عنك.

@ماكبيردي:لا يجب عليك استخدام GetDialogBaseUnits()، فهو يعتمد على خط النظام الافتراضي (الخط النقطي القبيح).يجب عليك استخدام MapDialogRect()

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