سؤال

لدي بعض واجهات المستخدم في VB 2005 التي تبدو رائعة في XP Style، ولكنها تصبح بشعة في النمط الكلاسيكي.

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


تحرير الرد على المشاركة:

شكرًا دانيال، يبدو أن هذا سينجح.أنا أستخدم الحل الأول الذي نشرته باستخدام وظيفة GetCurrentThemeName().

أنا أفعل ما يلي:

إعلان الوظيفة:

 Private Declare Unicode Function GetCurrentThemeName Lib "uxtheme" (ByVal stringThemeName As System.Text.StringBuilder, ByVal lengthThemeName As Integer, ByVal stringColorName As System.Text.StringBuilder, ByVal lengthColorName As Integer, ByVal stringSizeName As System.Text.StringBuilder, ByVal lengthSizeName As Integer) As Int32

نص الكود:


Dim stringThemeName As New System.Text.StringBuilder(260)
Dim stringColorName As New System.Text.StringBuilder(260)
Dim stringSizeName As New System.Text.StringBuilder(260)

GetCurrentTheMename (StringTheMename ، 260 ، StringColorname ، 260 ، Stringsizename ، 260) MsgBox (StringTheMename.ToString)

يظهر صندوق الرسائل فارغًا عندما أكون في نمط/سمة Windows Classic، ويأتي مع "C:\WINDOWS esources hemes\luna\luna.msstyles" إذا كان في نمط/سمة Windows XP.سيتعين علي إجراء المزيد من التدقيق لمعرفة ما يحدث إذا قام المستخدم بتعيين سمة أخرى غير هذين، ولكن لا ينبغي أن تكون مشكلة كبيرة.

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

المحلول

حاول استخدام مزيج من GetCurrentThemeName (صفحة MSDN) و DwmIsCompositionEnabled

لقد قمت بربط الأول بـ PInvoce بحيث يمكنك فقط إسقاطه في الكود الخاص بك، وبالنسبة للثاني يمكنك استخدام الكود الموجود في تعليق MSDN:

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

تعرف على النتائج التي ستحصل عليها من هاتين الوظيفتين؛يجب أن تكون كافية لتحديد متى تريد استخدام سمة مختلفة!

نصائح أخرى

أنا شخصياً أستخدم ما يلي لمعرفة ما إذا كان التطبيق يعمل ضمن الموضوع:

if (Application.RenderWithVisualStyles)
{
    // you're themed
}

هناك IsThemeActive وظيفة WinAPI.

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