مشكلة غريبة تتعلق بأنماط حدود النموذج الثابتة في نظام التشغيل Vista

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

سؤال

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

تكمن المشكلة في كافة أنواع أنماط الحدود الثابتة مثل FixedDialog وFixed3D وFixedSingle وFixedToolWindow.ولا يحدث ذلك على الكبار.هذه المشكلة، كما قلت، تحدث أيضًا على نظام التشغيل Vista فقط.

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

والأمر الأكثر غرابة في هذا هو أن موقع النموذج لا يتغير، فهو لا يزال 0,0، ولكن لا يزال يتم رسم عدد قليل من وحدات البكسل من النموذج خارج منطقة شاشة العمل.

لقد قمت باختبار هذا على نظام XP ولم يحدث ذلك، المشكلة خاصة بنظام التشغيل Vista.في نظام XP، كان الاختلاف الوحيد هو حجم الحدود الذي يتغير قليلاً بين أي من الأنماط.ولكن تم قطع النموذج دائمًا بشكل مثالي إلى الموضع 0،0.

إذا كان ذلك ممكنا، بدون العثور على عدد وحدات البكسل التي يتم رسمها خارج منطقة العمل ثم إضافتها إلى موقع النموذج، هل هناك طريقة ممكنة لإصلاح ذلك أو حل بديل؟

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

المحلول

إذا تم تمكين Aero، فسوف يكذب عليك Windows بشأن حجم وموضع الملف Fixed* FormBorderStyle شبابيك.يوضح التعليمة البرمجية التالية كيفية الحصول على الارتفاع الصحيح والإزاحة العلوية لهذه النافذة.ستسمح لك تقنية مماثلة بوضع نافذة عند (0,0).

[DllImport("dwmapi.dll", PreserveSig = false)]
public static extern bool DwmIsCompositionEnabled();

// When Aero is enabled, and our FormBorderStyle is FixedToolWindow,
//    Windows will lie to us about our size and position.
public bool AeroIsMessingWithUs()
{
    bool ret = false;
    try
    {
        // check for other Fixed styles here if needed
        if (FormBorderStyle == System.Windows.Forms.FormBorderStyle.FixedToolWindow)
        {
            if (Environment.OSVersion.Version.Major >= 6 && DwmIsCompositionEnabled())
            {
                // Aero is enabled
                ret = true;
            }
        }
    }
    catch
    {
    }
    return ret;
}

public int MyWindowHeight()
{
    int height = Height;
    if (AeroIsMessingWithUs())
    {
        // there are actually 5 more pixels on the top and bottom
        height += 10;
    }
    return height;
}

public int MyWindowY()
{
    int y = Location.Y;
    if (AeroIsMessingWithUs())
    {
        // I'm actually 5 pixels higher than Windows says I am
        y -= 5;
    }
    return y;
}

نصائح أخرى

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

أقترح إغلاق هذا السؤال...

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