verschiedene OS verschiedene Positionen

  • Hallo,
    mein Problem ist es, dass Bilder bei mir je nach OS und Build an verschiedenen Positionen angezeigt werden :(

    Script:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <SendMessage.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>

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

    Global $hGUI

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

    _GDIPlus_Startup()

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

    $hGUI = GUICreate("hans", 450, 610, (@DesktopWidth / 2) - 400, -1, $WS_POPUP, $WS_EX_LAYERED); + $WS_EX_TOPMOST)
    $hGUI_child = GUICreate("", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP, $WS_EX_LAYERED + $WS_EX_MDICHILD, $hGUI)

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

    $hImage = _GDIPlus_ImageLoadFromFile("bg.png")
    SetBitmap($hGUI, $hImage, 0xFF)
    GUISetBkColor(0, $hGUI_child)
    GUIRegisterMsg($WM_LBUTTONDOWN, "_WM_LBUTTONDOWN")
    GUISetState(@SW_SHOW, $hGUI)
    GUISetState(@SW_SHOW, $hGUI_child)
    _WinAPI_SetLayeredWindowAttributes($hGUI_child, 0x00, 0xff)
    $hButton = _GUICtrlCreateImageButton($hGUI, "start.png", "start_hover.png", 750, 600)

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

    While 1
    _Funktion()
    WEnd

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

    Func _Funktion()
    $msg = GUIGetMsg()
    Switch $msg
    Case -3
    Exit
    EndSwitch

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

    EndFunc ;==>_Funktion

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

    Func SetBitmap($hGUI, $hImage, $iOpacity = 255)
    Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend
    $hScrDC = _WinAPI_GetDC(0)
    $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
    $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
    $tSize = DllStructCreate($tagSIZE)
    $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
    DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
    $tSource = DllStructCreate($tagPOINT)
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate($tagBLENDFUNCTION)
    $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", $iOpacity)
    DllStructSetData($tBlend, "Format", 1)
    _WinAPI_UpdateLayeredWindow($hGUI, $hGUI, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
    _WinAPI_ReleaseDC(0, $hScrDC)
    _WinAPI_SelectObject($hMemDC, $hOld)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteDC($hMemDC)
    EndFunc ;==>SetBitmap

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

    Func _WM_LBUTTONDOWN($hWnd, $iMsg, $wParam, $lParam)
    _SendMessage($hGUI, $WM_SYSCOMMAND, 0xF012, 0)
    EndFunc ;==>_WM_LBUTTONDOWN

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

    Func _GUICtrlCreateImageButton($gui_parent, $image, $image_hover, $left, $top)
    $hImage = _GDIPlus_ImageLoadFromFile($image)
    $hImageHover = _GDIPlus_ImageLoadFromFile($image_hover)
    $width = _GDIPlus_ImageGetWidth($hImage)
    $height = _GDIPlus_ImageGetHeight($hImage)
    $gui = GUICreate("Button_" & Random(1, 9999), $width, $height, $left, $top, $WS_POPUP, $WS_EX_LAYERED, $gui_parent)
    GUISetCursor(0, 1, $gui)
    $GUIActiveX = GUICtrlCreateLabel("", -1, -1, $width + 1, $height + 1)
    GUICtrlSetCursor(-1, 0)
    SetBitmap($gui, $hImage, 0xFF)
    GUISetState(@SW_SHOW, $gui)
    $handle = SetError(0, $gui, $gui);

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

    Return $handle
    EndFunc ;==>_GUICtrlCreateImageButton

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

    So, wie man unten bei den Bildern sieht, ist bei win 7 (erstes Bild) das Start Bild weiter unten als bei win 8 (zweites Bild).
    Beim Kumpel mit ner anderen win 7 Version ist das Start Bild noch weiter oben und links. Bei nem Kumpel mit win 8.1 ist das Start Bild unten und weiter rechts.

    Woran liegt das? Und wie kann ich das lösen, ausser es an jedes OS und an jedes Build anzupassen?

    • Offizieller Beitrag

    Ich wage mal einen Schuss ins blaue. Dein @Desktopwidth und @Desktophight in der Childgui ist daran schuld. Die Childgui ist einfach größer als der Parent, also wird das niemals richtig angezeiht.
    Der Fehler liegt weniger am Bs sondern an der Bildschirmauflösung. Die Childgui wird in der Hauptgui nur zum Teil angezeigt, weil sie wie gesagt viel größer ist.
    Deshalb auch die veränderte Position des ImageButtons der wird auf der ChildGui erstellt und hat je nach Auflösung eine andere Position.
    Kannst das ja mal testen, indem du dir die Bildschirmauflösung bei jedem der getesteten Systeme anzeigen läßt.

  • Der Gedanke ist nicht schlecht, aber es ist falsch :D
    Ich setze die Buttons ja auf die normale GUI und wenn ich aus @DesktopHeight & Weight auf 0 setze oder mit 2 multipliziere, dann ändert sich bei mir normal auch nichts.

    • Offizieller Beitrag

    Brücksichtigst du bei deiner Platzierung denn auch die Systemmetrik-Daten? (Taskbarposition, -maße; Titelleisten-, Randbreite).
    All das ist schon von PC zu PC unterschiedlich und erst recht zwischen verschiedenen OS. Ist übrigens eine verbreitete Unart zu glauben, der nutzbare Bildschirm beginnt bei 0,0. Ich z.B. habe meine Taskbar immer links oder oben, sodass 0,0 nie stimmt. Deshalb frage ich in Skripts, die ich weitergebe, auch immer diese Daten ab, um meine Fenster nicht unter die Taskbar zu quetschen. :D

  • Naja, auch wenn die Leiste oben ist ist 0,0 auch oben links oder nicht? :D
    Ich habe jetzt einfach die Position, die bei mir richtig ist, durch die Desktopbreite geteilt damit ich 0,... bekomme und das lasse ich dann mit @DesktopWidth multiplizieren. So müsste es doch jetzt theoretisch auf jedem Bildschirm gleich sein oder?

    Was mich wundert ist, wieso das hierbei verschiebt und bei normalen GUIs nicht.

    Ich kann es leider gerade auf keinem anderem Rechner testen da ich in der Schule bin X(

    • Offizieller Beitrag

    Der Gedanke ist nicht schlecht, aber es ist falsch :D
    Ich setze die Buttons ja auf die normale GUI und wenn ich aus @DesktopHeight & Weight auf 0 setze oder mit 2 multipliziere, dann ändert sich bei mir normal auch nichts.

    Du setzt den Button eben nicht auf die ParentGui. Die aktuelle Einfügeposition ist immer die zuletzt erstellte GUI.
    Wenn du nach GUISetState ein Conrol auf einer bestimmten GUI erstellen willst, musst du vorher mit GUISwitch auf diese GUI umschalten.
    In deinem Beispiel hast du als 2. die ChildGui erstellt und auch als 2. diese mit GUISetState aktiviert, so ist der Einfügefokus auf der Child.

  • Hö :o

    [autoit]

    $hButton = _GUICtrlCreateImageButton($hGUI, "start.png", "start_hover.png", 750, 600)

    [/autoit]


    Ich setze die den Button auf $hGUI.

    [autoit]

    $hGUI = GUICreate("hans", 450, 610, (@DesktopWidth / 2) - 400, -1, $WS_POPUP, $WS_EX_LAYERED); + $WS_EX_TOPMOST)
    $hGUI_child = GUICreate("", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP, $WS_EX_LAYERED + $WS_EX_MDICHILD, $hGUI)

    [/autoit]


    Hier sieht man, dass $hGUI die Parent GUI ist.

    Ich habe aber gerade bemerkt, dass ich $hGUI_child gar nicht brauche. und wenn ich bei $hGUI aus @DesktopWidth einfach -1 mache, dann habe ich keine ändernde Größe mehr drinnen und es müsste theoretisch in jeder Auflösung gleich bleiben. Ist es leider aber nicht :(

    Einmal editiert, zuletzt von Freaky (16. März 2015 um 23:18)

  • Ich habe jetzt mehrere Buttons bzw. Bilder eingefügt und festgestellt, dass ich jeden Button 1x richtig positionieren muss, die Koordinaten + Auflösung merken und es an 1-2 weiteren Auflösungen das selbe machen muss (der Button muss 1 zu 1 auf der selben Position stehen in jeder Auflösung). Dann in den Taschenrechner eingeben und durch lineare regression eine Funktion darstellen lassen.
    So wie AutoIt es wollte, darf man diese Schritte für x, y und jeden einzelnen Button machen, da die Funktion leider immer nur für ein einzigen Punkt funktioniert *kotz*.

    Kennt jemand eine etwas leichtere Variante?
    Ich meine, ich werde diese Art von GUI vermutlich des öfteren in verschiedenen Projekten verwenden und/oder auch mal die Buttons verschieben oder neue hinzufügen und da ist es extrem nervig wenn man z.B. 170 + @DesktopWidth * 0.147569444444444 für x und -126 + @DesktopHeight * 0.502314814814815 für y stehen hat :(

    • Offizieller Beitrag

    da ist es extrem nervig wenn man z.B. 170 + @DesktopWidth * 0.147569444444444 für x und -126 + @DesktopHeight * 0.502314814814815 für y stehen hat


    Das kannst du doch schön covern:

    [autoit]


    Func _xRegressed($x)
    Return $x + @DesktopWidth * 0.147569444444444
    EndFunc

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

    Func _yRegressed($y)
    Return $y + @DesktopHeight * 0.502314814814815
    EndFunc

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

    Global $xR = _xRegressed
    Global $yR = _yRegressed

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

    ;....
    GUICtrlCreateButton('bla', $xR(170), $yR(-126))
    ;....

    [/autoit]


    Natürlich kannst du auch die Funktionsnamen direkt kurz und bündig fassen (z.B. _xR und _yR). Ist dann Geschmackssache. Ich finde es von der Optik ansprechender, wenn die Funktion über eine Variable aufgerufen wird und der zugeordnete Funktionsname schon eindeutig sagt, worum es geht (was bei '_xR' nicht unbedingt zutrifft).

  • Ich glaube du hast mich dabei leider falsch verstanden :(
    Klar, ich weiß, dass ich einfach ne Funktion draus machen kann. Ich müsste dann aber für jeden einzelnen Button eine neue Funktion aufstellen, weil aus was für einem Grund auch immer braucht man für genau einen bestimmten Punkt eine bestimmte Funktion.
    Und bei 170 + @DesktopWidth * 0.147569444444444 ist der X wert nicht 170 sondern 0.1475... Daher ist es ja auch nicht so einfach die Koordinaten zu ändern.

    Das ganze wäre aber ein nerviger drumrum weg der extrem hässlich ist und einen davon eher abrät so zu arbeiten. Daher frage ich ja hier nach Hilfe ob jemand eine Lösung für das ganze Problem hat?

    • Offizieller Beitrag

    Ich glaube du hast mich dabei leider falsch verstanden


    Wohl nicht nur falsch, sondern eher gar nicht. :rolleyes:

    Ich versuche mal zusammen zu fassen, wie ich das sehe:
    - Darstellung auf einem Desktop erfolgt über Positionierung mit Pixeln (von links, von oben)
    - es ist absolut scheißegal, welches OS du verwendest: 10,10 ist immer 10,10
    - es ist aber absolut nicht egal, welche Hardware du verwendest: Das Verhältnis von Pixelhöhe/Pixelbreite ist abweichend
    - somit wird auf unterschiedlicher Hardware immer ein unterschiedlicher optischer Eindruck entstehen

    Führe dein Programm auf einem PC mit VM aus und dort in verschiedenen OS - es wird immer gleich sein.