diff --git a/src/EasyWindowsApplication/Core/Application.cs b/src/EasyWindowsApplication/Core/Application.cs index de0e00b..c1b4079 100644 --- a/src/EasyWindowsApplication/Core/Application.cs +++ b/src/EasyWindowsApplication/Core/Application.cs @@ -1,4 +1,5 @@ -using EasyWindowsApplication.Common; +using System.Diagnostics; +using EasyWindowsApplication.Common; using EasyWindowsApplication.Share; using EasyWindowsApplication.Core.LayoutEngine; using EasyWindowsApplication.Core.Windowing; @@ -64,6 +65,11 @@ public void Initialize() ControlActivatorRegistry.EnsureInitialized(); _router = new MasterRouter(_registry); + Debug.Assert( + UiDefaultsProvider.IsInitialized, + "UiDefaultsProvider debe inicializarse (UseWinApi / UseWpf / …) " + + "antes de registrar la clase de ventana."); + foreach (var window in _windows) { if (window.IsAlternative) diff --git a/src/EasyWindowsApplication/Core/MasterRouter.cs b/src/EasyWindowsApplication/Core/MasterRouter.cs index 7f162f3..8b1c78c 100644 --- a/src/EasyWindowsApplication/Core/MasterRouter.cs +++ b/src/EasyWindowsApplication/Core/MasterRouter.cs @@ -265,10 +265,13 @@ internal nint WndProc(nint hwnd, uint msg, nint wParam, nint lParam) // Handle WM_ERASEBKGND — paint window background, then LayoutGroup backgrounds on top if (msg == WM.ERASEBKGND) { + bool painted = false; + if (_windowBrushes.TryGetValue(hwnd, out var windowBrush)) { Win32.GetClientRect(hwnd, out RECT rect); Win32.FillRect(wParam, ref rect, windowBrush); + painted = true; } if (_layoutGroupBackgrounds.TryGetValue(hwnd, out var backgrounds)) @@ -288,9 +291,10 @@ internal nint WndProc(nint hwnd, uint msg, nint wParam, nint lParam) Win32.FillRect(wParam, ref r, brush); Win32.DeleteObject(brush); } + painted = true; } - return 1; + if (painted) return 1; } // Handle WM_CTLCOLOR* — return control background brush diff --git a/src/EasyWindowsApplication/Core/UiDefaults/CoreUiDefaults.cs b/src/EasyWindowsApplication/Core/UiDefaults/CoreUiDefaults.cs index ac02d89..550feae 100644 --- a/src/EasyWindowsApplication/Core/UiDefaults/CoreUiDefaults.cs +++ b/src/EasyWindowsApplication/Core/UiDefaults/CoreUiDefaults.cs @@ -23,10 +23,10 @@ internal abstract class CoreUiDefaults : IDefaultUiValues public abstract FontSpec DefaultFont { get; } public virtual Color DefaultForeground - => ColorFromSysColor(Win32.GetSysColor(COLOR_WINDOWTEXT)); + => ColorFromSysColor(Win32.GetSysColor(Win32.COLOR_WINDOWTEXT)); public virtual Color DefaultBackground - => ColorFromSysColor(Win32.GetSysColor(COLOR_WINDOW)); + => ColorFromSysColor(Win32.GetSysColor(Win32.COLOR_WINDOW)); public virtual Thickness DefaultPadding => new(3); public virtual int DefaultControlSpacing => 6; @@ -43,10 +43,4 @@ protected static Color ColorFromSysColor(int colorRef) (byte)(colorRef & 0xFF), (byte)((colorRef >> 8) & 0xFF), (byte)((colorRef >> 16) & 0xFF)); - - // SysColor indices (winuser.h) - private const int COLOR_WINDOW = 5; - private const int COLOR_WINDOWTEXT = 8; - private const int COLOR_BTNFACE = 15; - private const int COLOR_BTNTEXT = 18; } diff --git a/src/EasyWindowsApplication/Core/UiDefaults/UiDefaultsProvider.cs b/src/EasyWindowsApplication/Core/UiDefaults/UiDefaultsProvider.cs index c8fac77..ab139a8 100644 --- a/src/EasyWindowsApplication/Core/UiDefaults/UiDefaultsProvider.cs +++ b/src/EasyWindowsApplication/Core/UiDefaults/UiDefaultsProvider.cs @@ -10,6 +10,7 @@ private sealed class CoreFallbackDefaults : CoreUiDefaults private static IDefaultUiValues _current = new CoreFallbackDefaults(); public static IDefaultUiValues Current => _current; + public static bool IsInitialized => _current is not CoreFallbackDefaults; public static void Set(IDefaultUiValues defaults) => _current = defaults ?? throw new ArgumentNullException(nameof(defaults)); diff --git a/src/EasyWindowsApplication/Core/Win32.cs b/src/EasyWindowsApplication/Core/Win32.cs index 7612392..15147cd 100644 --- a/src/EasyWindowsApplication/Core/Win32.cs +++ b/src/EasyWindowsApplication/Core/Win32.cs @@ -4,6 +4,12 @@ namespace EasyWindowsApplication.Core; internal static partial class Win32 { + // ── System Color Indices (winuser.h) ── + internal const int COLOR_WINDOW = 5; + internal const int COLOR_WINDOWTEXT = 8; + internal const int COLOR_BTNFACE = 15; + internal const int COLOR_BTNTEXT = 18; + // ── Message Loop ── [LibraryImport("user32.dll", SetLastError = true)] internal static partial int GetMessageW(out MSG lpMsg, nint hWnd, uint wMsgFilterMin, uint wMsgFilterMax); diff --git a/src/EasyWindowsApplication/Core/Windowing/Procedures.cs b/src/EasyWindowsApplication/Core/Windowing/Procedures.cs index 63c4d1c..64ee4bc 100644 --- a/src/EasyWindowsApplication/Core/Windowing/Procedures.cs +++ b/src/EasyWindowsApplication/Core/Windowing/Procedures.cs @@ -65,7 +65,7 @@ internal static unsafe nint CreateMainWindow( hInstance = hInstance, hIcon = hIconLarge, hCursor = 0, - hbrBackground = 0, + hbrBackground = (nint)(Win32.COLOR_WINDOW + 1), lpszMenuName = 0, lpszClassName = classNamePtr, hIconSm = hIconSmall @@ -124,7 +124,7 @@ internal static unsafe nint CreateAlternativeWindow( hInstance = hInstance, hIcon = 0, hCursor = 0, - hbrBackground = 0, + hbrBackground = (nint)(Win32.COLOR_WINDOW + 1), lpszMenuName = 0, lpszClassName = classNamePtr, hIconSm = 0 diff --git a/src/EasyWindowsApplication/Core/Windowing/Win32.cs b/src/EasyWindowsApplication/Core/Windowing/Win32.cs index 142dc89..e8e49a3 100644 --- a/src/EasyWindowsApplication/Core/Windowing/Win32.cs +++ b/src/EasyWindowsApplication/Core/Windowing/Win32.cs @@ -5,6 +5,9 @@ namespace EasyWindowsApplication.Core.Windowing; internal static partial class Win32 { + // ── System Color Indices (winuser.h) ── + internal const int COLOR_WINDOW = 5; + [LibraryImport("user32.dll", SetLastError = true, StringMarshalling = StringMarshalling.Utf16)] internal static partial ushort RegisterClassExW(ref WNDCLASSEXW lpWndClass);