Gui Hiintergrundbild Problem (Button)

  • Morgen zusammen
    Folgendes Problem hat sich aufgetan:
    Ich habe eine Gui mit Hintergrundbild erstellt und füge nun einen Button ein. Der Button ist nun an Stelle XY und wenn man das Programm startet sieht man den Button auch nicht sondern nur Stelle XY. Soweit so gut doch wenn ich nun auf stelle XY mit der Maus gehe erscheint der button über der Stelle XY welche man nun nicht mehr sehen kann.

    Meine Frage nun:
    Ist es möglich dass, das Hintergrundbild immer im Vorderund bleibt sodass man auf Stelle XY klickt und der Button trotzdem aktiviert wird? (wäre mir am liebsten)
    Falls nicht ist es denn möglich das der Button immer im Vordergrund ist und nicht erst sobald man einmal mit der Maus über das Feld gefahren ist?

    P.S
    Muss nun zur Arbeit und werde erst gegen 15:00 - 16:00 antworten können.

    Danke

    MfG ScarfacePH

    Einmal editiert, zuletzt von ScarfacePH (20. Juni 2010 um 19:37)

  • Zitat

    Falls nicht ist es denn möglich das der Button immer im Vordergrund ist und nicht erst sobald man einmal mit der Maus über das Feld gefahren ist?


    hast du erst den button gemacht und nachher das pic oda umgekehrt

    Zitat

    Ist es möglich dass, das Hintergrundbild immer im Vorderund bleibt sodass man auf Stelle XY klickt und der Button trotzdem aktiviert wird? (wäre mir am liebsten)


    mach n unsichtbares label und nimm das als button her
    mehr fällt mir um die uhrzeit nich ein :D

    • Offizieller Beitrag

    Wenn du keinen tatsächlichen Button benötigst, mal dir einfach einen Rahmen auf das Hintergrundbild, damit der User weiß, wo er klicken muß:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #include <Winapi.au3>
    #include <Constants.au3>
    #include <FrameConstants.au3>
    #include <FontConstants.au3>

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

    Global $guiMain, $hDC, $hBrush, $tRECT

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

    Local $iBar = _WinAPI_GetSystemMetrics(4)
    Local $iBorder = _WinAPI_GetSystemMetrics(6)
    Local $hFont, $hOldFont

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

    ; Werte 'Pseudo-Button' (left,top,right,bottom)
    Global $sButton = 'Pseudo-Button' ; Button-Text
    Local $iFontSize = 16 ; Schriftgröße
    Local $iFontWidth = 400 ; 400 = normal, 600 = fett
    Local $bItalic = False ; kursiv
    Local $bUnderline = False ; unterstrichen
    Local $bStrikeout = False ; durchgestrichen
    Local $sFont = 'Comic Sans MS'
    Local $ctrl_L = 74
    Local $ctrl_T = 130
    Local $ctrl_R = $ctrl_L + 100 ; Left +Breite
    Local $ctrl_B = $ctrl_T + 20 ; Top +Höhe
    $tRECT = DllStructCreate('int;int;int;int;')
    DllCall("user32", 'long', 'SetRect', 'ptr', DllStructGetPtr($tRECT), 'long', $ctrl_L, 'long', $ctrl_T, 'long', $ctrl_R, 'long', $ctrl_B)

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

    Local $imgW = 248, $imgH = 281
    Local $mPos, $old

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

    $guiMain = GUICreate('Test', $imgW, $imgH, -1, -1)
    GUICtrlCreatePic(@SystemDir & '\oobe\images\wpakey.jpg', $iBorder, $iBorder, $imgW, $imgH)
    GUICtrlSetState(-1, $GUI_DISABLE)

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

    ; === Zeichenfläche / Font / Farben
    $hDC = _WinAPI_GetDC($guiMain)
    $hBrush = _WinAPI_CreateSolidBrush(0xFF0000)
    $hFont = _WinAPI_CreateFont($iFontSize, 0, 0, 0, $iFontWidth, $bItalic, $bUnderline, $bStrikeout, $DEFAULT_CHARSET, _
    $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, $sFont)
    _WinAPI_SetTextColor($hDC, 0xFF0000)
    _WinAPI_SetBkColor($hDC, 0x000000)
    _WinAPI_SelectObject($hDC, $hFont)
    _WinAPI_SetBkMode($hDC, $TRANSPARENT)

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

    GUISetState(@SW_SHOW, $guiMain)
    GUIRegisterMsg($WM_MOVE, '_WM_MOVE')

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

    _Draw()

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

    While True
    Switch GUIGetMsg ()
    Case $GUI_EVENT_PRIMARYDOWN
    $old = Opt('MouseCoordMode', 0)
    $mPos = MouseGetPos()
    Opt('MouseCoordMode', $old)
    $mPos[1] -= $iBar + 2*$iBorder ; !! Maus hat 0 bei Fensterrand - RECT unterhalb Titelleiste !!
    $ret = DllCall("user32.dll", "bool", "PtInRect", "ptr", DllStructGetPtr($tRECT), "long", $mPos[0], "long", $mPos[1])
    If $ret[0] > 0 Then
    ; innerhalb Rectangle geklickt
    MsgBox(0, '', 'Klick')
    EndIf
    Case $GUI_EVENT_RESTORE, $GUI_EVENT_MAXIMIZE
    _Draw()
    Case -3
    Exit
    EndSwitch
    WEnd
    _WinAPI_DeleteObject($hBrush)
    _WinAPI_ReleaseDC($guiMain, $hDC)
    _WinAPI_SelectObject($hDC, $hOldFont)
    _WinAPI_DeleteObject($hFont)
    _WinAPI_ReleaseDC(0, $hDC)
    _WinAPI_InvalidateRect(0, 0)

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

    Func _WM_MOVE()
    _Draw()
    EndFunc

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

    Func _Draw()
    _WinAPI_FrameRect($hDC, DllStructGetPtr($tRECT), $hBrush)
    _WinAPI_DrawText($hDC, $sButton, $tRECT, BitOR($DT_SINGLELINE,$DT_CENTER,$DT_VCENTER))
    EndFunc

    [/autoit]

    Edit:
    Hab mal noch Beschriftung des "Button" hinzugefügt.

  • Also ich würds so machen:

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <ButtonConstants.au3>
    #include <GuiConstantsEx.au3>
    #include <WINAPI.au3>

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

    ; Get the Image
    $sURL = "http://www.autoitscript.com/autoit3/files/graphics/autoit9_wall_grey_800x600.jpg"
    $sFilePath = @ScriptDir & "\AutoIt.jpg"
    InetGet($sURL, $sFilePath)

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

    ;MainGui mit BackPic
    $MainGui = GUICreate("GUI Background Image", 800, 600)
    $BackPic = GUICtrlCreatePic($sFilePath, 0, 0, 800, 600)
    GUICtrlSetState(-1, $GUI_DISABLE)
    ;$Button2 = GUICtrlCreateButton("Button2", 350, 260, 100, 23) <== Der Button hätte einen Rand, deswegen Buttons auf der $CONTROLGUI erstellen
    $Label1 = GUICtrlCreateLabel("", 325, 323, 100, 23);~,$WS_BORDER)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT )
    GUISetState()

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

    ;Transparent ConrolGui
    $aWinPos = WinGetPos($MainGui)
    $ControlGui = GUICreate("Control Gui", $aWinPos[2], $aWinPos[3], 0, 0, $WS_POPUP, $WS_EX_MDICHILD + $WS_EX_LAYERED, $MainGui)
    GUISetBkColor(0xFFFFFF)
    _WinAPI_SetLayeredWindowAttributes($ControlGui, 0xFFFFFF, 255)
    $Button1 = GUICtrlCreateButton("$CONTROLGUI - Button1", 325, 300, 150, 23)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg(1)
    Switch $nMsg[0]

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

    Case $Button1
    MsgBox(0, "", "Button1 on $CONTROLGUI Clicked")
    Case $Label1
    MsgBox(0, "", "Transparent Label on $MainGui Clicked")
    Case $GUI_EVENT_CLOSE
    Exit

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

    EndSwitch
    WEnd

    [/autoit]

    Entweder wie yxyx meinte mit transparenten Labels.

    Oder mit transparenter ControlGui. Dann könnte man die Buttons auch ein und ausblenden.

    PS. Das transparente Label befindet sich direkt unterhalb des Button. Und beim Erstellen würd ich erstmal $WS_BORDER verwenden, kannst Du am Ende ja dann entfernen.

  • Sorry das ich mich erst so spät wieder melde
    Ich bedanke mich für die hilfreichen Antworten. Ich weiß zwar noch nicht welche Lösung ich verwende aber ich tendiere zur Lösung von Bugfix da dieser Rahmen im Hintergrund bereits vorhanden ist und ich das genau so haben wollte. Dennoch schau ich mir alles an und entscheide mich erst dann endgültig.
    Danke an alle

    MfG
    ScarfacePH