سؤال

أحاول منع MenuStrip التحكم في التأثر بالأنماط المرئية.

لذلك قمت بإنشاء نموذج بسيط بشريط قائمة بسيط وأنماط مرئية معطلة فيه Main():

// Application.EnableVisualStyles(); <-- no visual styles
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());

الذي ينتج هذا المظهر (لاحظ الحدود والخلفية الرمادية):

enter image description here

الآن أريد أن أفعل الشيء نفسه بالطريقة التي تتأثر بها عناصر التحكم الأخرى في هذا النموذج بالأنماط المرئية (أريد تعطيل الأنماط المرئية لهذه القائمة المنسدلة فقط).

لذلك حاولت في البداية تعطيل الأنماط المرئية لـ DropDown كل ToolStripMenuItem, ، لكنه لم ينجح.ثم حاولت تعطيل الأنماط المرئية بالكامل MenuStrip, ولكن لم ينجح أي منهما.

إليك رمز MenuStrip المخصص الخاص بي:

class MPMenuStrip : MenuStrip
{
    [DllImportAttribute("uxtheme.dll")]
    private static extern int SetWindowTheme(IntPtr hWnd, string appname, string idlist);

    protected override void OnHandleCreated(EventArgs e)
    {
        // first attempt:
        foreach (ToolStripMenuItem menuItem in this.Items)
            SetWindowTheme(menuItem.DropDown.Handle, "", "");

        // second attempt:
        SetWindowTheme(this.Handle, "", "");
        base.OnHandleCreated(e);
    }
}

على الرغم من استخدام العرف MenuStrip التحكم، متى Application.EnableVisualStyles(); في Main() يتم استدعاء مظهر النموذج كما يلي (الأزرق):

enter image description here

هل لديك أي أفكار عما يمكن أن يؤثر أيضًا على مظهر هذه القائمة المنسدلة؟
ماذا ينقصني؟

شكرًا.

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

المحلول

أنت تفتقد أن MenuStrip ليس عنصر تحكم Windows أصليًا على الإطلاق وبالتالي لا يتأثر بشكل مباشر بموضوع الأنماط المرئية.تتم جميع عمليات العرض عن طريق كود .NET.الفئة الأساسية التي تقوم بذلك هي ToolStripRenderer، مع تطبيقين متوفرين:ToolStripProfessionalRenderer وToolStripSystemRenderer.يحاول الأخير محاكاة مظهر نظام التشغيل، ويمكنك الحصول عليه عن طريق ضبط RenderMode الخاص بـ MenuStrip على "النظام".إن المحاكاة خاطئة إلى حد كبير في أنظمة التشغيل الأحدث مثل Windows 7.

إذا كنت تريد الشكل والمظهر الحقيقي لنظام التشغيل، فاستخدم MainMenu بدلاً من ذلك.لديها بعض القيود مقارنة بـ MenuStrip.إذا كنت تريد تغيير الألوان، فيمكنك تنفيذ العارض الخاص بك وتعديل جدول الألوان الخاص به.كما هو مبين في هذه الإجابة.

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