3

VB 2005 には、XP スタイルでは見栄えがよく、クラシック スタイルでは見栄えの悪い UI がいくつかあります。

ユーザーがどのモードにいるかを検出し、その場でフォームを再フォーマットする方法についてのアイデアはありますか?


回答投稿編集:

ダニエルに感謝します。これでうまくいくようです。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 クラシック スタイル/テーマでは MessageBox が空になり、Windows XP スタイル/テーマでは "C:\WINDOWS\resources\Themes\luna\luna.msstyles" が表示されます。ユーザーがこれら 2 つ以外のテーマを設定した場合に何が起こるかを確認するために、もう少しチェックを行う必要がありますが、大きな問題にはなりません。

4

3 に答える 3

2

GetCurrentThemeName ( MSDN Page ) とDwmIsCompositionEnabledの組み合わせを使用してみてください

最初のものを PInvoke にリンクしたので、コードにドロップできます。2 つ目は、MSDN コメントで提供されているコードを使用できます。

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

これら 2 つの関数から得られる結果を確認してください。別のテーマをいつ使用するかを決定するには、それらで十分です。

于 2008-08-29T16:56:40.620 に答える
1

個人的には、次を使用して、アプリがテーマの下で実行されているかどうかを確認します。

if (Application.RenderWithVisualStyles)
{
    // you're themed
}
于 2008-09-19T17:53:13.777 に答える
0

IsThemeActive WinAPI 関数があります。

于 2008-08-29T16:55:35.787 に答える