ModernMenuRaw.au3 macht Buttons unsichtbar

  • Hallo zusammen,

    ich möchte in eine Script die Button-Farbe anpassen. Sobald diese Funktion jedoch ausgeführt wird, sind die Button unsichtbar. Ich habe das Problem nun auf die ModernMenuRaw.au3 eingeschränkt und ein bsp-script erstellt, leider aber kein plan, wo der Fehler jetzt genauer liegt. Kann mir jmd helfen?

    [autoit]

    #include "O:\DropBox\AutoIT\Includes\ModernMenuRaw.au3"

    [/autoit][autoit][/autoit][autoit]

    Opt("GUIOnEventMode", 1)

    [/autoit][autoit][/autoit][autoit]

    ;~ If Not IsDeclared("GWL_EXSTYLE") Then Global Const $GWL_EXSTYLE = -20

    $WinWidth = 200

    [/autoit][autoit][/autoit][autoit]

    $SettingGUI = GUICreate("", $WinWidth, 176, @DesktopWidth / 2, 25, BitOR($WS_BORDER,$WS_POPUP,$WS_VISIBLE,$DS_SETFOREGROUND,$WS_SYSMENU), BitOR($WS_EX_OVERLAPPEDWINDOW,$WS_EX_TOPMOST,$WS_EX_TOOLWINDOW))
    WinSetOnTop($SettingGUI, "", 1)
    WinSetTrans($SettingGUI, "", 200)
    GUISetFont(7, 350, Default, "Comic Sans MS", $SettingGUI)
    GUISetState(@SW_SHOW, $SettingGUI)

    [/autoit][autoit][/autoit][autoit]

    GUICtrlCreateButton("push", 0, 0, $WinWidth, 17)
    GUICtrlSetOnEvent(-1, "Check")
    $TransButton = GUICtrlCreateButton("1", 0, 17, $WinWidth, 17)
    $OnTopButton = GUICtrlCreateButton("2", 0, 34, $WinWidth, 17)
    $VisibleButton = GUICtrlCreateButton("3", 0, 51, $WinWidth, 17)

    $WinHandle = WinGetHandle($SettingGUI)

    While 1
    Sleep(100)
    WEnd

    [/autoit][autoit][/autoit][autoit]

    Func Check()
    GUICtrlSetDefColor(0xFF0000)
    GUICtrlSetColor($VisibleButton, 0x787878)
    GUICtrlSetColor($OnTopButton, 0x787878)
    EndFunc

    [/autoit]
  • Hi Moins!

    Es ligt nicht an ModernMenuRaw.au3.

    "Happy in Moscow" hat eine schöne Funktion geschrieben für diese Situation.

    Spoiler anzeigen
    [autoit]

    #Include <GUIButton.au3>
    #Include <GUIImageList.au3>
    #Include <WinAPI.au3>
    #Include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate('MyGUI', 200, 200)
    GUICtrlCreateButton('', 65, 170, 70, 23)
    _GUICtrlButton_SetTextColor(-1, 'OK', 0xff0000)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    Do
    Until GUIGetMsg() = -3

    [/autoit] [autoit][/autoit] [autoit]

    Func _GUICtrlButton_SetTextColor($iCtrlID, $sText, $iTextColor);Author(s)........: Happy in Moscow

    [/autoit] [autoit][/autoit] [autoit]

    Local $hWnd, $hTheme, $hImageList, $hBitmap, $hBack, $hDC, $hMemDC, $hSrcDC, $tRect, $pRect, $Width, $Height, $Prev, $Flags = BitOR($DT_CENTER, $DT_SINGLELINE, $DT_VCENTER)

    [/autoit] [autoit][/autoit] [autoit]

    $hWnd = GUICtrlGetHandle($iCtrlID)
    If Not $hWnd Then
    Return 0
    EndIf
    $hTheme = DllCall('uxtheme.dll', 'ptr', 'OpenThemeData', 'hwnd', $hWnd, 'wstr', 'BUTTON')
    If (@error) Or (Not $hTheme[0]) Then
    GUICtrlSetColor($iCtrlID, $iTextColor)
    GUICtrlSetData($iCtrlID, $sText)
    Return 1
    EndIf
    $Width = _WinAPI_GetClientWidth($hWnd)
    $Height = _WinAPI_GetClientHeight($hWnd)
    $hImageList = _GUIImageList_Create($Width - 8, $Height - 8, 4, 4)
    $tRect = DllStructCreate('int[4]')
    DllStructSetData($tRect, 1, -4, 1)
    DllStructSetData($tRect, 1, -4, 2)
    DllStructSetData($tRect, 1, $Width - 4, 3)
    DllStructSetData($tRect, 1, $Height - 4, 4)
    $pRect = DllStructGetPtr($tRect)
    $hDC = _WinAPI_GetDC(0)
    $hMemDC = _WinAPI_CreateCompatibleDC($hDC)
    $hSrcDC = _WinAPI_CreateCompatibleDC($hDC)
    $hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $Width - 8, $Height - 8)
    $hBack = _WinAPI_CreateCompatibleBitmap($hDC, $Width - 8, $Height - 8)
    _WinAPI_ReleaseDC(0, $hDC)
    _WinAPI_SelectObject($hSrcDC, $hBack)
    _WinAPI_SelectObject($hMemDC, _SendMessage($hWnd, $WM_GETFONT))
    _WinAPI_SetTextColor($hMemDC, BitOR(BitAND($iTextColor, 0x00FF00), BitShift(BitAND($iTextColor, 0x0000FF), -16), BitShift(BitAND($iTextColor, 0xFF0000), 16)))
    _WinAPI_SetBkMode($hMemDC, $TRANSPARENT)
    ; PBS_NORMAL, PBS_HOT, PBS_PRESSED, PBS_DISABLED, PBS_DEFAULTED
    For $i = 1 To 5
    $Prev = _WinAPI_SelectObject($hMemDC, $hBitmap)
    DllCall('uxtheme.dll', 'int', 'DrawThemeBackground', 'ptr', $hTheme[0], 'hwnd', $hSrcDC, 'int', 1, 'int', $i, 'ptr', $pRect, 'ptr', 0)
    _WinAPI_BitBlt($hMemDC, 0, 0, $Width - 8, $Height - 8, $hSrcDC, 0, 0, $MERGECOPY)
    If $i = 4 Then
    DllCall('uxtheme.dll', 'int', 'DrawThemeText', 'ptr', $hTheme[0], 'hwnd', $hMemDC, 'int', 1, 'int', 4, 'wstr', $sText, 'int', -1, 'dword', $Flags, 'dword', 0, 'ptr', $pRECT)
    Else
    _WinAPI_DrawText($hMemDC, $sText, $tRect, $Flags)
    EndIf
    _WinAPI_SelectObject($hMemDC, $Prev)
    _GUIImageList_Add($hImageList, $hBitmap)
    Next
    ; PBS_HOT (Stylus Hot)
    _GUIImageList_SetImageCount($hImageList, 6)
    _GUIImageList_Copy($hImageList, 1, 5)
    _WinAPI_DeleteDC($hMemDC)
    _WinAPI_DeleteDC($hSrcDC)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteObject($hBack)
    DllCall('uxtheme.dll', 'int', 'CloseThemeData', 'ptr', $hTheme[0])
    $Prev = _GUICtrlButton_GetImageList($hWnd)
    If $Prev[0] Then
    _GUIImageList_Destroy($Prev[0])
    EndIf
    GUICtrlSetData($iCtrlID, '')
    If Not _GUICtrlButton_SetImageList($hWnd, $hImageList, 4) Then
    _GUIImageList_Destroy($hImageList)
    Return 0
    EndIf
    Return 1
    EndFunc ;==>_GUICtrlButton_SetTextColor

    [/autoit]


    Lg Kleiner

  • H!


    Bekommst du error´s bei den Constanten?
    Wenn ja solltest du sie in einer Includedatei auskommentieren.
    Den fehler kann ich denn noch nicht bestätigen.

    Lg kleiner

  • Hi,

    wenn Du GUICtrlSetColor benutzt, wird dem Stil der Schaltfläche das BS_OWNERDRAW-Flag hinzugefügt.
    Dies führt dazu, dass die WM_DRAWITEM-Nachricht an das Fenster gesendet wird, um diesem dadurch mitzuteilen, dass die Schaltfläche neu gezeichnet werden muss. Das Zeichnen erledigt AutoIt in diesem Falle. Allerdings nur im Standard-Design.
    Genau diese Nachricht wird aber von der ModernMenu UDF registriert, via GUIRegisterMsg, um die Menüelemente zu zeichnen. Die Menüelemente haben das MF_OWNERDRAW-Bit im Menüstil gesetzt, dadurch wird wieder die WM_DRAWITEM-Nachricht an das Fenster gesendet.

    Soweit so gut. Der Schalk steckt in der Funktion WM_DRAWITEM, denn diese gibt brav - wie in der MSDN angegeben - TRUE zurück, um zu signalisieren, dass das Zeichnen des Steuerelements erfolgreich beendet wurde.

    Dies führt in AutoIt aber wiederum dazu, dass WM_DRAWITEM nicht weiter bearbeitet wird, nämlich für die Schaltfläche die AutoIt noch zu zeichnen hat.

    Kurzum, Du musst in der ModernMenu.au3 der Funktion WM_DRAWITEM den Rückgabewert $GUI_RUNDEFMSG verpassen, das war es auch schon. ;)


    Gruß
    Greenhorn


  • Wenn Du die Schaltflächen mit individueller Schriftfarbe, aber dennoch im aktuellen Design nutzen möchtest, dann kannst Du Dir vielleicht aus meinem Beispielskript etwas basteln ...
    Hmm, müsste ich irgendwann mal auf Vista/Win7 aktualisieren, wenn ich mich nicht irre ...

    EDIT:
    Übrigens habe ich eine Lösung für Dein Problem "Aktives" Fenster erhalten, bei Klick auf eigene GUI gefunden, falls es Dich noch interessiert ...


    Gruß
    Greenhorn


    Einmal editiert, zuletzt von Greenhorn (20. Juli 2011 um 19:38)