Jump to content

Recommended Posts

Posted (edited)

Please test:

<code removed because test only>

Since I'm at home (vacation) I cannot properly test DPI behaviour, that's why I marked the size box in red to see if the scaling works correctly when the DPI is changed. Can somebody test and report?

Thanks.

Edited by UEZ

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Posted
21 minutes ago, UEZ said:

Since I'm at home (vacation) I cannot properly test DPI behaviour, that's why I marked the size box in red to see if the scaling works correctly when the DPI is changed. Can somebody test and report?

It looks like the Edit control is aligned correctly but the ListView control sizebox seems misaligned by 1 pixel. Screenshot in spoiler below.

Spoiler

sizebox2.png

 

Posted

Can you please replace _PaintSizeBox() function with this and test it again?
 

Func _PaintSizeBox($hWnd, $hDC)
    Local $iWinStyle = _WinAPI_GetWindowLong($hWnd, $GWL_STYLE)
    
    ; Only proceed if both horizontal and vertical scrollbars are active
    If Not (BitAND($iWinStyle, $WS_HSCROLL) And BitAND($iWinStyle, $WS_VSCROLL)) Then Return False

    ; 1. Retrieve exact Window and Client dimensions
    Local $tRW = _WinAPI_GetWindowRect($hWnd)
    Local $tRC = _WinAPI_GetClientRect($hWnd)
    
    ; 2. Map Client coordinates to Window-DC space
    Local $tPoint = DllStructCreate($tagPOINT)
    $tPoint.X = 0
    $tPoint.Y = 0
    _WinAPI_ClientToScreen($hWnd, $tPoint)

    ; Calculate border offsets
    Local $iOffL = $tPoint.X - $tRW.Left
    Local $iOffT = $tPoint.Y - $tRW.Top
    
    ; Calculate total window dimensions
    Local $iWinW = $tRW.Right - $tRW.Left
    Local $iWinH = $tRW.Bottom - $tRW.Top

    ; 3. Define the SizeBox Rect
    Local $tCorner = DllStructCreate($tagRECT)
    
    ; LEFT/TOP: Start exactly where the client area ends (scrollbar junction)
    $tCorner.Left   = $iOffL + $tRC.Right
    $tCorner.Top    = $iOffT + $tRC.Bottom
    
    ; RIGHT/BOTTOM: Align with the inner edge of the window border.
    $tCorner.Right  = $iWinW - $iOffL
    $tCorner.Bottom = $iWinH - $iOffT
    
    ; Adjust for ListView the size of the box
    If _WinAPI_GetClassName($hWnd) = "SysListView32" Then
        $tCorner.Right  += 1
        $tCorner.Bottom += 1
    EndIf

    ; 4. Paint the box using the dark theme color
    Local $hBrush = _WinAPI_CreateSolidBrush(_ColorToCOLORREF(0xF00000)) ;;$COLOR_TITLE_DARK
    _WinAPI_FillRect($hDC, $tCorner, $hBrush)
    _WinAPI_DeleteObject($hBrush)

    Return True
EndFunc   ;==>_PaintSizeBox

 

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Posted
20 minutes ago, UEZ said:

Can you please replace _PaintSizeBox() function with this and test it again?

Everything is sized and aligned perfectly. I tested on 100%, 125%, 150% and 175% and it was correct on all of the scaling settings that I was able to test.

The issue with the Edit box losing the overpaint when the cursor goes over is fixed as well. The whole thing with regard to sizebox overpainting is excellent now. :)

  • 2 weeks later...
Posted

There is an interesting bug only in the DPI aware version of the script where some of the controls disappear for approx. 1 second and reappear. It took me a while to figure out exactly where it was happening. It has to do with the non-client painting of the border of the controls.

Repro:

  • Click anywhere in the ListView control so that it has focus
  • Click on the taskbar (or any other program)
  • Click on the titlebar (specifically titlebar) for Sample GUI with Dark Mode
  • ListView control should disappear for 1 second and reappear

It happens with most of the controls. But most notably controls that have scrollbars (whether enabled or not). So this would be a problem when switching back and forth between programs. It happens with the controls that do not have scrollbars as well but it is just not as noticeable.

I do not think that it has anything to do with painting of the sizebox. I tested by removing all border painting code and keeping the sizebox painting functional, and the issue was gone. So painting sizebox is not the problem. It seems to be just the border painting.

The interesting thing is that if you click anywhere in the background of the app and not the titlebar, the issue does not happen. I don't know why it is only the titlebar that causes the issue.

I have narrowed down the code that is causing the issue:

Case $WM_SETFOCUS, $WM_KILLFOCUS
    Local $sClass = _WinAPI_GetClassName($hWnd)
    If _IsBorderedControl($sClass) Then
        ; Trigger WM_NCPAINT to redraw border with updated focus color
        _WinAPI_SetWindowPos($hWnd, 0, 0, 0, 0, 0, BitOR($SWP_NOMOVE, $SWP_NOSIZE, $SWP_NOZORDER, $SWP_FRAMECHANGED))
    EndIf

If you comment out that code temporarily, you will see that the issue can no longer be reproduced. Commenting out that code fixes the problem.

However, then we lose the ability to recolour the border for ListView and TreeView controls because it seems they rely on that to trigger recolouring when focus changes.

Do you know if adding double buffering with _WinAPI_BitBlt to the $WM_NCPAINT of that function could solve this problem?

Posted

Can you try instead?

If _IsBorderedControl($sClass) Then
                ; Trigger WM_NCPAINT to redraw border with updated focus color
                ;_WinAPI_SetWindowPos($hWnd, 0, 0, 0, 0, 0, BitOR($SWP_NOMOVE, $SWP_NOSIZE, $SWP_NOZORDER, $SWP_FRAMECHANGED))
                _WinAPI_RedrawWindow($hWnd, 0, 0, BitOR($RDW_FRAME, $RDW_INVALIDATE, $RDW_NOERASE))
            EndIf

 

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Posted

I have a question regarding your _DateProc() function.

Every once in a while I like to go over things to see if something can be done more efficiently or possibly with less code. I removed the following code:

Case $WM_ERASEBKGND
            Return 1

        Case $WM_SETFOCUS, $WM_KILLFOCUS
            Local $iRet = _WinAPI_CallWindowProc($g_hDateOldProc, $hWnd, $iMsg, $wParam, $lParam)
            _WinAPI_InvalidateRect($hWnd, 0, False)
            Return $iRet

        Case $WM_MOUSEMOVE
            Local $iRet = _WinAPI_CallWindowProc($g_hDateOldProc, $hWnd, $iMsg, $wParam, $lParam)
            If Not $g_bHover Then
                $g_bHover = True
                _WinAPI_InvalidateRect($hWnd, 0, False)
            EndIf
            Return $iRet

        Case $WM_MOUSELEAVE
            $g_bHover = False
            _WinAPI_InvalidateRect($hWnd, 0, False)

 

Everything still worked as expected and I did not notice any negative effects. I am wondering if Windows is handling those behaviours the same way, with or without that section of code.

For the GUIDarkTheme UDF project, would it be safe for me to remove that code?

Posted
Case $WM_ERASEBKGND
            Return 1

This means you're telling Windows not to delete the background, because we've already done that. May flicker when removed.

Case $WM_SETFOCUS, $WM_KILLFOCUS

These messages appear when you click in the field or move away from it (e.g., by pressing the Tab key).

Case $WM_MOUSEMOVE / $WM_MOUSELEAVE

This is the logic behind the hover effect (the frame lights up when the mouse hovers over it).

_WinAPI_InvalidateRect is basically the “Redraw, please!” command for Windows.

 

If everything works fine without the Case checks, you can leave them out, but this may vary depending on the operating system. I haven't noticed any negative effects without that parts.

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Posted
On 4/23/2026 at 3:28 AM, UEZ said:

If everything works fine without the Case checks, you can leave them out, but this may vary depending on the operating system. I haven't noticed any negative effects without that parts.

I really appreciate how you explained the purpose for each Case / window message. That helped my understanding quite a bit. I will keep all of them in place as you have it just in case it may affect other operating system versions. Thank you. :)

Posted

I have something to share that can help improve your _WM_DRAWITEM() for the menubar. It reduces code and improves efficiency.

I was testing your current DPI-aware script and could not figure out why your menubar had the occasional flicker. The white line painting can sometimes cause a flicker, but this was different. It occurs on the entire menubar background. Very rarely. But generally if you open a MsgBox or switch back and forth a few times with another app. Anyway...

The menubar background in GUIDarkTheme UDF does not flicker (although the white line painting sometimes can). So I had to dig into the code and figure out what the difference was. And once I figured it out, I was able to remove a lot of code from the DRAWITEM function which in theory would be more efficient.

I realized that mine was using SetMenuInfo to set a more permanent background to the entire menubar. This meant no need to FillRect on entire menubar, no measuring entire menubar and no flicker.

This was able to remove two additional _WinAPI_FillRect calls and _WinAPI_CreateSolidBrush creations along with any loops and measuring. :)

I added the following to your _MakeMenuOwnerDraw() function:

; Use SetMenuInfo to set permanent menu background (and avoid the occasional flicker)
    Local $hBrush = DllCall("gdi32.dll", 'hwnd', 'CreateSolidBrush', 'int', $COLOR_BG_DARK)
    Local $tInfo = DllStructCreate("int Size;int Mask;int Style;int YMax;handle hBack;int ContextHelpID;ptr MenuData")
    DllStructSetData($tInfo, "Mask", 2)
    DllStructSetData($tInfo, "hBack", $hBrush[0])
    DllStructSetData($tInfo, "Size", DllStructGetSize($tInfo))
    DllCall("user32.dll", "int", "SetMenuInfo", "hwnd", $g_hMenu, "ptr", DllStructGetPtr($tInfo))
;... just above the repaint that you have aleady
    ; Force immediate repaint of the menu bar
    _GUICtrlMenu_DrawMenuBar($hWnd)
    _WinAPI_RedrawWindow($hWnd, 0, 0, BitOR($RDW_INVALIDATE, $RDW_UPDATENOW))

Your _WM_DRAWITEM() function was able to be reduced significantly:

Func _WM_DRAWITEM($hWnd, $iMsg, $wParam, $lParam)
    Local $tagDRAWITEM = "uint CtlType;uint CtlID;uint itemID;uint itemAction;uint itemState;ptr hwndItem;handle hDC;" & _
                         "long left;long top;long right;long bottom;ulong_ptr itemData"
    Local $t = DllStructCreate($tagDRAWITEM, $lParam)
    If Not IsDllStruct($t) Then Return $GUI_RUNDEFMSG

    If $t.CtlType <> $ODT_MENU Then Return $GUI_RUNDEFMSG

    Local $hDC = $t.hDC
    Local $left = $t.left
    Local $top = $t.top
    Local $right = $t.right
    Local $bottom = $t.bottom
    Local $state = $t.itemState
    Local $itemID = $t.itemID

    ; convert itemID to position
    Local $iPos = -1
    For $i = 0 To UBound($g_aMenuText) - 1
        If $itemID = ($i + 3) Then
            $iPos = $i
            ExitLoop
        EndIf
    Next

    If $iPos < 0 Then $iPos = $itemID
    If $iPos < 0 Or $iPos >= UBound($g_aMenuText) Then $iPos = 0

    Local $sText = $g_aMenuText[$iPos]
    $sText = StringReplace($sText, "&", "")

    ; Colors
    Local $clrBG = _ColorToCOLORREF($COLOR_BG_DARK)
    Local $clrSel = _ColorToCOLORREF($COLOR_MENU_SELECT)
    Local $clrText = _ColorToCOLORREF($COLOR_TEXT_LIGHT)

    ; Draw item background (selected = lighter)
    Local $bSelected = BitAND($state, $ODS_SELECTED)
    Local $bHot = BitAND($state, $ODS_HOTLIGHT)
    Local $hBrush

    If $bSelected Then
        $hBrush = _WinAPI_CreateSolidBrush($clrSel)
    ElseIf $bHot Then
        $hBrush = _WinAPI_CreateSolidBrush(_ColorToCOLORREF($COLOR_HOTTRACK_MENU))
    Else
        $hBrush = _WinAPI_CreateSolidBrush($clrBG)
    EndIf

    Local $tItemRect = DllStructCreate($tagRECT)
    With $tItemRect
        .left = $left
        .top = $top
        .right = $right
        .bottom = $bottom
    EndWith

    _WinAPI_FillRect($hDC, $tItemRect, $hBrush)
    _WinAPI_DeleteObject($hBrush)

    ; Setup font
    Local $hFont = ($g_hMenuFont ? $g_hMenuFont : _WinAPI_GetStockObject($DEFAULT_GUI_FONT))
    Local $hOldFont = _WinAPI_SelectObject($hDC, $hFont)

    _WinAPI_SetBkMode($hDC, $TRANSPARENT)
    If _WinAPI_GetForegroundWindow() <> $g_hGUI Then $clrText = _WinAPI_ColorAdjustLuma($clrText, -30) ;dim menu text when GUI is not active
    _WinAPI_SetTextColor($hDC, $clrText)

    ; Draw text
    Local $tTextRect = DllStructCreate($tagRECT)
    With $tTextRect
        .left = $left + 10
        .top = $top + 4
        .right = $right - 10
        .bottom = $bottom - 4
    EndWith

    DllCall("user32.dll", "int", "DrawTextW", "handle", $hDC, "wstr", $sText, "int", -1, "ptr", DllStructGetPtr($tTextRect), "uint", BitOR($DT_SINGLELINE, $DT_VCENTER, $DT_LEFT, $DT_NOCLIP))

    If $hOldFont Then _WinAPI_SelectObject($hDC, $hOldFont)

    Return 1
EndFunc   ;==>_WM_DRAWITEM

 

  • 3 weeks later...
Posted

First time I have a time to look for this.

Here is little refactored code form opening post, to Au3Check support

;~ SampleControls.au3 in Dark Mode
;~ https://www.autoitscript.com/forum/topic/213268-samplecontrolsau3-in-dark-mode

#AutoIt3Wrapper_Run_AU3Check=Y
#AutoIt3Wrapper_AU3Check_Stop_OnWarning=y
#AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7

;Coded by UEZ build 2026-03-18 beta
;not DPI aware!
#cs
+----------------------+------------------------------------------+-------------------------+
| Theme Name           | Suitable for                             | From Windows            |
+----------------------+------------------------------------------+-------------------------+
| DarkMode_Explorer    | Button, Scrollbar, Slider, TreeView,     | Win10 1809 (Build 17763)|
|                      | ListView, UpDown, Spinner                |                         |
+----------------------+------------------------------------------+-------------------------+
| DarkMode_CFD         | Edit, ComboBox (incl. child Edit)        | Win10 1809 (Build 17763)|
+----------------------+------------------------------------------+-------------------------+
| DarkMode_DarkTheme   | Checkbox, RadioButton, GroupBox          | Win10 1809 (Build 17763)|
+----------------------+------------------------------------------+-------------------------+
| DarkMode_ItemsView   | ListView Header (SysHeader32)            | Win10 1903 (Build 18362)|
+----------------------+------------------------------------------+-------------------------+
| DarkMode_CopyEngine  | ProgressBar                              | Win10 1809 (Build 17763)|
+----------------------+------------------------------------------+-------------------------+
| DarkMode_NormalDark  | general use, rarely needed               | Win10 1809 (Build 17763)|
+----------------------+------------------------------------------+-------------------------+

#ce

#include <APIConstants.au3>
#include <AVIConstants.au3>
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <GuiDateTimePicker.au3>
#include <GuiImageList.au3>
#include <GuiMenu.au3>
#include <GuiMonthCal.au3>
#include <GuiScrollBars.au3>
#include <GuiStatusBar.au3>
#include <GuiTab.au3>
#include <GuiTreeView.au3>
#include <TreeViewConstants.au3>
#include <ListViewConstants.au3>
#include <WinAPIConstants.au3>
#include <WinAPIGdi.au3>
#include <WinAPIProc.au3>
#include <WinAPIRes.au3>
#include <WinAPIShellEx.au3>
#include <WinAPISys.au3>
#include <WinAPISysWin.au3>
#include <WinAPITheme.au3>
#include <WindowsConstants.au3>

Enum $IHCM_USE_CACHED_VALUE, $IHCM_REFRESH
Enum $APPMODE_DEFAULT = 0, $APPMODE_ALLOWDARK, $APPMODE_FORCEDARK, $APPMODE_FORCELIGHT, $APPMODE_MAX
Const $PRF_CLIENT = 0x04
Const $ODS_HOTLIGHT = 0x0040

; Dark Mode Colors (RGB)
Global Const $COLOR_BG_DARK = 0x202020
Global Const $COLOR_TEXT_LIGHT = 0xF0F0F0
Global Const $COLOR_CONTROL_BG = 0x2B2B2B
Global Const $COLOR_EDIT_BG = 0x1E1E1E
Global Const $COLOR_BUTTON_BG = 0x333333
Global Const $COLOR_BORDER = 0x3F3F3F
Global Const $COLOR_BORDER2 = 0xA0A0A0
Global Const $COLOR_HOTTRACK_MENU = 0x3A3A3A
Global Const $COLOR_BORDER_LIGHT = 0xD8D8D8
Global Const $COLOR_MENU_SELECT = 0x505050
Global Const $COLOR_TAB_ACCENT = 0x0078D4
Global Const $COLOR_TAB_ACCENT_LIGHT = 0x60CDFF

; Global variables for subclassing (MUST be declared before _Example()!)
Global $g_hGUI = 0, $g_hTab, $g_ListView
Global $g_aControls[50][3] = [[0, 0, 0]] ; [ControlID, hWnd, OldWndProc]
Global $g_iControlCount = 0
Global $g_pSubclassProc = 0

; Global brushes for _WM_CTLCOLOR (avoids memory leaks)
Global $g_hBrushEdit = 0
Global $g_hBrushButton = 0
Global $g_hBrushBg = 0
Global $g_hBrushGreen
Global $g_hLabelGreen = 0, $g_idLabelGreen
Global $g_idLabelPic, $g_hLabelPic
Global $g_hMenu = 0, $g_hMenu1, $g_hMenu2
Global $h_MenuFont
Global $g_idDate = 0, $g_hDate = 0

; Global variable for tab subclassing
Global $g_hTab_CB, $g_pTab_CB, $g_hProc

; Global variable for SysDateTimePick32 subclassing
Global $g_hDateProc_CB, $g_pDateProc_CB, $g_hDateOldProc

; Structure for NM_CUSTOMDRAW notification
Global Const $tagNMCUSTOMDRAW = $tagNMHDR & ";" & _                                    ; Contains NM_CUSTOMDRAW / NMHDR header among other things
                                "dword dwDrawStage;" & _                               ; Current drawing stage (CDDS_*)
                                "handle hdc;" & _                                      ; Device Context Handle
                                "long left;long top;long right;long bottom;" & _       ; Drawing rectangle
                                "dword_ptr dwItemSpec;" & _                            ; Item index or other info (depending on the control)
                                "uint uItemState;" & _                                 ; State Flags (CDIS_SELECTED, CDIS_FOCUS etc.)
                                "lparam lItemlParam"                                   ; lParam set by the item (e.g., via LVITEM.lParam)


Global $g_aMenuText = [] ; dynamic array for top-level menu texts
Global $arMenuItems[1][8]
$arMenuItems[0][0] = 0
Global $arSideItems[1][10]
$arSideItems[0][0] = 0

Const $ODT_MENU = 1
Const $ODS_SELECTED = 0x0001
Const $ODS_DISABLED = 0x0004

Global Enum $idAbout = 5000
Global $g_hMenu_Sys, $g_idAboutMenu, $g_AboutDummy
Global $g_bHover = False

_GDIPlus_Startup()
_Example()
_GDIPlus_Shutdown()

Func _Example()
    ; Create global brushes
    $g_hBrushEdit = _WinAPI_CreateSolidBrush(_ColorToCOLORREF($COLOR_EDIT_BG))
    $g_hBrushButton = _WinAPI_CreateSolidBrush(_ColorToCOLORREF($COLOR_BUTTON_BG))
    $g_hBrushBg = _WinAPI_CreateSolidBrush(_ColorToCOLORREF($COLOR_BG_DARK))

    #Region GUI
    $g_hGUI = GUICreate("Sample GUI with Dark Mode", 400, 424)
    GUISetIcon(@SystemDir & "\mspaint.exe", 0)
    GUISetBkColor($COLOR_BG_DARK, $g_hGUI)

    $g_hMenu_Sys = _GUICtrlMenu_GetSystemMenu($g_hGUI)
    _GUICtrlMenu_AppendMenu($g_hMenu_Sys, $MF_SEPARATOR, 0, 0)
    _GUICtrlMenu_AppendMenu($g_hMenu_Sys, $MF_STRING, $idAbout, "About")

    ; Register GUI-level WM_CTLCOLOR messages
    GUIRegisterMsg($WM_CTLCOLOREDIT, "_WM_CTLCOLOR")
    GUIRegisterMsg($WM_CTLCOLORLISTBOX, "_WM_CTLCOLOR")
    GUIRegisterMsg($WM_CTLCOLORBTN, "_WM_CTLCOLOR")
    GUIRegisterMsg($WM_CTLCOLORSTATIC, "_WM_CTLCOLOR")
    GUIRegisterMsg($WM_MEASUREITEM, "_WM_MEASUREITEM")
    GUIRegisterMsg($WM_DRAWITEM, "_WM_DRAWITEM")
    GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")
    GUIRegisterMsg($WM_ACTIVATE, "_WM_ACTIVATE")
    GUIRegisterMsg($WM_WINDOWPOSCHANGED, "_WM_WINDOWPOSCHANGED")
    GUIRegisterMsg($WM_MENUCOMMAND, "_WM_MENUCOMMAND")
    GUIRegisterMsg($WM_SYSCOMMAND, "_WM_SYSCOMMAND")
    #EndRegion GUI

    #Region MENU
    Global $g_aMenuText[4]
    $g_aMenuText[0] = "Menu &One"
    $g_aMenuText[1] = "Menu &Two"
    $g_aMenuText[2] = "Menu Th&ree"
    $g_aMenuText[3] = "Menu &Four"

    Local $idMenu1 = GUICtrlCreateMenu($g_aMenuText[0])
    Local $idMenu2 = GUICtrlCreateMenu($g_aMenuText[1])
    GUICtrlCreateMenu($g_aMenuText[2])
    GUICtrlCreateMenu($g_aMenuText[3])
    GUICtrlCreateMenuItem('SubMenu One &A', $idMenu1)
    GUICtrlCreateMenuItem('SubMenu One &B', $idMenu1)
    $g_idAboutMenu = GUICtrlCreateMenuItem('About', $idMenu1)
    $g_hMenu1 = GUICtrlGetHandle($idMenu1)
    $g_hMenu2 = GUICtrlGetHandle($idMenu2)

    ; Owner-draw Top-Level Menu creation
    _MakeMenuOwnerDraw($g_hGUI)
    _EnableMenuHotTrack($g_hMenu)
    #EndRegion MENU

    #Region CONTEXT MENU
    Local $idContextMenu = GUICtrlCreateContextMenu()
    GUICtrlCreateMenuItem("Context Menu", $idContextMenu)
    GUICtrlCreateMenuItem("", $idContextMenu)
    GUICtrlCreateMenuItem("&Properties", $idContextMenu)
    #EndRegion CONTEXT MENU

    #Region PIC
    Local $idPic = GUICtrlCreatePic("", 0, 0, 169, 68)
    GUICtrlSetImage($idPic, "C:\Program Files (x86)\AutoIt3\Examples\GUI\logo4.gif")
    GUICtrlSetTip(-1, '#Region PIC')
    $g_idLabelPic = GUICtrlCreateLabel("Sample Pic", 75, 1, 53, 15)
    $g_hLabelPic = GUICtrlGetHandle($g_idLabelPic)
    #EndRegion PIC

    #Region AVI
    Local $idAvi = GUICtrlCreateAvi("C:\Program Files (x86)\AutoIt3\Examples\GUI\SampleAVI.avi", 0, 180, 10, 32, 32, $ACS_AUTOPLAY)
    #forceref $idAvi
    GUICtrlSetTip(-1, '#Region AVI')
    GUICtrlCreateLabel("Sample avi", 175, 50)
    #EndRegion AVI

    #Region TAB
    Local $idTab = GUICtrlCreateTab(240, 0, 150, 70), $g_hTab = GUICtrlGetHandle($idTab)
    _AddControlForSubclass($idTab)
    GUICtrlCreateTabItem("One")
    GUICtrlSetTip(-1, '#Region TAB1')
    GUICtrlCreateLabel("Sample Tab with TabItems", 250, 40)
    GUICtrlCreateTabItem("Two")
    GUICtrlSetTip(-1, '#Region TAB2')
    Local $idCheckBoxTab2 = GUICtrlCreateCheckbox("Checkbox", 250, 30, 120, 20)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    _WinAPI_SetWindowTheme(GUICtrlGetHandle($idCheckBoxTab2), "DarkMode_DarkTheme", 0)
    GUICtrlCreateTabItem("Three")
    GUICtrlSetTip(-1, '#Region TAB3')
    GUICtrlCreateTabItem("")
    $g_hTab = GUICtrlGetHandle($idTab)
    #EndRegion TAB

    #Region COMBO
    Local $idCombo = GUICtrlCreateCombo("Sample Combo", 250, 80, 120, 100)
    GUICtrlSetData($idCombo, "Item 2|Item 3", "Sample Combo")
    _AddControlForSubclass($idCombo)
    GUICtrlSetTip(-1, '#Region COMBO')
    #EndRegion COMBO

    #Region PROGRESS
    Local $idProgress = GUICtrlCreateProgress(60, 80, 150, 20)
    #forceref $idProgress
    ;_AddControlForSubclass($idProgress)
    GUICtrlSetTip(-1, '#Region PROGRESS')
    GUICtrlSetData(-1, 60)
    GUICtrlCreateLabel("Progress:", 5, 82)
    #EndRegion PROGRESS

    #Region EDIT
    Local $idEdit = GUICtrlCreateEdit(@CRLF & "  Sample Edit Control", 10, 110, 150, 70), $hEditCtrl = GUICtrlGetHandle($idEdit)
    _WinAPI_SetWindowLong($hEditCtrl, $GWL_EXSTYLE, BitAND(_WinAPI_GetWindowLong($hEditCtrl, $GWL_EXSTYLE), BitNOT($WS_EX_CLIENTEDGE)))
    _AddControlForSubclass($idEdit)
    GUICtrlSetTip(-1, '#Region EDIT')
    #EndRegion EDIT

    #Region LIST
    Local $idList = GUICtrlCreateList("", 5, 190, 100, 90), $hList = GUICtrlGetHandle($idList)
    _WinAPI_SetWindowLong($hList, $GWL_EXSTYLE, BitAND(_WinAPI_GetWindowLong($hList, $GWL_EXSTYLE), BitNOT($WS_EX_CLIENTEDGE)))
    _AddControlForSubclass($idList)
    GUICtrlSetTip(-1, '#Region LIST')
    GUICtrlSetData(-1, "A.Sample|B.List|C.Control|D.Here", "B.List")
    #EndRegion LIST

    #Region ICON
    GUICtrlCreateIcon("explorer.exe", 0, 175, 120)
    GUICtrlSetTip(-1, '#Region ICON')
    GUICtrlCreateLabel("Icon", 180, 160, 50, 20)
    #EndRegion ICON

    #Region LIST VIEW
    Local $idListView = GUICtrlCreateListView("Sample|ListView|", 110, 190, 110, 80, $LVS_REPORT)
    _AddControlForSubclass($idListView)
    GUICtrlSetBkColor($idListView, $COLOR_EDIT_BG)
    GUICtrlSetColor($idListView, $COLOR_TEXT_LIGHT)
    GUICtrlSetTip(-1, '#Region LIST VIEW')
    GUICtrlCreateListViewItem("A|One", $idListView)
    GUICtrlCreateListViewItem("B|Two", $idListView)
    GUICtrlCreateListViewItem("C|Three", $idListView)
    $g_ListView = GUICtrlGetHandle($idListView)
    #EndRegion LIST VIEW

    #Region GROUP WITH RADIO BUTTONS
    Local $idGroup = GUICtrlCreateGroup("Sample Group", 230, 120)
    GUICtrlSetColor($idGroup, $COLOR_TEXT_LIGHT)
    Local $idRadio1 = GUICtrlCreateRadio("Radio One", 250, 140, 80)
    GUICtrlSetTip($idRadio1, '#Region RADIO1')
    GUICtrlSetState($idRadio1, $GUI_CHECKED)
    Local $idRadio2 = GUICtrlCreateRadio("Radio Two", 250, 165, 80)
    GUICtrlSetTip($idRadio2, '#Region RADIO2')
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    _WinAPI_SetWindowTheme(GUICtrlGetHandle($idRadio1), "DarkMode_DarkTheme", 0)
    _WinAPI_SetWindowTheme(GUICtrlGetHandle($idRadio2), "DarkMode_DarkTheme", 0)
    _WinAPI_SetWindowTheme(GUICtrlGetHandle($idGroup), "DarkMode_DarkTheme", 0)
    #EndRegion GROUP WITH RADIO BUTTONS

    #Region UPDOWN
    GUICtrlCreateLabel("UpDown", 350, 115)
    GUICtrlSetColor(-1, $COLOR_TEXT_LIGHT)
    Local $idInput = GUICtrlCreateInput("42", 350, 130, 40, 20)
    _AddControlForSubclass($idInput)
    Local $idUpDown = GUICtrlCreateUpdown(-1)
    _AddControlForSubclass($idUpDown)
    #EndRegion UPDOWN

    #Region LABEL
    $g_idLabelGreen = GUICtrlCreateLabel("Green" & @CRLF & "Label", 350, 165, 40, 40)
    $g_hLabelGreen = GUICtrlGetHandle($g_idLabelGreen)
    GUICtrlSetTip($g_idLabelGreen, '#Region LABEL')
    $g_hBrushGreen = _WinAPI_CreateSolidBrush(_ColorToCOLORREF(0x00FF00)) ; green background
    #EndRegion LABEL

    #Region SLIDER
    GUICtrlCreateLabel("Slider:", 235, 215)
    Local $idSlider = GUICtrlCreateSlider(270, 210, 120, 30)
    _AddControlForSubclass($idSlider)
    GUICtrlSetTip(-1, '#Region SLIDER')
    GUICtrlSetData(-1, 30)
    #EndRegion SLIDER

    #Region INPUT
    Local $idInput2 = GUICtrlCreateInput("Sample Input Box", 235, 255, 130, 20)
    _AddControlForSubclass($idInput2)
    GUICtrlSetTip(-1, '#Region INPUT')
    #EndRegion INPUT

    #Region DATE
    $g_idDate = GUICtrlCreateDate("", 5, 280, 200, 20)
    $g_hDate = GUICtrlGetHandle($g_idDate)
    _AddControlForSubclass($g_idDate)
    GUICtrlSetTip(-1, '#Region DATE')
    GUICtrlCreateLabel("(Date control expands into a calendar)", 10, 305, 200, 20)
    #EndRegion DATE

    #Region BUTTON
    Local $idButton = GUICtrlCreateButton("Sample Button", 10, 330, 100, 30)
    _AddControlForSubclass($idButton)
    GUICtrlSetTip(-1, '#Region BUTTON')
    #EndRegion BUTTON

    #Region CHECKBOX
    Local $idCheckBox = GUICtrlCreateCheckbox("Checkbox", 130, 335, 80, 20)
    GUICtrlSetTip(-1, '#Region CHECKBOX')
    GUICtrlSetState(-1, $GUI_CHECKED)
    _WinAPI_SetWindowTheme(GUICtrlGetHandle($idCheckBox), "DarkMode_DarkTheme", 0)
    #EndRegion CHECKBOX

    #Region TREEVIEW ONE
    Local $idTreeView1 = GUICtrlCreateTreeView(210, 290, 80, 80)
    _AddControlForSubclass($idTreeView1)
    GUICtrlSetBkColor($idTreeView1, $COLOR_EDIT_BG)
    GUICtrlSetColor($idTreeView1, $COLOR_TEXT_LIGHT)
    GUICtrlSetTip(-1, '#Region TREEVIEW ONE')
    Local $idTreeViewItem = GUICtrlCreateTreeViewItem("TreeView", $idTreeView1)
    GUICtrlCreateTreeViewItem("Item1", $idTreeViewItem)
    GUICtrlCreateTreeViewItem("Item2", $idTreeViewItem)
    GUICtrlCreateTreeViewItem("Foo", -1)
    GUICtrlSetState($idTreeViewItem, $GUI_EXPAND)
    #EndRegion TREEVIEW ONE

    #Region TREEVIEW TWO
    Local $idTreeView2 = GUICtrlCreateTreeView(295, 290, 103, 80, $TVS_CHECKBOXES)
    _AddControlForSubclass($idTreeView2)
    GUICtrlSetBkColor($idTreeView2, $COLOR_EDIT_BG)
    GUICtrlSetColor($idTreeView2, $COLOR_TEXT_LIGHT)
    GUICtrlSetTip(-1, '#Region TREEVIEW TWO')
    GUICtrlCreateTreeViewItem("TreeView", $idTreeView2)
    GUICtrlCreateTreeViewItem("With", $idTreeView2)
    GUICtrlCreateTreeViewItem("$TVS_CHECKBOXES", $idTreeView2)
    GUICtrlSetState(-1, $GUI_CHECKED)
    GUICtrlCreateTreeViewItem("Style", $idTreeView2)
    _SetDarkTreeViewCheckboxes(GUICtrlGetHandle($idTreeView2), 16, 16)
    #EndRegion TREEVIEW TWO

    #Region Statusbar
    Local $hStatusbar = _GUICtrlStatusBar_Create($g_hGUI)
    _AddControlHandleForSubclass($hStatusbar)
    Local $aParts[4] = [75, 150, 300, 400]
    _GUICtrlStatusBar_SetParts($hStatusbar, $aParts)
    _GUICtrlStatusBar_SetText($hStatusbar, "Part 0", 0)
    _GUICtrlStatusBar_SetText($hStatusbar, "Part 1", 1)
    _GUICtrlStatusBar_SetText($hStatusbar, "Part 2", 2)
    _GUICtrlStatusBar_SetText($hStatusbar, "Part 3", 3)
    #EndRegion Statusbar

    ; Apply Dark Mode
    _ApplyDarkModeToAllControls()

    ; Handle scrollbars for windows that have them
    _EnableDarkScrollBars()

    ; Register a custom window procedure for the tab control for owner-drawing
    $g_hTab_CB = DllCallbackRegister('_WinProc', 'ptr', 'hwnd;uint;wparam;lparam')
    $g_pTab_CB = DllCallbackGetPtr($g_hTab_CB)
    $g_hProc = _WinAPI_SetWindowLong($g_hTab, $GWL_WNDPROC, $g_pTab_CB)

    ; Register a custom window procedure for the date control for owner-drawing
    $g_hDateProc_CB = DllCallbackRegister('_DateProc', 'ptr', 'hwnd;uint;wparam;lparam')
    $g_pDateProc_CB = DllCallbackGetPtr($g_hDateProc_CB)
    $g_hDateOldProc = _WinAPI_SetWindowLong($g_hDate, $GWL_WNDPROC, $g_pDateProc_CB)

    $g_AboutDummy = GUICtrlCreateDummy()

    ; Applying dark mode to Tooltips - thanks to WildByDesign
    Local $aData = _WinAPI_EnumProcessWindows(0, False)
    For $i = 1 To $aData[0][0]
        If $aData[$i][1] = "tooltips_class32" Then _WinAPI_SetWindowTheme($aData[$i][0], 'DarkMode_Explorer', 'ToolTip')
    Next

    GUISetState(@SW_SHOW)

    _OverpaintWhiteLine()
    _WinAPI_RedrawWindow($g_hGUI, 0, 0, BitOR($RDW_INVALIDATE, $RDW_UPDATENOW))

    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_RESTORE
                _WinAPI_RedrawWindow($g_hGUI, 0, 0, BitOR($RDW_INVALIDATE, $RDW_UPDATENOW, $RDW_ERASE, $RDW_ALLCHILDREN))
            Case $GUI_EVENT_CLOSE
                _CleanupSubclassing()
                _CleanupBrushes()
                ExitLoop
            Case $g_AboutDummy
                MsgBox($MB_SYSTEMMODAL, "About", "Example coded by UEZ :-)", 10, $g_hGUI)
        EndSwitch
    WEnd
    ; Restore the original window procedure for the tab control
    _WinAPI_SetWindowLong($g_hTab, $GWL_WNDPROC, $g_hProc)
    DllCallbackFree($g_hTab_CB)

    _WinAPI_SetWindowLong($g_hDate, $GWL_WNDPROC, $g_hDateOldProc)
    DllCallbackFree($g_hDateProc_CB)

    GUIDelete()
EndFunc   ;==>_Example

Func _GDIPlus_DrawRoundRect($hGfx, $iX, $iY, $iW, $iH, $iDiameter, $iBrushARGB, $iPenARGB, $fPenWidth = 1.0)
    Local Const $hPath = _GDIPlus_PathCreate()

    ; Top-left arc
    _GDIPlus_PathAddArc($hPath, $iX, $iY, $iDiameter, $iDiameter, 180, 90)
    ; Top-right arc
    _GDIPlus_PathAddArc($hPath, $iX + $iW - $iDiameter, $iY, $iDiameter, $iDiameter, 270, 90)
    ; Bottom-right arc
    _GDIPlus_PathAddArc($hPath, $iX + $iW - $iDiameter, $iY + $iH - $iDiameter, $iDiameter, $iDiameter, 0, 90)
    ; Bottom-left arc
    _GDIPlus_PathAddArc($hPath, $iX, $iY + $iH - $iDiameter, $iDiameter, $iDiameter, 90, 90)

    _GDIPlus_PathCloseFigure($hPath)

    If $iBrushARGB <> 0 Then
        Local Const $hBrush = _GDIPlus_BrushCreateSolid($iBrushARGB)
        _GDIPlus_GraphicsFillPath($hGfx, $hPath, $hBrush)
        _GDIPlus_BrushDispose($hBrush)
    EndIf

    If $iPenARGB <> 0 Then
        Local Const $hPen = _GDIPlus_PenCreate($iPenARGB, $fPenWidth)
        _GDIPlus_GraphicsDrawPath($hGfx, $hPath, $hPen)
        _GDIPlus_PenDispose($hPen)
    EndIf

    _GDIPlus_PathDispose($hPath)
EndFunc   ;==>_GDIPlus_DrawRoundRect

Func _SetDarkTreeViewCheckboxesGDIp($hTreeView, $iW = 16, $iH = 16)
    Local $hImageList = _GUIImageList_Create($iW, $iH, 5, 3)

    Local $hBmp = _GDIPlus_BitmapCreateFromScan0($iW, $iH)
    Local $hGfx = _GDIPlus_ImageGetGraphicsContext($hBmp)
    _GDIPlus_GraphicsSetSmoothingMode($hGfx, $GDIP_SMOOTHINGMODE_HIGHQUALITY)

    ; --- Index 0: Unchecked ---
    _GDIPlus_GraphicsClear($hGfx, 0xFF000000 + $COLOR_EDIT_BG)
    _GDIPlus_DrawRoundRect($hGfx, 2 / 16 * $iW, 2 / 16 * $iH, 12 / 16 * $iW, 12 / 16 * $iH, 3, 0, 0xFF000000 + $COLOR_BORDER2, 1.5)

    Local $hBmp_GDI = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp, 0)
    _GUIImageList_Add($hImageList, $hBmp_GDI)
    _WinAPI_DeleteObject($hBmp_GDI)

    ; --- Index 1: Checked ---
    _GDIPlus_GraphicsClear($hGfx, 0xFF000000 + $COLOR_EDIT_BG)
    _GDIPlus_DrawRoundRect($hGfx, 2 / 16 * $iW, 2 / 16 * $iH, 12 / 16 * $iW, 12 / 16 * $iH, 3, 0xFF60CDFF, 0xFF60CDFF, 1.0)

    Local $hCheckPen = _GDIPlus_PenCreate(0xFF0F2028, 1.5)
    _GDIPlus_GraphicsDrawLine($hGfx, 5 / 16 * $iW,  8 / 16 * $iH,  7 / 16 * $iW, 10 / 16 * $iH, $hCheckPen)
    _GDIPlus_GraphicsDrawLine($hGfx, 7 / 16 * $iW, 10 / 16 * $iH, 11 / 16 * $iW,  6 / 16 * $iH, $hCheckPen)

    $hBmp_GDI = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp, 0)
    _GUIImageList_Add($hImageList, $hBmp_GDI)
    _WinAPI_DeleteObject($hBmp_GDI)

    ; --- Cleanup ---
    _GDIPlus_PenDispose($hCheckPen)
    _GDIPlus_GraphicsDispose($hGfx)
    _GDIPlus_ImageDispose($hBmp)
    _GUICtrlTreeView_SetStateImageList($hTreeView, $hImageList)

    Return True
EndFunc   ;==>_SetDarkTreeViewCheckboxesGDIp

Func _SetDarkTreeViewCheckboxes($hTreeView, $iW = 16, $iH = 16)
    Local $hImageList = _GUIImageList_Create($iW, $iH, 5, 3)

    Local $hBmp_GDI = _WinAPI_ExtractThemeBackground($g_hGUI, 2) ;thanks to WildByDesign for the idea!
    _GUIImageList_Add($hImageList, $hBmp_GDI)
    _WinAPI_DeleteObject($hBmp_GDI)

    $hBmp_GDI = _WinAPI_ExtractThemeBackground($g_hGUI, 5)
    _GUIImageList_Add($hImageList, $hBmp_GDI)
    _WinAPI_DeleteObject($hBmp_GDI)

    _GUICtrlTreeView_SetStateImageList($hTreeView, $hImageList)

    Return True
EndFunc   ;==>_SetDarkTreeViewCheckboxes

Func _WinAPI_ExtractThemeBackground($hGUI, $iState, $iPart = 3, $iWidth = 16, $iHeight = 16)
    Local $hTheme = _WinAPI_OpenThemeData($hGUI, "DarkMode_DarkTheme::Button")
    If @error Then Return SetError(1, 0, 0)
    Local $hDC = _WinAPI_GetDC($hGUI)
    Local $hHBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iWidth, $iHeight)
    Local $hMemDC = _WinAPI_CreateCompatibleDC($hDC)
    Local $hObjOld = _WinAPI_SelectObject($hMemDC, $hHBitmap)
    Local $tRECT = _WinAPI_CreateRectEx(0, 0, $iWidth, $iHeight)
    _WinAPI_DrawThemeBackground($hTheme, $iPart, $iState, $hMemDC, $tRECT)
    If @error Then
        _WinAPI_CloseThemeData($hTheme)
        Return SetError(2, 0, 0)
    EndIf
    _WinAPI_SelectObject($hMemDC, $hObjOld)
    _WinAPI_ReleaseDC($hGUI, $hDC)
    _WinAPI_DeleteDC($hMemDC)
    _WinAPI_CloseThemeData($hTheme)
    Return $hHBitmap
EndFunc   ;==>_WinAPI_ExtractThemeBackground

Func _EnableMenuHotTrack($hMenu)
    If Not $hMenu Then Return False

    Local $tagMENUINFO = "dword cbSize;dword fMask;dword dwStyle;uint cyMax;handle hbrBack;dword dwContextHelpID;ulong_ptr dwMenuData"

    Local Const $MIM_STYLE = 0x00000010
    Local Const $MNS_HOTTRACK = 0x08000000

    Local $tMI = DllStructCreate($tagMENUINFO)
    With $tMI
        .cbSize = DllStructGetSize($tMI)
        .fMask = $MIM_STYLE
        .dwStyle = $MNS_HOTTRACK
    EndWith

    _GUICtrlMenu_SetMenuInfo($hMenu, $tMI)

    ; redraw menus
    _GUICtrlMenu_DrawMenuBar($g_hGUI)
    Return True
EndFunc   ;==>_EnableMenuHotTrack

Func _OverpaintWhiteLine()
    Local $hDC = _WinAPI_GetWindowDC($g_hGUI)
    If Not $hDC Then Return

    Local $tWndRect = _WinAPI_GetWindowRect($g_hGUI)
    Local $iWndWidth = $tWndRect.right - $tWndRect.left

    ; 1. Caption height
    Local $iCaptionHeight = _WinAPI_GetSystemMetrics($SM_CYCAPTION)

    ; 2. Border height (top)
    Local $iBorderHeight = _WinAPI_GetSystemMetrics($SM_CYSIZEFRAME)
    If $iBorderHeight = 0 Then $iBorderHeight = _WinAPI_GetSystemMetrics($SM_CYFIXEDFRAME)

    ; 3. Determine menu height dynamically
    Local $iMenuHeight = _WinAPI_GetSystemMetrics($SM_CYMENU) ; standard menu height

    ; Alternative: get menu height via GetMenuBarInfo
    Local $tMenuBarInfo = DllStructCreate("dword cbSize;long left;long top;long right;long bottom;handle hwndMenu;handle hwndItem;bool fBarFocused;bool fFocused")
    DllStructSetData($tMenuBarInfo, "cbSize", DllStructGetSize($tMenuBarInfo))
    Local $aResult = DllCall("user32.dll", "bool", "GetMenuBarInfo", "hwnd", $g_hGUI, "long", 0xFFFFFFFD, "long", 0, "ptr", DllStructGetPtr($tMenuBarInfo))

    If IsArray($aResult) And $aResult[0] Then
        ; Calculate the actual menu height from the coordinates
        Local $iMenuTop = $tMenuBarInfo.top
        Local $iMenuBottom = $tMenuBarInfo.bottom
        ; Convert to window coordinates
        $iMenuHeight = ($iMenuBottom - $iMenuTop)
    EndIf

    ; The white line is directly below the menu
    Local $iWhiteLineY = $iCaptionHeight + $iBorderHeight + $iMenuHeight - _WinAPI_GetSystemMetrics($SM_CYFIXEDFRAME) * 2

    ; Overpaint the white line (1x2 pixels)
    Local $tRect = DllStructCreate($tagRECT)
    With $tRect
        .left = 0
        .top = $iWhiteLineY
        .right = $iWndWidth
        .bottom = $iWhiteLineY + 2 ; 2 pixels high
    EndWith

    Local $hBrush = _WinAPI_CreateSolidBrush(_ColorToCOLORREF($COLOR_BG_DARK))
    _WinAPI_FillRect($hDC, $tRect, $hBrush)
    _WinAPI_DeleteObject($hBrush)
    _WinAPI_ReleaseDC($g_hGUI, $hDC)
EndFunc   ;==>_OverpaintWhiteLine

Func _ColorToCOLORREF($iColor) ;RGB to BGR
    Local $iR = BitAND(BitShift($iColor, 16), 0xFF)
    Local $iG = BitAND(BitShift($iColor, 8), 0xFF)
    Local $iB = BitAND($iColor, 0xFF)
    Return BitOR(BitShift($iB, -16), BitShift($iG, -8), $iR)
EndFunc   ;==>_ColorToCOLORREF

Func _AddControlForSubclass($iCtrlID)
    Local $hCtrl = GUICtrlGetHandle($iCtrlID)
    If $hCtrl Then
        $g_aControls[$g_iControlCount][0] = $iCtrlID
        $g_aControls[$g_iControlCount][1] = $hCtrl
        $g_aControls[$g_iControlCount][2] = 0 ; Placeholder for OldWndProc
        $g_iControlCount += 1
    EndIf
EndFunc   ;==>_AddControlForSubclass

Func _AddControlHandleForSubclass($hCtrl)
    If $hCtrl Then
        $g_aControls[$g_iControlCount][0] = 0
        $g_aControls[$g_iControlCount][1] = $hCtrl
        $g_aControls[$g_iControlCount][2] = 0
        $g_iControlCount += 1
    EndIf
EndFunc   ;==>_AddControlHandleForSubclass

Func _ApplyDarkModeToAllControls()
    ; DWM Dark Mode for the main window
    _WinAPI_SetPreferredAppMode($APPMODE_FORCEDARK)

    ; Create subclass callback
    If Not $g_pSubclassProc Then $g_pSubclassProc = DllCallbackRegister("_SubclassProc", "lresult", "hwnd;uint;wparam;lparam;uint_ptr;dword_ptr")

    ; Subclass all controls
    Local $hCtrl, $sClass, $hEdit, $hComboLBox, $hHeader, $hUpDown
    For $i = 0 To $g_iControlCount - 1
        $hCtrl = $g_aControls[$i][1]
        If $hCtrl Then
            $sClass = _WinAPI_GetClassName($hCtrl)
            ; Use SetWindowSubclass
            _WinAPI_SetWindowSubclass($hCtrl, DllCallbackGetPtr($g_pSubclassProc), $i, 0)

            ; Special themes for different control types
            Switch StringLower($sClass)
                Case "edit", "richedit", "richedit20a", "richedit20w"
                    _WinAPI_SetWindowTheme($hCtrl, "DarkMode_CFD", 0)
                Case "button"
                    _WinAPI_SetWindowTheme($hCtrl, "DarkMode_Explorer", 0)
                Case "combobox"
                    _WinAPI_SetWindowTheme($hCtrl, "DarkMode_CFD", 0)
                    ; Handle ComboBox child-edit
                    $hEdit = _WinAPI_FindWindowEx($hCtrl, 0, "Edit", "")
                    If $hEdit Then
                        _WinAPI_SetWindowTheme($hEdit, "DarkMode_CFD", 0)
                        _WinAPI_AllowDarkModeForWindow($hEdit, True)
                    EndIf
                    ; ComboBox dropdown list
                    $hComboLBox = _WinAPI_FindWindowEx($hCtrl, 0, "ComboLBox", "")
                    If $hComboLBox Then
                        _WinAPI_SetWindowTheme($hComboLBox, "DarkMode_Explorer", 0)
                        _WinAPI_AllowDarkModeForWindow($hComboLBox, True)
                    EndIf
                Case "syslistview32"
                    _WinAPI_SetWindowTheme($hCtrl, "DarkMode_Explorer", 0)
                    ; ListView extended styles for better dark mode
                    _SendMessage($hCtrl, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_DOUBLEBUFFER, $LVS_EX_DOUBLEBUFFER)
                    ; Also make the ListView header dark
                    $hHeader = _SendMessage($hCtrl, $LVM_GETHEADER, 0, 0)
                    If $hHeader Then
                        _WinAPI_SetWindowTheme($hHeader, "DarkMode_ItemsView", 0)
                    EndIf
                Case "systreeview32"
                    _WinAPI_SetWindowTheme($hCtrl, "DarkMode_Explorer", 0)
                Case "msctls_trackbar32" ; Slider
                    _WinAPI_SetWindowTheme($hCtrl, "DarkMode_Explorer", 0)
                Case "systabcontrol32"
                    _WinAPI_SetWindowTheme($hCtrl, "DarkMode_Explorer", "") ;must be ""
                    ; tab-Control background
                    _SendMessage($hCtrl, 0x132D, 0, $COLOR_BG_DARK) ; TCM_SETBKCOLOR
                    ; Try to make the UpDown (spinner for too many tabs) dark as well
                    $hUpDown = _WinAPI_FindWindowEx($hCtrl, 0, "msctls_updown32", "")
                    If $hUpDown Then _WinAPI_SetWindowTheme($hUpDown, "DarkMode_Explorer", 0)
                Case "listbox"
                    _WinAPI_SetWindowTheme($hCtrl, "DarkMode_Explorer", 0)
                Case "msctls_progress32"
                    _WinAPI_SetWindowTheme($hCtrl, "DarkMode_CopyEngine", 0)
                Case "scrollbar"
                    _WinAPI_SetWindowTheme($hCtrl, "DarkMode_Explorer", 0)
                Case "sysdatetimepick32"
;~                  ConsoleWrite(_WinAPI_SetWindowTheme($hCtrl, "Explorer", 0) & @CRLF)
;~                  _WinAPI_AllowDarkModeForWindow($hCtrl, True)
                Case "msctls_statusbar32"
                    _WinAPI_SetWindowTheme($hCtrl, "DarkMode_DarkTheme", 0)
                Case Else
                    _WinAPI_SetWindowTheme($hCtrl, "DarkMode_Explorer", 0)
            EndSwitch

            _WinAPI_AllowDarkModeForWindow($hCtrl, True)
        EndIf
    Next

    ; Update theme system
    _WinAPI_RefreshImmersiveColorPolicyState()
    _WinAPI_FlushMenuThemes()
    _WinAPI_DwmSetWindowAttribute($g_hGUI, $DWMWA_USE_IMMERSIVE_DARK_MODE, True)

    ; Redraw GUI
    _WinAPI_RedrawWindow($g_hGUI, 0, 0, $RDW_UPDATENOW)
EndFunc   ;==>_ApplyDarkModeToAllControls

Func _CleanupSubclassing()
    ; Remove all subclasses
    If $g_pSubclassProc Then
        Local $hCtrl
        For $i = 0 To $g_iControlCount - 1
            $hCtrl = $g_aControls[$i][1]
            If $hCtrl Then
                _WinAPI_RemoveWindowSubclass($hCtrl, DllCallbackGetPtr($g_pSubclassProc), $i)
            EndIf
        Next
        DllCallbackFree($g_pSubclassProc)
        $g_pSubclassProc = 0
    EndIf
EndFunc   ;==>_CleanupSubclassing

Func _SubclassProc($hWnd, $iMsg, $wParam, $lParam, $iID, $pData)
    #forceref $iID, $pData
    Local $hDC
    Switch $iMsg
        Case $WM_NOTIFY
            Local $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
            Local $hFrom = $tNMHDR.hWndFrom
            Local $iCode = $tNMHDR.Code
            If $iCode = $NM_CUSTOMDRAW Then
                Local $tNMCD = DllStructCreate($tagNMCUSTOMDRAW, $lParam)
                Local $dwStage = $tNMCD.dwDrawStage
                $hDC = $tNMCD.hdc
                Switch StringLower(_WinAPI_GetClassName($hFrom))
                    Case "sysheader32"
                        Switch $dwStage
                            Case $CDDS_PREPAINT
                                Return $CDRF_NOTIFYITEMDRAW
                            Case $CDDS_ITEMPREPAINT
                                _WinAPI_SetTextColor($hDC, _ColorToCOLORREF($COLOR_TEXT_LIGHT))
                                _WinAPI_SetBkColor($hDC, _ColorToCOLORREF($COLOR_BG_DARK))
                                Return BitOR($CDRF_NEWFONT, $CDRF_NOTIFYPOSTPAINT)
                        EndSwitch
                EndSwitch
            EndIf

        Case $WM_PAINT
            Return _WinAPI_DefSubclassProc($hWnd, $iMsg, $wParam, $lParam) ; <- gehört zu Case $WM_PAINT

        Case $WM_NCPAINT
            Local $sClass = StringLower(_WinAPI_GetClassName($hWnd))
            If $sClass = "edit" Or $sClass = "listbox" Then
                Local $iRet = _WinAPI_DefSubclassProc($hWnd, $iMsg, $wParam, $lParam)
                $hDC = _WinAPI_GetWindowDC($hWnd)
                Local $tRect = _WinAPI_GetWindowRect($hWnd)
                Local $iW = $tRect.Right - $tRect.Left
                Local $iH = $tRect.Bottom - $tRect.Top
                Local $hPen = _WinAPI_CreatePen(0, 1, _ColorToCOLORREF($COLOR_BORDER))
                Local $hOldPen = _WinAPI_SelectObject($hDC, $hPen)
                Local $hNull = _WinAPI_GetStockObject(5)
                Local $hOldBr = _WinAPI_SelectObject($hDC, $hNull)
                DllCall("gdi32.dll", "bool", "Rectangle", "handle", $hDC, "int", 0, "int", 0, "int", $iW, "int", $iH)
                _WinAPI_SelectObject($hDC, $hOldPen)
                _WinAPI_SelectObject($hDC, $hOldBr)
                _WinAPI_DeleteObject($hPen)
                _WinAPI_ReleaseDC($hWnd, $hDC)
                Return $iRet
            EndIf
    EndSwitch
    Return _WinAPI_DefSubclassProc($hWnd, $iMsg, $wParam, $lParam)
EndFunc   ;==>_SubclassProc

Func _DateProc($hWnd, $iMsg, $wParam, $lParam)
    Local $iRet
    Switch $iMsg
        Case $WM_PAINT
            Local $tPaint = DllStructCreate($tagPAINTSTRUCT)
            Local $hDC = _WinAPI_BeginPaint($hWnd, $tPaint)

            Local $tClient = _WinAPI_GetClientRect($hWnd)
            Local $iW = $tClient.Right
            Local $iH = $tClient.Bottom

            ; --- Memory DC for flicker-free rendering ---
            Local $hMemDC = _WinAPI_CreateCompatibleDC($hDC)
            Local $hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iW, $iH)
            Local $hOldBmp = _WinAPI_SelectObject($hMemDC, $hBitmap)

            ; 1. Let Windows draw the light-mode control into memory DC
            _WinAPI_CallWindowProc($g_hDateOldProc, $hWnd, $WM_PRINTCLIENT, $hMemDC, $PRF_CLIENT)

            ; 2. Invert all pixels (background becomes black, text white, selection orange)
            Local $tRect = DllStructCreate($tagRECT)
            $tRect.right = $iW
            $tRect.bottom = $iH
            _WinAPI_InvertRect($hMemDC, $tRect)

            ; --- 3. PIXEL HACK: destroy orange highlight & set background color ---
            Local $iSize = $iW * $iH
            Local $tPixels = DllStructCreate("dword c[" & $iSize & "]")
            ; Load pixel array directly from bitmap memory
            Local $iBytes = DllCall("gdi32.dll", "long", "GetBitmapBits", "handle", $hBitmap, "long", $iSize * 4, "ptr", DllStructGetPtr($tPixels))[0]

            If $iBytes = $iSize * 4 Then
                Local $iPixel, $r, $g, $b, $iGray
                For $i = 1 To $iSize
                    $iPixel = $tPixels.c(($i))

                    ; Split into color channels
                    $b = BitAND($iPixel, 0xFF)
                    $g = BitAND(BitShift($iPixel, 8), 0xFF)
                    $r = BitAND(BitShift($iPixel, 16), 0xFF)

                    ; Convert to grayscale (orange becomes mid-gray)
                    $iGray = Int(($r + $g + $b) / 3)

                    ; Very dark pixel = inverted white background
                    If $iGray < 15 Then
                        $iPixel = $COLOR_BG_DARK ; Replace with exact GUI background color
                    Else
                        ; Grayscale value for text (white) and selection (gray)
                        ; (negative BitShift shifts left in AutoIt)
                        $iPixel = BitOR(BitShift($iGray, -16), BitShift($iGray, -8), $iGray)
                    EndIf

                    $tPixels.c(($i)) = $iPixel
                Next
                ; Write cleaned pixels back into the bitmap
                DllCall("gdi32.dll", "long", "SetBitmapBits", "handle", $hBitmap, "long", $iSize * 4, "ptr", DllStructGetPtr($tPixels))
            EndIf
            ; --- END PIXEL HACK ---

            ; --- Border color (hover effect) ---
            Local $iBorderColor = $COLOR_BORDER
            If _WinAPI_GetFocus() = $hWnd Then $iBorderColor = $COLOR_BORDER
            Local $tCursorPos = DllStructCreate($tagPOINT)
            DllCall("user32.dll", "bool", "GetCursorPos", "struct*", $tCursorPos)
            DllCall("user32.dll", "bool", "ScreenToClient", "hwnd", $hWnd, "struct*", $tCursorPos)
            If $tCursorPos.X >= 0 And $tCursorPos.X <= $iW And $tCursorPos.Y >= 0 And $tCursorPos.Y <= $iH Then
                $iBorderColor = $COLOR_BORDER_LIGHT
            EndIf

            ; --- Draw border ---
            Local $hPen = _WinAPI_CreatePen(0, 1, _ColorToCOLORREF($iBorderColor))
            Local $hNullBr = _WinAPI_GetStockObject(5)
            Local $hOldPen = _WinAPI_SelectObject($hMemDC, $hPen)
            Local $hOldBr = _WinAPI_SelectObject($hMemDC, $hNullBr)
            DllCall("gdi32.dll", "bool", "Rectangle", "handle", $hMemDC, "int", 0, "int", 0, "int", $iW, "int", $iH)
            _WinAPI_SelectObject($hMemDC, $hOldPen)
            _WinAPI_SelectObject($hMemDC, $hOldBr)
            _WinAPI_DeleteObject($hPen)

            ; --- Copy finished result to screen in one step (no flicker) ---
            _WinAPI_BitBlt($hDC, 0, 0, $iW, $iH, $hMemDC, 0, 0, $SRCCOPY)

            ; --- Cleanup ---
            _WinAPI_SelectObject($hMemDC, $hOldBmp)
            _WinAPI_DeleteObject($hBitmap)
            _WinAPI_DeleteDC($hMemDC)
            _WinAPI_EndPaint($hWnd, $tPaint)
            Return 0

        Case $WM_ERASEBKGND
            Return 1

        Case $WM_SETFOCUS, $WM_KILLFOCUS
            $iRet = _WinAPI_CallWindowProc($g_hDateOldProc, $hWnd, $iMsg, $wParam, $lParam)
            _WinAPI_InvalidateRect($hWnd, 0, False)
            Return $iRet

        Case $WM_MOUSEMOVE
            $iRet = _WinAPI_CallWindowProc($g_hDateOldProc, $hWnd, $iMsg, $wParam, $lParam)
            If Not $g_bHover Then
                $g_bHover = True
                _WinAPI_InvalidateRect($hWnd, 0, False)
            EndIf
            Return $iRet

        Case $WM_MOUSELEAVE
            $g_bHover = False
            _WinAPI_InvalidateRect($hWnd, 0, False)

    EndSwitch

    Return _WinAPI_CallWindowProc($g_hDateOldProc, $hWnd, $iMsg, $wParam, $lParam)
EndFunc   ;==>_DateProc

Func _MakeMenuOwnerDraw($hWnd)
    ; Get menu handle
    $g_hMenu = _GUICtrlMenu_GetMenu($hWnd)
    If Not $g_hMenu Then Return False

    Local $iCount = _GUICtrlMenu_GetItemCount($g_hMenu)
    If $iCount <= 0 Then Return False

    ReDim $g_aMenuText[$iCount]

    Local $tText, $iLen
    For $i = 0 To $iCount - 1
        ; retrieve text via GetMenuStringW (works better than _GUICtrlMenu_GetItemText)
        $tText = DllStructCreate("wchar s[256]")
        $iLen = DllCall("user32.dll", "int", "GetMenuStringW", "handle", $g_hMenu, "uint", $i, "struct*", $tText, "int", 255, "uint", $MF_BYPOSITION)

        If IsArray($iLen) And $iLen[0] > 0 Then
            $g_aMenuText[$i] = $tText.s
        Else
            $g_aMenuText[$i] = ""
        EndIf

        ; set top-level item to owner-draw
        _GUICtrlMenu_SetItemType($g_hMenu, $i, $MFT_OWNERDRAW, True)
    Next

    ; redraw menu bar immediately
    _GUICtrlMenu_DrawMenuBar($hWnd)
    _WinAPI_RedrawWindow($hWnd, 0, 0, BitOR($RDW_INVALIDATE, $RDW_UPDATENOW))

    Return True
EndFunc   ;==>_MakeMenuOwnerDraw

Func _WM_MEASUREITEM($hWnd, $iMsg, $wParam, $lParam)
    #forceref $iMsg, $wParam
    Local $tagMEASUREITEM = "uint CtlType;uint CtlID;uint itemID;uint itemWidth;uint itemHeight;ulong_ptr itemData"
    Local $t = DllStructCreate($tagMEASUREITEM, $lParam)
    If Not IsDllStruct($t) Then Return $GUI_RUNDEFMSG

    If $t.CtlType <> $ODT_MENU Then Return $GUI_RUNDEFMSG

    Local $itemID = $t.itemID

    ; itemID is the control ID, not the position!
    ; We must derive the position from the itemID
    Local $iPos = -1
    For $i = 0 To UBound($g_aMenuText) - 1
        If $itemID = ($i + 3) Then ; Offset of 3 due to internal IDs
            $iPos = $i
            ExitLoop
        EndIf
    Next

    ; Fallback: try the itemID directly
    If $iPos < 0 Then $iPos = $itemID
    If $iPos < 0 Or $iPos >= UBound($g_aMenuText) Then $iPos = 0

    Local $sText = $g_aMenuText[$iPos]

    ; Calculate text dimensions
    Local $hDC = _WinAPI_GetDC($hWnd)
    Local $hFont = _SendMessage($hWnd, $WM_GETFONT, 0, 0)
    If Not $hFont Then $hFont = _WinAPI_GetStockObject($DEFAULT_GUI_FONT)
    Local $hOldFont = _WinAPI_SelectObject($hDC, $hFont)

    Local $tSize = _WinAPI_GetTextExtentPoint32($hDC, $sText)
    Local $iTextWidth = $tSize.X
    Local $iTextHeight = $tSize.Y

    _WinAPI_SelectObject($hDC, $hOldFont)
    _WinAPI_ReleaseDC($hWnd, $hDC)

    ; Set dimensions with padding
    $t.itemWidth = $iTextWidth + 1
    $t.itemHeight = $iTextHeight + 1

    Return 1
EndFunc   ;==>_WM_MEASUREITEM

Func _WM_DRAWITEM($hWnd, $iMsg, $wParam, $lParam)
    #forceref $iMsg, $wParam
    Local $tagDRAWITEM = "uint CtlType;uint CtlID;uint itemID;uint itemAction;uint itemState;ptr hwndItem;handle hDC;" & _
            "long left;long top;long right;long bottom;ulong_ptr itemData"
    Local $t = DllStructCreate($tagDRAWITEM, $lParam)
    If Not IsDllStruct($t) Then Return $GUI_RUNDEFMSG

    If $t.CtlType <> $ODT_MENU Then Return $GUI_RUNDEFMSG

    Local $hDC = $t.hDC
    Local $left = $t.left
    Local $top = $t.top
    Local $right = $t.right
    Local $bottom = $t.bottom
    Local $state = $t.itemState
    Local $itemID = $t.itemID

    ; convert itemID to position
    Local $iPos = -1
    For $i = 0 To UBound($g_aMenuText) - 1
        If $itemID = ($i + 3) Then
            $iPos = $i
            ExitLoop
        EndIf
    Next

    If $iPos < 0 Then $iPos = $itemID
    If $iPos < 0 Or $iPos >= UBound($g_aMenuText) Then $iPos = 0

    Local $sText = $g_aMenuText[$iPos]
    $sText = StringReplace($sText, "&", "")

    ; Colors
    Local $clrBG = _ColorToCOLORREF($COLOR_BG_DARK)
    Local $clrSel = _ColorToCOLORREF(0x505050)
    Local $clrText = _ColorToCOLORREF($COLOR_TEXT_LIGHT)

    Static $iDrawCount = 0
    Static $bFullBarDrawn = False

    ; Count how many items were drawn in this "draw cycle"
    $iDrawCount += 1

    Local $tClient
    Local $iFullWidth
    ; If we are at the first item AND the bar has not yet been drawn
    If $iPos = 0 And Not $bFullBarDrawn Then
        ; Get the full window width
        $tClient = _WinAPI_GetClientRect($hWnd)
        $iFullWidth = $tClient.right

        ; Fill the entire menu bar
        Local $tFullMenuBar = DllStructCreate($tagRECT)
        With $tFullMenuBar
            .left = 0
            .top = $top
            .right = $iFullWidth + 3
            .bottom = $bottom
        EndWith

        Local $hFullBrush = _WinAPI_CreateSolidBrush($clrBG)
        _WinAPI_FillRect($hDC, $tFullMenuBar, $hFullBrush)
        _WinAPI_DeleteObject($hFullBrush)
    EndIf

    ; After drawing all items, mark as "drawn"
    If $iDrawCount >= UBound($g_aMenuText) Then
        $bFullBarDrawn = True
        $iDrawCount = 0
    EndIf

    ; Draw background for the area AFTER the last menu item
    If $iPos = (UBound($g_aMenuText) - 1) Then ; Last menu
        $tClient = _WinAPI_GetClientRect($hWnd)
        $iFullWidth = $tClient.right

        ; Fill only the area to the RIGHT of the last menu item
        If $right < $iFullWidth Then
            Local $tEmptyArea = DllStructCreate($tagRECT)
            With $tEmptyArea
                .left = $right
                .top = $top
                .right = $iFullWidth + _WinAPI_GetSystemMetrics(7)
                .bottom = $bottom
            EndWith

            Local $hEmptyBrush = _WinAPI_CreateSolidBrush($clrBG)
            _WinAPI_FillRect($hDC, $tEmptyArea, $hEmptyBrush)
            _WinAPI_DeleteObject($hEmptyBrush)
        EndIf
    EndIf

    ; Draw item background (selected = lighter)
    Local $bSelected = BitAND($state, $ODS_SELECTED)
    Local $bHot = BitAND($state, $ODS_HOTLIGHT)
    Local $hBrush

    If $bSelected Then
        $hBrush = _WinAPI_CreateSolidBrush($clrSel)
    ElseIf $bHot Then
        $hBrush = _WinAPI_CreateSolidBrush($COLOR_HOTTRACK_MENU)
    Else
        $hBrush = _WinAPI_CreateSolidBrush($clrBG)
    EndIf

    Local $tItemRect = DllStructCreate($tagRECT)
    With $tItemRect
        .left = $left
        .top = $top
        .right = $right
        .bottom = $bottom
    EndWith

    _WinAPI_FillRect($hDC, $tItemRect, $hBrush)
    _WinAPI_DeleteObject($hBrush)

    ; Setup font
    Local $hFont = _SendMessage($hWnd, $WM_GETFONT, 0, 0)
    If Not $hFont Then $hFont = _WinAPI_GetStockObject($DEFAULT_GUI_FONT)
    Local $hOldFont = _WinAPI_SelectObject($hDC, $hFont)

    _WinAPI_SetBkMode($hDC, $TRANSPARENT)
    _WinAPI_SetTextColor($hDC, $clrText)

    ; Draw text
    Local $tTextRect = DllStructCreate($tagRECT)
    With $tTextRect
        .left = $left + 10
        .top = $top + 4
        .right = $right - 10
        .bottom = $bottom - 4
    EndWith

    DllCall("user32.dll", "int", "DrawTextW", "handle", $hDC, "wstr", $sText, "int", -1, "ptr", DllStructGetPtr($tTextRect), "uint", BitOR($DT_SINGLELINE, $DT_VCENTER, $DT_LEFT))

    If $hOldFont Then _WinAPI_SelectObject($hDC, $hOldFont)

    Return 1
EndFunc   ;==>_WM_DRAWITEM

Func _WM_CTLCOLOR($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd
    Local $hDC = $wParam
    Local $hCtrl = $lParam

    ; If the control is the special green label -> return green background
    If $hCtrl = $g_hLabelGreen Then
        ; black text on a green background
        _WinAPI_SetTextColor($hDC, _ColorToCOLORREF(0x000000))
        _WinAPI_SetBkColor($hDC, _ColorToCOLORREF(0x00FF00))
        _WinAPI_SetBkMode($hDC, $OPAQUE) ; important, otherwise it remains transparent and you cannot see the background
        If $g_hBrushGreen Then Return $g_hBrushGreen
    EndIf

    ; --- Special case: Make "Sample Pic" label transparent ---
    If $hCtrl = $g_hLabelPic Then
        ; set transparent background
        _WinAPI_SetBkMode($hDC, $TRANSPARENT)
        ; set text color (if necessary) - e.g., white
        _WinAPI_SetTextColor($hDC, _ColorToCOLORREF($COLOR_TEXT_LIGHT))
        ; return NULL_BRUSH (stock object), so Windows does NOT fill with your dark brush
        Local $hNull = _WinAPI_GetStockObject(5) ; 5 = NULL_BRUSH
        If $hNull Then Return $hNull
        ; Fallback if not available:
        Return $GUI_RUNDEFMSG
    EndIf

    ; --- Default behavior for all other statics / controls ---
    _WinAPI_SetTextColor($hDC, _ColorToCOLORREF($COLOR_TEXT_LIGHT))

    Local $hBrush = $g_hBrushEdit
    Local $iColor = $COLOR_EDIT_BG

    Switch $iMsg
        Case $WM_CTLCOLORBTN
            $hBrush = $g_hBrushButton
            $iColor = $COLOR_BUTTON_BG
        Case $WM_CTLCOLORSTATIC
            $hBrush = $g_hBrushBg
            $iColor = $COLOR_BG_DARK
    EndSwitch
    _WinAPI_SetBkColor($hDC, _ColorToCOLORREF($iColor))
    _WinAPI_SetBkMode($hDC, $TRANSPARENT)

    Return $hBrush
EndFunc   ;==>_WM_CTLCOLOR

Func _WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $tInfo, $tBuffer, $tBuffer2, $iCtrl
    #forceref $iIDFrom, $tInfo, $tBuffer, $tBuffer2
    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hWndFrom = HWnd($tNMHDR.hWndFrom)
    $iIDFrom = $tNMHDR.IDFrom
    $iCode = $tNMHDR.Code
    Local $hBrush

    ; --- Slider (msctls_trackbar32) custom drawing ---
    If $iCode = $NM_CUSTOMDRAW And StringLower(_WinAPI_GetClassName($hWndFrom)) = "msctls_trackbar32" Then
        Local $tNMCD = DllStructCreate($tagNMCUSTOMDRAW, $lParam)
        Local $dwStage = $tNMCD.dwDrawStage
        Local $hDC = $tNMCD.hdc
        Local $dwItemSpec = $tNMCD.dwItemSpec
        Local $tPoints
        Switch $dwStage
            Case $CDDS_PREPAINT
                $tNMCD.ItemState = BitXOR($tNMCD.ItemState, $CDIS_FOCUS)
                Return $CDRF_NOTIFYSUBITEMDRAW

            Case 0x00010001 ;BitOR($CDDS_SUBITEM, $CDDS_ITEMPREPAINT)
                Switch $dwItemSpec
                    Case $TBCD_THUMB

                        ; Determine thumb style from control style flags
                        Local $iStyle       = _WinAPI_GetWindowLong($hWndFrom, $GWL_STYLE)
                        Local $bNoThumb     = BitAND($iStyle, $TBS_NOTHUMB) <> 0        ; no thumb visible
                        Local $bTop         = BitAND($iStyle, $TBS_TOP) <> 0            ; tip points up (horizontal)
                        Local $bBoth        = BitAND($iStyle, $TBS_BOTH) <> 0           ; rectangular thumb
                        Local $bVert        = BitAND($iStyle, $TBS_VERT) <> 0           ; vertical slider
                        Local $bDownIsLeft  = BitAND($iStyle, $TBS_DOWNISLEFT) <> 0     ; vert: tip points left
                        Local $bBottom      = Not $bTop And Not $bBoth And Not $bVert   ; default: tip points down
                        #forceref $bBottom

                        ; No thumb style — skip custom drawing, let Windows handle (= invisible)
                        If $bNoThumb Then Return $CDRF_SKIPDEFAULT

                        Local $iL = $tNMCD.left
                        Local $iT = $tNMCD.top
                        Local $iR = $tNMCD.right - 1
                        Local $iB = $tNMCD.bottom
                        Local $iMid   = $bVert ? ($iT + $iB) / 2 : ($iL + $iR) / 2
                        Local $iSplit = $bVert ? $iR - ($iB - $iT) / 2 : $iB - ($iR - $iL) / 2

                        Local $tPt = DllStructCreate($tagPOINT)
                        DllCall("user32.dll", "bool", "GetCursorPos", "struct*", $tPt)
                        _WinAPI_ScreenToClient($hWndFrom, $tPt)
                        Local $bHot = ($tPt.X >= $iL And $tPt.X <= $iR And $tPt.Y >= $iT And $tPt.Y <= $iB - 1)

                        Local $iColor = _ColorToCOLORREF($bHot ? 0x60CDFF : 0x0078D4)

                        $hBrush = _WinAPI_CreateSolidBrush($iColor)
                        Local $hPen   = _WinAPI_CreatePen(0, 1, _ColorToCOLORREF($COLOR_CONTROL_BG))
                        Local $hOldBrush = _WinAPI_SelectObject($hDC, $hBrush)
                        Local $hOldPen   = _WinAPI_SelectObject($hDC, $hPen)

                        If $bBoth Then
                            ; rectangular thumb
                            DllCall("gdi32.dll", "bool", "Rectangle", "handle", $hDC, "int", $iL, "int", $iT, "int", $iR + 1, "int", $iB)
                        ElseIf $bVert Then
                            ; vertical slider — pentagon tip points right (default) or left (TBS_DOWNISLEFT)
                            Local $iMidV   = ($iT + $iB) / 2
                            Local $iSplitV = $bDownIsLeft ? $iL + ($iB - $iT) / 2 : $iR - ($iB - $iT) / 2
                            $tPoints = DllStructCreate("int p[10]")
                            If $bDownIsLeft Then
                                ; tip points LEFT
                                $tPoints.p((1)) = $iL
                                $tPoints.p((2)) = $iMidV
                                $tPoints.p((3)) = $iSplitV
                                $tPoints.p((4)) = $iT
                                $tPoints.p((5)) = $iR
                                $tPoints.p((6)) = $iT
                                $tPoints.p((7)) = $iR
                                $tPoints.p((8)) = $iB
                                $tPoints.p((9)) = $iSplitV
                                $tPoints.p((10)) = $iB
                            Else
                                ; tip points RIGHT
                                $tPoints.p((1)) = $iR
                                $tPoints.p((2)) = $iMidV
                                $tPoints.p((3)) = $iSplitV
                                $tPoints.p((4)) = $iB
                                $tPoints.p((5)) = $iL
                                $tPoints.p((6)) = $iB
                                $tPoints.p((7)) = $iL
                                $tPoints.p((8)) = $iT
                                $tPoints.p((9)) = $iSplitV
                                $tPoints.p((10)) = $iT
                            EndIf
                            DllCall("gdi32.dll", "bool", "Polygon", "handle", $hDC, "struct*", $tPoints, "int", 5)
                        ElseIf $bTop Then
                            ; TBS_TOP — pentagon tip points UP
                            Local $iSplitTop = $iT + ($iR - $iL) / 2
                            $tPoints = DllStructCreate("int p[10]")
                            $tPoints.p((1)) = $iMid
                            $tPoints.p((2)) = $iT
                            $tPoints.p((3)) = $iR
                            $tPoints.p((4)) = $iSplitTop
                            $tPoints.p((5)) = $iR
                            $tPoints.p((6)) = $iB
                            $tPoints.p((7)) = $iL
                            $tPoints.p((8)) = $iB
                            $tPoints.p((9)) = $iL
                            $tPoints.p((10)) = $iSplitTop
                            DllCall("gdi32.dll", "bool", "Polygon", "handle", $hDC, "struct*", $tPoints, "int", 5)
                        Else
                            ; TBS_BOTTOM (default) — pentagon tip points DOWN
                            $tPoints = DllStructCreate("int p[10]")
                            $tPoints.p((1)) = $iL
                            $tPoints.p((2)) = $iT
                            $tPoints.p((3)) = $iR
                            $tPoints.p((4)) = $iT
                            $tPoints.p((5)) = $iR
                            $tPoints.p((6)) = $iSplit
                            $tPoints.p((7)) = $iMid
                            $tPoints.p((8)) = $iB
                            $tPoints.p((9)) = $iL
                            $tPoints.p((10)) = $iSplit
                            DllCall("gdi32.dll", "bool", "Polygon", "handle", $hDC, "struct*", $tPoints, "int", 5)
                        EndIf

                        _WinAPI_SelectObject($hDC, $hOldBrush)
                        _WinAPI_SelectObject($hDC, $hOldPen)
                        _WinAPI_DeleteObject($hBrush)
                        _WinAPI_DeleteObject($hPen)
                        Return $CDRF_SKIPDEFAULT

                    Case $TBCD_CHANNEL
                        $hBrush = _WinAPI_CreateSolidBrush(_ColorToCOLORREF($COLOR_MENU_SELECT))
                        Local $tRECT2 = DllStructCreate($tagRECT)
                        $tRECT2.Left = $tNMCD.left
                        $tRECT2.Top    = $tNMCD.top
                        $tRECT2.Right = $tNMCD.right
                        $tRECT2.Bottom = $tNMCD.bottom
                        _WinAPI_FillRect($hDC, $tRECT2, $hBrush)
                        _WinAPI_DeleteObject($hBrush)
                        Return $CDRF_SKIPDEFAULT

                    Case Else
                        Return $CDRF_DODEFAULT ; channel + ticks drawn by Windows
                EndSwitch
        EndSwitch
    EndIf

    ; --- Per-control notification handling ---
    Local Static $iTheme

    Switch $hWndFrom
        Case $g_hDate ; thanks to argumentum for the code :-)
            Switch $iCode
                Case $NM_SETFOCUS
                    ; Disable visual theme when DateTime control receives focus
                    _WinAPI_SetThemeAppProperties(0)

                Case $NM_KILLFOCUS
                    _WinAPI_SetThemeAppProperties($iTheme)  ; argumentum

                Case $DTN_DROPDOWN
                    ; Apply dark colors when the calendar dropdown opens
                    _WinAPI_SetWindowTheme($iCtrl, "", "")
                    $iCtrl = _GUICtrlDTP_GetMonthCal($hWndFrom)
                    _GUICtrlMonthCal_SetColor($iCtrl, $MCSC_TEXT, $COLOR_TEXT_LIGHT)
                    _GUICtrlMonthCal_SetColor($iCtrl, $MCSC_TITLEBK, $COLOR_BG_DARK)
                    _GUICtrlMonthCal_SetColor($iCtrl, $MCSC_TITLETEXT, $COLOR_TEXT_LIGHT)
                    _GUICtrlMonthCal_SetColor($iCtrl, $MCSC_MONTHBK, $COLOR_BG_DARK)
                    _GUICtrlMonthCal_SetColor($iCtrl, $MCSC_TRAILINGTEXT, $COLOR_TEXT_LIGHT)

                Case $DTN_CLOSEUP
                    ; Calendar dropdown closed - no action needed

            EndSwitch
    EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc   ;==>_WM_NOTIFY

Func _WM_ACTIVATE($hWnd, $iMsg, $wParam, $lParam)
    #forceref $iMsg, $wParam, $lParam
    If $hWnd <> $g_hGUI Then Return $GUI_RUNDEFMSG
    _OverpaintWhiteLine()
    Return $GUI_RUNDEFMSG
EndFunc   ;==>_WM_ACTIVATE

Func _WM_WINDOWPOSCHANGED($hWnd, $iMsg, $wParam, $lParam)
    #forceref $iMsg, $wParam, $lParam
    If $hWnd <> $g_hGUI Then Return $GUI_RUNDEFMSG
    _OverpaintWhiteLine()
    Return $GUI_RUNDEFMSG
EndFunc   ;==>_WM_WINDOWPOSCHANGED

Func _WM_MENUCOMMAND($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg
    Local $iPos = $wParam ;Menu Item Position (0-based index)
    Local $hMenu = $lParam ;Menu Handle
    Switch $hMenu
        Case $g_hMenu1
            ConsoleWrite("From Menu One" & @CRLF)
            Switch $iPos
                Case 0  ; SubMenu One A
                    ConsoleWrite("SubMenu One A clicked" & @CRLF)
                Case 1  ; SubMenu One B
                    ConsoleWrite("SubMenu One B clicked" & @CRLF)
                Case 2  ; About
                    ConsoleWrite("About clicked!" & @CRLF)
                    GUICtrlSendToDummy($g_AboutDummy)
                    Return 0
            EndSwitch
    EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc   ;==>_WM_MENUCOMMAND

Func _WM_SYSCOMMAND($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $lParam
    Switch BitAND($wParam, 0x0000FFFF)
        Case $idAbout
            GUICtrlSendToDummy($g_AboutDummy)
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>_WM_SYSCOMMAND

Func _CleanupBrushes()
    ; Delete all brushes
    If $g_hBrushEdit Then _WinAPI_DeleteObject($g_hBrushEdit)
    If $g_hBrushButton Then _WinAPI_DeleteObject($g_hBrushButton)
    If $g_hBrushBg Then _WinAPI_DeleteObject($g_hBrushBg)
    If $g_hBrushGreen Then _WinAPI_DeleteObject($g_hBrushGreen)
EndFunc   ;==>_CleanupBrushes

Func _EnableDarkScrollBars()
    ; Try to enable Dark Mode for all scrollbars (also for TreeView with checkboxes)
    Local $tScrollInfo, $sClass, $hCtrl, $hChild
    For $i = 0 To $g_iControlCount - 1
        $hCtrl = $g_aControls[$i][1]
        If Not $hCtrl Then ContinueLoop

        ; 1ï¸� Normal attempt (works for most controls)
        $tScrollInfo = _GUIScrollBars_GetScrollInfoEx($hCtrl, 1)
        If IsDllStruct($tScrollInfo) Then _WinAPI_SetWindowTheme($hCtrl, "DarkMode_Explorer", 0)

        ; 2ï¸� Extension: If the control has its own scrollbar child windows (e.g., TreeView with $TVS_CHECKBOXES)
        $hChild = _WinAPI_GetWindow($hCtrl, $GW_CHILD)
        While $hChild
            $sClass = _WinAPI_GetClassName($hChild)
            If StringCompare($sClass, "ScrollBar") = 0 Then
                ; Set DarkMode on the ScrollBar itself
                _WinAPI_SetWindowTheme($hChild, "DarkMode_Explorer", 0)
                _WinAPI_AllowDarkModeForWindow($hChild, True)
            EndIf
            $hChild = _WinAPI_GetWindow($hChild, $GW_HWNDNEXT)
        WEnd
    Next
EndFunc   ;==>_EnableDarkScrollBars

Func _WinProc($hWnd, $iMsg, $wParam, $lParam) ; Custom window procedure for tab control with Dark Mode
    Switch $iMsg
        Case $WM_ERASEBKGND
            Return 1 ; Prevent background erase to avoid flicker

        Case $WM_PAINT
            Local $tPaint = DllStructCreate($tagPAINTSTRUCT)
            Local $hDC = DllCall("user32.dll", "handle", "BeginPaint", "hwnd", $hWnd, "struct*", $tPaint)
            If @error Or Not $hDC[0] Then Return _WinAPI_CallWindowProc($g_hProc, $hWnd, $iMsg, $wParam, $lParam)
            $hDC = $hDC[0]

            ; Get client rectangle
            Local $tClient = _WinAPI_GetClientRect($hWnd)
            If Not IsDllStruct($tClient) Then
                _WinAPI_EndPaint($hWnd, $tPaint)
                Return 0
            EndIf

            Local $iWidth = $tClient.Right
            Local $iHeight = $tClient.Bottom

            ; Create memory DC for double buffering
            Local $hMemDC = _WinAPI_CreateCompatibleDC($hDC)
            Local $hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iWidth, $iHeight)
            Local $hOldBmp = _WinAPI_SelectObject($hMemDC, $hBitmap)

            ; Fill background but exclude overlapping GUI controls from painting
            Local $hParent = _WinAPI_GetParent($hWnd)
            Local $hChild = _WinAPI_GetWindow($hParent, $GW_CHILD)
            Local $tCR, $tPR = _WinAPI_GetWindowRect($hWnd)
            Local $left, $top, $right, $bottom

            While $hChild
                If $hChild <> $hWnd And _WinAPI_IsWindowVisible($hChild) Then
                    $tCR = _WinAPI_GetWindowRect($hChild)
                    ; Only exclude controls that lie fully within the tab control area
                    If $tCR.left >= $tPR.left And $tCR.right <= $tPR.right And $tCR.top >= $tPR.top And $tCR.bottom <= $tPR.bottom Then
                        $left = $tCR.left - $tPR.left
                        $top = $tCR.top - $tPR.top
                        $right = $tCR.right - $tPR.left
                        $bottom = $tCR.bottom - $tPR.top
                        ; Exclude from offscreen bitmap (prevents black fill)
                        DllCall("gdi32.dll", "int", "ExcludeClipRect", "handle", $hMemDC, "int", $left, "int", $top, "int", $right, "int", $bottom)
                        ; Exclude from screen DC (prevents BitBlt overwrite)
                        DllCall("gdi32.dll", "int", "ExcludeClipRect", "handle", $hDC, "int", $left, "int", $top, "int", $right, "int", $bottom)
                    EndIf
                EndIf
                $hChild = _WinAPI_GetWindow($hChild, $GW_HWNDNEXT)
            WEnd

            ; Fill background
            Local $hBrush = _WinAPI_CreateSolidBrush(_ColorToCOLORREF($COLOR_BG_DARK))
            _WinAPI_FillRect($hMemDC, $tClient, $hBrush)
            _WinAPI_DeleteObject($hBrush)

            ; Get tab info
            Local $iTabCount = _SendMessage($hWnd, $TCM_GETITEMCOUNT, 0, 0)
            Local $iCurSel = _SendMessage($hWnd, $TCM_GETCURSEL, 0, 0)

            ; Setup font
            Local $hFont = _SendMessage($hWnd, $WM_GETFONT, 0, 0)
            If Not $hFont Then $hFont = _WinAPI_GetStockObject($DEFAULT_GUI_FONT)
            Local $hOldFont = _WinAPI_SelectObject($hMemDC, $hFont)

            _WinAPI_SetBkMode($hMemDC, $TRANSPARENT)
            _WinAPI_SetTextColor($hMemDC, _ColorToCOLORREF($COLOR_TEXT_LIGHT))

            ; Draw each tab
            Local $aResult, $tRect, $iLeft, $iTop, $iRight, $iBottom, $tItem, $tText, $bSelected, $iTabColor, $hTabBrush, $tTabRect, _
                    $sText, $hPen, $hOldPen, $hPenSep, $hOldPenSep, $tTextRect, $hBorderPen, $hOldBorderPen, $hNullBrush, $hOldBorderBrush

            For $i = 0 To $iTabCount - 1
                ; Get tab rectangle using TCM_GETITEMRECT
                $tRect = DllStructCreate($tagRECT)
                $aResult = DllCall("user32.dll", "lresult", "SendMessageW", _
                        "hwnd", $hWnd, _
                        "uint", $TCM_GETITEMRECT, _
                        "wparam", $i, _
                        "struct*", $tRect)
                If @error Or Not $aResult[0] Then ContinueLoop

                $iLeft = $tRect.Left
                $iTop = $tRect.Top
                $iRight = $tRect.Right
                $iBottom = $tRect.Bottom

                ; Skip if rectangle is invalid
                If $iLeft >= $iRight Or $iTop >= $iBottom Then ContinueLoop

                ; Get tab text
                $tItem = DllStructCreate("uint Mask;dword dwState;dword dwStateMask;ptr pszText;int cchTextMax;int iImage;lparam lParam")
                $tText = DllStructCreate("wchar Text[256]")
                With $tItem
                    .Mask = 0x0001 ; TCIF_TEXT
                    .pszText = DllStructGetPtr($tText)
                    .cchTextMax = 256
                EndWith

                DllCall("user32.dll", "lresult", "SendMessageW", _
                        "hwnd", $hWnd, _
                        "uint", $TCM_GETITEMW, _
                        "wparam", $i, _
                        "struct*", $tItem)

                $sText = DllStructGetData($tText, "Text")

                ; Draw tab background
                $bSelected = ($i = $iCurSel)
                $iTabColor = $bSelected ? $COLOR_BUTTON_BG : $COLOR_BG_DARK
                $hTabBrush = _WinAPI_CreateSolidBrush(_ColorToCOLORREF($iTabColor))

                $tTabRect = DllStructCreate($tagRECT)
                With $tTabRect
                    .Left = $iLeft
                    .Top = $iTop
                    .Right = $iRight
                    .Bottom = $iBottom
                EndWith

                _WinAPI_FillRect($hMemDC, $tTabRect, $hTabBrush)
                _WinAPI_DeleteObject($hTabBrush)

                ; Draw selection indicator (top border for selected tab)
                If $bSelected Then
                    $hPen = _WinAPI_CreatePen(0, 2, _ColorToCOLORREF(0x0078D4)) ; Blue accent
                    $hOldPen = _WinAPI_SelectObject($hMemDC, $hPen)
                    _WinAPI_MoveTo($hMemDC, $iLeft, $iTop)
                    _WinAPI_LineTo($hMemDC, $iRight - 2, $iTop)
                    _WinAPI_SelectObject($hMemDC, $hOldPen)
                    _WinAPI_DeleteObject($hPen)
                EndIf

                ; Draw separator between tabs
                If $i < $iTabCount - 1 Then
                    $hPenSep = _WinAPI_CreatePen(0, 1, _ColorToCOLORREF($COLOR_BORDER))
                    $hOldPenSep = _WinAPI_SelectObject($hMemDC, $hPenSep)
                    _WinAPI_MoveTo($hMemDC, $iRight - 1, $iTop + 4)
                    _WinAPI_LineTo($hMemDC, $iRight - 1, $iBottom - 4)
                    _WinAPI_SelectObject($hMemDC, $hOldPenSep)
                    _WinAPI_DeleteObject($hPenSep)
                EndIf

                ; Draw text centered in tab
                $tTextRect = DllStructCreate($tagRECT)
                With $tTextRect
                    .Left = $iLeft + 6
                    .Top = $iTop + 3
                    .Right = $iRight - 6
                    .Bottom = $iBottom - 3
                EndWith
                DllCall("user32.dll", "int", "DrawTextW", _
                        "handle", $hMemDC, _
                        "wstr", $sText, _
                        "int", -1, _
                        "struct*", $tTextRect, _
                        "uint", BitOR($DT_CENTER, $DT_VCENTER, $DT_SINGLELINE))
            Next

            ; Draw border around entire control
            $hBorderPen = _WinAPI_CreatePen(0, 1, _ColorToCOLORREF($COLOR_BORDER))
            $hOldBorderPen = _WinAPI_SelectObject($hMemDC, $hBorderPen)
            $hNullBrush = _WinAPI_GetStockObject(5) ; NULL_BRUSH
            $hOldBorderBrush = _WinAPI_SelectObject($hMemDC, $hNullBrush)

            DllCall("gdi32.dll", "bool", "Rectangle", "handle", $hMemDC, "int", 0, "int", 0, "int", $iWidth, "int", $iHeight)

            _WinAPI_SelectObject($hMemDC, $hOldBorderPen)
            _WinAPI_SelectObject($hMemDC, $hOldBorderBrush)
            _WinAPI_DeleteObject($hBorderPen)

            ; Copy to screen
            _WinAPI_BitBlt($hDC, 0, 0, $iWidth, $iHeight, $hMemDC, 0, 0, $SRCCOPY)

            ; Cleanup
            _WinAPI_SelectObject($hMemDC, $hOldFont)
            _WinAPI_SelectObject($hMemDC, $hOldBmp)
            _WinAPI_DeleteObject($hBitmap)
            _WinAPI_DeleteDC($hMemDC)

            _WinAPI_EndPaint($hWnd, $tPaint)
            Return 0

        Case $WM_PARENTNOTIFY
            If _WinAPI_LoWord($wParam) = 0x0001 Then  ; 0x0001 = WM_CREATE
                Local $hNewChild = HWnd($lParam)
                If StringLower(_WinAPI_GetClassName($hNewChild)) = "msctls_updown32" Then
                    _WinAPI_AllowDarkModeForWindow($hNewChild, True)
                    _WinAPI_SetWindowTheme($hNewChild, "DarkMode_Explorer", 0)
                    _SendMessage($hNewChild, $WM_THEMECHANGED, 0, 0)
                EndIf
            EndIf
            Return _WinAPI_CallWindowProc($g_hProc, $hWnd, $iMsg, $wParam, $lParam)
    EndSwitch

    Return _WinAPI_CallWindowProc($g_hProc, $hWnd, $iMsg, $wParam, $lParam)
EndFunc   ;==>_WinProc

Func _WinAPI_FindWindowEx($hParent, $hAfter, $sClass, $sTitle = "")
    Local $ret = DllCall("user32.dll", "hwnd", "FindWindowExW", "hwnd", $hParent, "hwnd", $hAfter, "wstr", $sClass, "wstr", $sTitle)
    If @error Or Not IsArray($ret) Then Return 0
    Return $ret[0]
EndFunc   ;==>_WinAPI_FindWindowEx


#Region DarkMode API
Func _WinAPI_ShouldAppsUseDarkMode()
    Local $aResult = DllCall("UxTheme.dll", "bool", 132)
    If @error Then Return SetError(1, 0, False)
    Return ($aResult[0] <> 0)
EndFunc   ;==>_WinAPI_ShouldAppsUseDarkMode

Func _WinAPI_AllowDarkModeForWindow($hWND, $bAllow = True)
    Local $aResult = DllCall("UxTheme.dll", "bool", 133, "hwnd", $hWND, "bool", $bAllow)
    If @error Then Return SetError(1, 0, False)
    Return ($aResult[0] <> 0)
EndFunc   ;==>_WinAPI_AllowDarkModeForWindow

Func _WinAPI_FlushMenuThemes()
    Local $aResult = DllCall("UxTheme.dll", "none", 136)
    #forceref $aResult
    If @error Then Return SetError(1, 0, False)
    Return True
EndFunc   ;==>_WinAPI_FlushMenuThemes

Func _WinAPI_RefreshImmersiveColorPolicyState()
    Local $aResult = DllCall("UxTheme.dll", "none", 104)
    #forceref $aResult
    If @error Then Return SetError(1, 0, False)
    Return True
EndFunc   ;==>_WinAPI_RefreshImmersiveColorPolicyState

Func _WinAPI_IsDarkModeAllowedForWindow($hWND)
    Local $aResult = DllCall("UxTheme.dll", "bool", 137, "hwnd", $hWND)
    If @error Then Return SetError(1, 0, False)
    Return ($aResult[0] <> 0)
EndFunc   ;==>_WinAPI_IsDarkModeAllowedForWindow

Func _WinAPI_GetIsImmersiveColorUsingHighContrast($iIMMERSIVE_HC_CACHE_MODE)
    Local $aResult = DllCall("UxTheme.dll", "bool", 106, "long", $iIMMERSIVE_HC_CACHE_MODE)
    If @error Then Return SetError(1, 0, False)
    Return ($aResult[0] <> 0)
EndFunc   ;==>_WinAPI_GetIsImmersiveColorUsingHighContrast

Func _WinAPI_OpenNcThemeData($hWND, $tClassList)
    Local $aResult = DllCall("UxTheme.dll", "hwnd", 49, "hwnd", $hWND, "struct*", $tClassList)
    If @error Then Return SetError(1, 0, False)
    Return $aResult[0]
EndFunc   ;==>_WinAPI_OpenNcThemeData

Func _WinAPI_ShouldSystemUseDarkMode()
    Local $aResult = DllCall("UxTheme.dll", "bool", 138)
    If @error Then Return SetError(1, 0, False)
    Return ($aResult[0] <> 0)
EndFunc   ;==>_WinAPI_ShouldSystemUseDarkMode

Func _WinAPI_IsDarkModeAllowedForApp()
    Local $aResult = DllCall("UxTheme.dll", "bool", 139)
    If @error Then Return SetError(1, 0, False)
    Return ($aResult[0] <> 0)
EndFunc   ;==>_WinAPI_IsDarkModeAllowedForApp

Func _WinAPI_AllowDarkModeForApp($bAllow = True) ;Windows 10 Build 17763
    Return _WinAPI_SetPreferredAppMode($bAllow ? 1 : 0) ; 1 = AllowDark, 0 = Default
EndFunc   ;==>_WinAPI_AllowDarkModeForApp

Func _WinAPI_SetPreferredAppMode($iPreferredAppMode) ;Windows 10 Build 18362+
    Local $aResult = DllCall("UxTheme.dll", "long", 135, "long", $iPreferredAppMode)
    If @error Then Return SetError(1, 0, False)
    Return $aResult[0]
EndFunc   ;==>_WinAPI_SetPreferredAppMode
#EndRegion DarkMode API

 

Signature beginning:
Please remember: "AutoIt"..... *  Wondering who uses AutoIt and what it can be used for ? * Forum Rules *
ADO.au3 UDF * POP3.au3 UDF * XML.au3 UDF * IE on Windows 11 * How to ask ChatGPT for AutoIt Codefor other useful stuff click the following button:

Spoiler

Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind. 

My contribution (my own projects): * Debenu Quick PDF Library - UDF * Debenu PDF Viewer SDK - UDF * Acrobat Reader - ActiveX Viewer * UDF for PDFCreator v1.x.x * XZip - UDF * AppCompatFlags UDF * CrowdinAPI UDF * _WinMergeCompare2Files() * _JavaExceptionAdd() * _IsBeta() * Writing DPI Awareness App - workaround * _AutoIt_RequiredVersion() * Chilkatsoft.au3 UDF * TeamViewer.au3 UDF * JavaManagement UDF * VIES over SOAP * WinSCP UDF * GHAPI UDF - modest begining - comunication with GitHub REST APIErrorLog.au3 UDF - A logging Library * Include Dependency Tree (Tool for analyzing script relations) * Show_Macro_Values.au3 *

 

My contribution to others projects or UDF based on  others projects: * _sql.au3 UDF  * POP3.au3 UDF *  RTF Printer - UDF * XML.au3 UDF * ADO.au3 UDF SMTP Mailer UDF * Dual Monitor resolution detection * * 2GUI on Dual Monitor System * _SciLexer.au3 UDF * SciTE - Lexer for console pane

Useful links: * Forum Rules * Forum etiquette *  Forum Information and FAQs * How to post code on the forum * AutoIt Online Documentation * AutoIt Online Beta Documentation * SciTE4AutoIt3 getting started * Convert text blocks to AutoIt code * Games made in Autoit * Programming related sites * Polish AutoIt Tutorial * DllCall Code Generator * 

Wiki: Expand your knowledge - AutoIt Wiki * Collection of User Defined Functions * How to use HelpFile * Good coding practices in AutoIt * 

OpenOffice/LibreOffice/XLS Related: WriterDemo.au3 * XLS/MDB from scratch with ADOX

IE Related:  * How to use IE.au3  UDF with  AutoIt v3.3.14.x * Why isn't Autoit able to click a Javascript Dialog? * Clicking javascript button with no ID * IE document >> save as MHT file * IETab Switcher (by LarsJ ) * HTML Entities * _IEquerySelectorAll() (by uncommon) * IE in TaskSchedulerIE Embedded Control Versioning (use IE9+ and HTML5 in a GUI) * PDF Related:How to get reference to PDF object embeded in IE * IE on Windows 11

I encourage you to read: * Global Vars * Best Coding Practices * Please explain code used in Help file for several File functions * OOP-like approach in AutoIt * UDF-Spec Questions *  EXAMPLE: How To Catch ConsoleWrite() output to a file or to CMD *

I also encourage you to check awesome @trancexx code:  * Create COM objects from modules without any demand on user to register anything. * Another COM object registering stuffOnHungApp handlerAvoid "AutoIt Error" message box in unknown errors  * HTML editor

winhttp.au3 related : * https://www.autoitscript.com/forum/topic/206771-winhttpau3-download-problem-youre-speaking-plain-http-to-an-ssl-enabled-server-port/

"Homo sum; humani nil a me alienum puto" - Publius Terentius Afer
"Program are meant to be read by humans and only incidentally for computers and execute" - Donald Knuth, "The Art of Computer Programming"
:naughty:  :ranting:, be  :) and       \\//_.

Anticipating Errors :  "Any program that accepts data from a user must include code to validate that data before sending it to the data store. You cannot rely on the data store, ...., or even your programming language to notify you of problems. You must check every byte entered by your users, making sure that data is the correct type for its field and that required fields are not empty."

Signature last update: 2023-04-24

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...