1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Oscar

Beiträge von Oscar

  • [Nim] Fragen zu einem Frame (Window)

    • Oscar
    • 26. April 2020 um 16:38

    Mein Testprogramm sieht jetzt so aus:

    Code
    import wNim
    
    const sTitle = "My Gui-Window"
    
    let app = App()
    let frame = Frame(title=sTitle, size=(640, 480))
    
    frame.icon = Icon(r"prog.ico")
    
    frame.dpiAutoScale:
      frame.minSize = (480, 320)
      frame.maxSize = (1024, 768)
    
    let menuBar = MenuBar(frame)
    let statusBar = StatusBar(frame)
    
    let menu = Menu(menuBar, "&File")
    menu.append(wIdExit, "E&xit\tAlt-F4", "Close window and exit program.")
    
    let accel = AcceleratorTable(frame)
    accel.add(wAccelAlt, wKey_F4, wIdExit)
    
    let panel = Panel(frame)
    
    const myJpg = staticRead(r"test.jpg")
    let myImage = Image(myJpg).scale(640, 480)
    let staticbitmap = StaticBitmap(panel, bitmap=Bitmap(myImage))
    
    
    let staticText = StaticText(panel, label="Hello, World!")
    staticText.font = Font(14, family=wFontFamilySwiss, weight=wFontWeightBold)
    staticText.cursor = wHandCursor
    staticText.fit()
    
    let button = Button(panel, label="Font", pos=(0, 80))
    
    let button2 = Button(panel, label="Test", pos=(0, 10))
    
    
    proc layout() =
      panel.autolayout """
        HV:|-[staticbitmap]-|
        H:|-[staticText]->[button]-|
        H:|-[staticText]->[button2]-|
      """
    
    staticText.wEvent_CommandLeftClick do ():
      let textEntryDialog = TextEntryDialog(frame, value=staticText.label,
        caption="Change The Text")
    
      if textEntryDialog.showModal() == wIdOk:
        staticText.label = textEntryDialog.value
        staticText.fit()
        staticText.refresh()
    
    button.wEvent_Button do ():
      let fontDialog = FontDialog(frame, staticText.font)
      fontDialog.color = staticText.foregroundColor
      fontDialog.enableSymbols(false)
      fontDialog.range = 0..72
    
      if fontDialog.showModal() == wIdOk:
        staticText.font = fontDialog.chosenFont
        staticText.foregroundColor = fontDialog.color
        staticText.fit()
        staticText.refresh()
    
    frame.wIdExit do ():
      frame.close()
    
    frame.wEvent_Close do (event: wEvent):
      statusBar.setStatusText("Das Programm wirklich beenden?")
      let dlg = MessageDialog(frame, "Das Programm wirklich beenden?",
        sTitle, wYesNo or wIconQuestion)
    
      if dlg.showModal() != wIdYes:
        event.veto()
      
    panel.wEvent_Size do ():
      layout()
    
    layout()
    frame.center()
    frame.show()
    app.mainLoop()
    Alles anzeigen

    Wie kann ich den Style der Gui-Elemente beeinflussen?

    Ich hätte gern, dass die Schrift transparent auf dem Hintergrundbild ist.

    Und das Hintergrundbild verhindert das betätigen der Buttons. Also muss wohl irgendwie der Klick auf das Bild deaktiviert werden (wie in AutoIt). Aber wie?

  • [Nim] Fragen zu einem Frame (Window)

    • Oscar
    • 26. April 2020 um 11:36

    Ah ja, genau so ein kurzes Beispiel habe ich gesucht. Danke!

    Ich hab's bei mir jetzt mal so eingefügt:

    Code
    const myJpg = staticRead(r"test.jpg")
    let myImage = Image(myJpg).scale(600, 480)
    let staticbitmap = StaticBitmap(panel, bitmap=Bitmap(myImage))

    Also Bild laden, auf 600x480 skalieren und im StaticBitmap anzeigen.

    Das meinte ich oben, mit kleinen Programmen, die sehr hilfreich sind.

  • [Nim] Fragen zu einem Frame (Window)

    • Oscar
    • 26. April 2020 um 10:30

    BugFix : Danke, für die Erklärungen! Vor allem für den Link zum Layout-Online-Editor. So kann man wenigstens die Einstellungen testen, ohne jedes Mal compilieren zu müssen.

    Bitnugger: Auch Dir ein Dankeschön! Die Referenz kannte ich zwar schon, aber da fehlt mir dann oft ein Beispielcode.

    Zum Beispiel, würde es mich interessieren, wie ich ein Bild (JPG) laden und auf einem Panel anzeigen lassen kann. Am besten noch so, dass es automatisch an die Größe angepasst wird.

    Oder überhaupt irgendwelche kleine Programme, die etwas (mehr oder weniger) Sinnvolles tun. Einfach nur, um mal zu sehen, wie man sowas mit Nim umsetzt.

    Das hat mir beim lernen von AutoIt sehr geholfen, dass in der Hilfe viele Beispiel-Scripte enthalten sind. So kann man sich durch rumexperimentieren vorantasten.

  • [Nim] Fragen zu einem Frame (Window)

    • Oscar
    • 26. April 2020 um 08:29

    Ich habe mir mal aus mehreren Beispielcodes ein Programm erstellt. Nichts nützliches, nur etwas zu experimentieren.

    Hier erstmal der Code:

    Code
    import wNim
    
    const sTitle = "My Gui-Window"
    
    let app = App()
    let frame = Frame(title=sTitle, size=(600, 480))
    
    frame.icon = Icon(r".\prog.ico")
    
    frame.dpiAutoScale:
      frame.minSize = (480, 200)
      frame.maxSize = (800, 600)
    
    let menuBar = MenuBar(frame)
    let statusBar = StatusBar(frame)
    
    let menu = Menu(menuBar, "&File")
    menu.append(wIdExit, "E&xit\tAlt-F4", "Close window and exit program.")
    
    let accel = AcceleratorTable(frame)
    accel.add(wAccelAlt, wKey_F4, wIdExit)
    
    let panel = Panel(frame)
    
    let staticText = StaticText(panel, label="Hello, World!")
    staticText.font = Font(14, family=wFontFamilySwiss, weight=wFontWeightBold)
    staticText.cursor = wHandCursor
    staticText.fit()
    
    let button = Button(panel, label="Font")
    
    proc layout() =
      panel.autolayout """
        HV:|-[staticText]->[button]-|
      """
    
    staticText.wEvent_CommandLeftClick do ():
      let textEntryDialog = TextEntryDialog(frame, value=staticText.label,
        caption="Change The Text")
    
      if textEntryDialog.showModal() == wIdOk:
        staticText.label = textEntryDialog.value
        staticText.fit()
        staticText.refresh()
    
    button.wEvent_Button do ():
      let fontDialog = FontDialog(frame, staticText.font)
      fontDialog.color = staticText.foregroundColor
      fontDialog.enableSymbols(false)
      fontDialog.range = 0..72
    
      if fontDialog.showModal() == wIdOk:
        staticText.font = fontDialog.chosenFont
        staticText.foregroundColor = fontDialog.color
        staticText.fit()
        staticText.refresh()
    
    frame.wIdExit do ():
      frame.close()
    
    frame.wEvent_Close do (event: wEvent):
      let dlg = MessageDialog(frame, "Das Programm wirklich beenden?",
        sTitle, wYesNo or wIconQuestion)
    
      if dlg.showModal() != wIdYes:
        event.veto()
      
    panel.wEvent_Size do ():
      layout()
    
    layout()
    frame.center()
    frame.show()
    app.mainLoop()
    Alles anzeigen

    Und hier die Fragen:- Was macht "app.mainloop()"? Ist das nur eine Endlosschleife, weil das Programm ja auf die Events reagiert? Also wie in AutoIt mit dem OnEventMode?

    - Wenn ich das richtig verstanden habe, dann muss man sich bei Nim nicht um die Freigabe der Ressourcen kümmern?

    - Ich erstelle einen Frame (Window). Wozu dann noch ein Panel?

    - Gibt es irgendwo eine Erklärung, wie das mit dem (Auto-)Layout funktioniert?

  • [Nim] Die Programmiersprache "Nim" bekommt ein deutsches Forum

    • Oscar
    • 26. April 2020 um 08:13

    Jetzt geht's los!

    Um Fragen zur Programmiersprache "Nim" stellen zu können, haben wir jetzt hier ein Unterforum bekommen. Vielen Dank, Gun-Food! :):thumbup:

  • Programmiersprache Nim

    • Oscar
    • 23. April 2020 um 13:36

    Ich habe jetzt mal "Part I" des Tutorials durchgearbeitet und muss sagen, dass Nim sehr viele gute Features bietet, die es so in AutoIt nicht gibt.

    Wobei ich mich an die umgekehrte Reihenfolge "[Variablenname] : [Typ]" erst gewöhnen muss. Das bin ich von "C++" andersrum gewohnt.

    Aber z.B. "Named arguments", "Sets", "Bit fields" oder For-Schleifen wie for i, value in @[3, 4, 5]: sind schon sehr interessant.

    Allerdings muss ich auch sagen, dass das eher eine Sprache ist, die man erst erlernen sollte, wenn man bereits andere Programmiersprachen beherrscht (IMHO).

    Für einen Einsteiger ist die Lernkurve dort viel zu steil. Vergleich: Nim = Steilwand-Bergsteigen und AutoIt = bequemer Wanderweg. :)

    Und das englische Forum ist ja ein Graus (endlos Seite mit Button am unteren Ende "Load more threads". <X

  • Programmiersprache Nim

    • Oscar
    • 22. April 2020 um 18:49

    Ich habe in Post#1 mal eine Umfrage erstellt.

  • Programmiersprache Nim

    • Oscar
    • 22. April 2020 um 12:44

    Um mal nicht AutoIt-Threads damit "zuzumüllen", mache ich mal hier einen Thread auf.

    Zitat von BugFix

    Das hast du falsch verstanden. Es gibt nichts, was du mit Nim nicht anstellen kannst. Es gibt einigeGUI-Bibliotheken. Ich empfehle wNim, weil man dann keine weiteren Bindungen berücksichtigen muss bei den m.M. nach umfangreichsten Controls.

    Ich habe jetzt mal Nim nach Deiner Anleitung installiert (Vielen Dank dafür) und auch "Visual Studio Code" als IDE eingerichtet. Das funktioniert auch alles.

    Jetzt habe ich noch wNim installiert und mal die Examples ausprobiert.

    Das ist wirklich sehr beeindruckend. Zum einen, was die Geschwindigkeit angeht und zum anderen, wie wenig Code man für solch komplexe (größenveränderliche) GUIs braucht.

    Und auch die Größe der compilierten Exedateien ist relativ klein.

    Die Syntax von Nim ist noch etwas gewöhnungsbedürftig, aber ansonsten könnte ich mich daran gewöhnen.

    Gibt es eigentlich ein deutsches Nim-Forum?

    Oder wie wäre es hier mit einem Unterforum (falls sich genügend Interessenten finden)?


    EDIT - Bugfix

    Für alle die auch mal probieren möchten, hänge ich die Installationsanleitung hier mit rein.

    Dateien

    manual.pdf 59,03 kB – 862 Downloads
  • Includes - Entsprechungen und Handhabung mit alten AutoIt Versionen

    • Oscar
    • 21. April 2020 um 19:01
    Zitat von BugFix

    Falls du mit Nim arbeiten möchtest, würde ich dir eine Installationsanleitung schicken für eine wenig umständliche, zukunftssichere Installation.

    Mir auch, bitte! :)

  • winclosearea() - suche eine Funktion, die dieser entspricht oder einen Workaround

    • Oscar
    • 17. April 2020 um 19:36

    Das XY-Problem ist eher eine Frage nach Ihrem Lösungsversuch als nach Ihrem tatsächlichen Problem.

    Dies führt zu einer enormen Verschwendung von Zeit und Energie, sowohl auf Seiten der um Hilfe bittenden Menschen als auch auf Seiten der Hilfeleistenden.

    * Benutzer will X machen.

    * Der Benutzer weiß nicht, wie man X macht, glaubt aber, dass er sich zu einer Lösung durchfummeln kann, wenn er es nur schafft, Y zu machen.

    * Der Benutzer weiß auch nicht, wie er Y machen soll.

    * Benutzer bittet um Hilfe bei Y.

    * Andere versuchen, dem Benutzer mit Y zu helfen, sind aber verwirrt, weil Y ein seltsames Problem zu sein scheint, das sie lösen wollen.

    * Nach viel Interaktion und verschwendeter Zeit wird schließlich klar, dass der Benutzer wirklich Hilfe mit X will und dass Y nicht einmal eine geeignete Lösung für X war.

    Das Problem tritt auf, wenn die Leute an dem festhängen, was ihrer Meinung nach die Lösung ist, und nicht in der Lage sind, zurückzutreten und das Problem vollständig zu erklären.

    Übersetzt von der Seite: "http://xyproblem.info/" mit http://www.DeepL.com/Translator (kostenlose Version)

  • winclosearea() - suche eine Funktion, die dieser entspricht oder einen Workaround

    • Oscar
    • 17. April 2020 um 18:30
    Zitat von svenjatzu

    Wozu ich einen Online Timer brauche?

    Weil der Teil von meinem Script ist?!

    Wieso wohnt deine mutter in China und nicht in Australien?

    Tut doch absolut nichts zur Fragestellung beitragen so ne aussage ausser, hey ich bin der obercode ich könnte dir helfen aber - sooooory ich bin zu überheblich dafür! schick mir erst deinen lebenslauf dann können wir schauen ob wir bei dieser einfachen frage weiterhelfen wollen...

    Ok, Du willst es nicht verstehen.

    Ich bin raus.

  • winclosearea() - suche eine Funktion, die dieser entspricht oder einen Workaround

    • Oscar
    • 17. April 2020 um 10:49
    Zitat von svenjatzu

    Hat wer eine Idee dazu?

    Beschreib doch erstmal, warum Du eine (bzw. vier) Onlinestoppuhr benötigst?

    Viel einfacher wäre es doch, das mit AutoIt zu machen.

    Das scheint mir doch sehr ein XY-Problem zu sein.

  • Font size ist irgendwie komisch

    • Oscar
    • 16. April 2020 um 17:09

    Ich habe die Funktion jetzt noch etwas verändert und sie auch umbenannt ("_GUICtrlSetText").

    Man sollte ein Pic-Control verwenden, weil das beim Label mit der Transparenz nicht klappt.

    Außerdem gebe ich jetzt ein Array zurück mit den neuen Abmessungen ([0] = Width und [1] = Height).

    Spoiler anzeigen
    AutoIt
    #include <AutoItConstants.au3>
    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <SendMessage.au3>
    #include <StaticConstants.au3>
    #include <WinAPIHObj.au3>
    #include <WinAPIInternals.au3>
    #include <WinAPISysInternals.au3>
    
    
    Global $sPicfile = StringRegExpReplace(@AutoItExe, '(.+\\).+', '$1') & 'Examples\Helpfile\Extras\Pattern.bmp'
    
    Example1()
    
    Func Example1()
        Local $iTop = 10, $aidPic[24], $aSize
        Local $hGui = GUICreate("My GUI", 500, 800)
        GUICtrlCreatePic($sPicfile, 0, 0, 500, 800) ; Hintergrundgrafik, zum demonstrieren der Transparenz
        ; Labels mit verschiedener Schriftgöße erstellen.
        For $i = 4 To 27
            $aidPic[$i - 4] = GUICtrlCreatePic('', 10, $iTop, 0, 0) ; Ein Pic-Control, weil mit einem Label die Transparenz nicht funktioniert
            $aSize = _GUICtrlSetText(-1, 'gp | Fontsize ' & $i, $i, 0, 'Courier New', 0xFF000000)
            If Not @error Then
                $iTop += $aSize[1] + 2 ; das Array "$aSize" enthaelt: [0] = Width und [1] = Height
            EndIf
        Next
        GUISetState(@SW_SHOW)
        MsgBox(0, 'Test', 'Einen Text ersetzen.')
        _GUICtrlSetText($aidPic[18], 'New Text: _öäü²', 22, 1, 'Courier New', 0xFFEEEE00, 0xFF000044)
        Do
        Until GUIGetMsg() = $GUI_EVENT_CLOSE
    EndFunc   ;==>Example1
    
    ;===============================================================================
    ; Name:             : _GUICtrlSetText
    ; Description:        : Funktion zum einfuegen von Text in ein Pic-Control.
    ;                      Das Pic-Control wird automatisch an die Textlaenge/-hoehe angepasst.
    ; Syntax:           : _GUICtrlSetText($idCtrl, $sString, $iSize, $iStyle, $sFontname[, $iColor][, $iBkColor])
    ; Parameter(s):        : $idCtrl = die Control-ID von GUICtrlCreatePic
    ;                      $sString = der Text, der eingefuegt werden soll
    ;                      $iSize = die Fontgroesse
    ;                      $iStyle = der Fontstyle (0 = Normal, 1 = Fett, 2 = Kursiv, 4 = Unterstrichen, 8 = Durchgestrichen)
    ;                      $sFontname = der Fontname
    ;                      $iColor = die Schriftfarbe (im ARGB-Format)
    ;                      $iBkColor = die Hintergrundfarbe (im ARGB-Format) Standard ist transparent.
    ; Return Value(s):    : Im Erfolgsfall wird ein Array zurueckgegeben mit den neuen Abmessungen ([0] = Width und [1] = Height)
    ; Author(s):        : Oscar (www.autoit.de)
    ; Version / Date:   : 1.0.0.0 / 16.04.2020
    Func _GUICtrlSetText($idCtrl, $sString, $iSize, $iStyle, $sFontname, $iColor = 0xFF000000, $iBkColor = Default)
        Local $hWnd, $hParent, $tRect, $hBitmap, $hGfxCtx, $hBrush, $hFormat, $hFamily, $hFont, $tLayout, $aInfo
        Local $hBMP, $hPrevImage
        _GDIPlus_Startup()
        If $idCtrl = Default Or $idCtrl <= 0 Then $idCtrl = _WinAPI_GetDlgCtrlID(GUICtrlGetHandle($idCtrl))
        If $iStyle = Default Or $iStyle <= 0 Then $iStyle = 0
        $hWnd = GUICtrlGetHandle($idCtrl)
        If Not IsHWnd($hWnd) Then Return SetError(1)
        $hParent = _WinAPI_GetParent($hWnd)
        $tRect = _WinAPI_GetClientRect($hParent)
        $hPrevImage = _SendMessage($hWnd, $STM_GETIMAGE)
        If $hPrevImage Then
            _WinAPI_DeleteObject($hPrevImage)
            _WinAPI_InvalidateRect($hParent, $tRect)
        EndIf
        Local $iW = $tRect.Right - $tRect.Left, $iH = $tRect.Bottom - $tRect.Top
    ;~     ConsoleWrite(StringFormat('Width x Height = %i x %i\r\n', $iW, $iH))
        $tLayout = _GDIPlus_RectFCreate(0, 0, $iW, $iH)
        $hBrush = _GDIPlus_BrushCreateSolid($iColor)
        $hFormat = _GDIPlus_StringFormatCreate()
        $hFamily = _GDIPlus_FontFamilyCreate($sFontname)
        $hFont = _GDIPlus_FontCreate($hFamily, $iSize, $iStyle)
        $hGfxCtx = _GDIPlus_GraphicsCreateFromHWND($hParent)
        $aInfo = _GDIPlus_GraphicsMeasureString($hGfxCtx, $sString, $hFont, $tLayout, $hFormat)
        _GDIPlus_GraphicsDispose($hGfxCtx)
        Local $aSize[2] = [Ceiling($aInfo[0].Width), Ceiling($aInfo[0].Height)]
    ;~     ConsoleWrite(StringFormat('Width x Height = %i x %i\r\n', $aSize[0], $aSize[1]))
        $hBitmap = _GDIPlus_BitmapCreateFromScan0($aSize[0], $aSize[1])
        $hGfxCtx = _GDIPlus_ImageGetGraphicsContext($hBitmap)
        If $iBkColor <> Default Then _GDIPlus_GraphicsClear($hGfxCtx, $iBkColor)
        _GDIPlus_GraphicsSetTextRenderingHint($hGfxCtx, 4)
        $tLayout = _GDIPlus_RectFCreate(0, 0, $aSize[0], $aSize[1])
        $aInfo = _GDIPlus_GraphicsMeasureString($hGfxCtx, $sString, $hFont, $tLayout, $hFormat)
        _GDIPlus_GraphicsDrawStringEx($hGfxCtx, $sString, $hFont, $aInfo[0], $hFormat, $hBrush)
        $hBMP = _GDIPlus_BitmapCreateDIBFromBitmap($hBitmap)
        _WinAPI_SetWindowPos($hWnd, $hParent, 0, 0, $aSize[0], $aSize[1], BitOR($SWP_FRAMECHANGED, $SWP_NOZORDER, $SWP_NOMOVE))
        _SendMessage($hWnd, $STM_SETIMAGE, $IMAGE_BITMAP, $hBMP)
        _GDIPlus_FontDispose($hFont)
        _GDIPlus_FontFamilyDispose($hFamily)
        _GDIPlus_StringFormatDispose($hFormat)
        _GDIPlus_BrushDispose($hBrush)
        _GDIPlus_GraphicsDispose($hGfxCtx)
        _GDIPlus_BitmapDispose($hBitmap)
        _GDIPlus_Shutdown()
        Return $aSize
    EndFunc   ;==>_GUICtrlSetText
    Alles anzeigen
  • Font size ist irgendwie komisch

    • Oscar
    • 16. April 2020 um 10:00
    Zitat von Professor Bernd

    Am Ende deines Code werden viele Sachen freigegeben. Wenn ich das in meinem Programm übernehme, muss ich dann am Ende des Programms noch etwas freigeben, oder ist schon alles freigegeben?

    Nee, ist alles schon wieder freigegeben. Wird nur temporär gebraucht.

    Die TABs musst Du natürlich selbst festlegen. Wenn z.B. ein TAB vier Leerzeichen entsprechen soll, dann musst Du die entsprechend ersetzen:

    AutoIt
     #include <AutoItConstants.au3>
    #include <GDIPlus.au3>
    #include <SendMessage.au3>
    #include <StaticConstants.au3>
    #include <WinAPIHObj.au3>
    #include <WinAPIInternals.au3>
    #include <WinAPISysInternals.au3>
    #include <GUIConstantsEx.au3> ; Für $GUI_EVENT_CLOSE.
    
    Example1()
    
    Func Example1()
        Local $hGui = GUICreate("My GUI", 400, 800)
        Local $iTop = 0
    
        ; Labels mit verschiedener Schriftgöße erstellen.
        For $i = 4 To 27
            $iTop += 15 + $i
            GUICtrlCreateLabel("fontsize " & $i, 10, $iTop, 0, 0, $SS_BITMAP) ; Wichtig! $SS_BITMAP als Style
            _GUICtrlSetFont(-1, "fontsize" & $i, $i, 0, "Courier New", 0xFF00007F)
            GUICtrlSetBkColor(-1, 0xCCCCFF)  ; <== Um zu erkennen, wenn sich die Größe des Labels ändert.
        Next
        GUISetState(@SW_SHOW)
    
    
        Local $idBtn_1 = GUICtrlCreateButton("Change Label 7 Text", 200, 130, 120)
        Local $sNewText = "    This is a        sample text to fill the label."
    
        While 1
            Switch GUIGetMsg()
    
                Case $idBtn_1
                    $sNewText = StringReplace($sNewText, @TAB, '    ') ; TABs in 4 Leerzeichen umwandeln
                    _GUICtrlSetFont(7, $sNewText, 8, 0, "Courier New", 0xFF00007F)
                    GUICtrlSetBkColor(7, 0xCCCCAA) ; <== Nur um zu sehen, ob das hier einen Einfluss hat.
    
                Case $GUI_EVENT_CLOSE
                    ExitLoop
            EndSwitch
        WEnd
    EndFunc   ;==>Example1
    
    
    Func _GUICtrlSetFont($idCtrl, $sString, $iSize, $iStyle, $sFontname, $iColor = 0xFF000000)
        Local $hWnd, $hBitmap, $hGfxCtx, $hBrush, $hFormat, $hFamily, $hFont, $tLayout, $aInfo
        Local $hBMP, $hPrevImage
        _GDIPlus_Startup()
        If $idCtrl = Default Or $idCtrl <= 0 Then $idCtrl = _WinAPI_GetDlgCtrlID(GUICtrlGetHandle($idCtrl))
        If $iStyle = Default Or $iStyle <= 0 Then $iStyle = 0
        $hWnd = GUICtrlGetHandle($idCtrl)
        If Not IsHWnd($hWnd) Then Return SetError(1)
        Local $iW = 1000, $iH = 100
        $hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH)
        $hGfxCtx = _GDIPlus_ImageGetGraphicsContext($hBitmap)
        _GDIPlus_GraphicsSetTextRenderingHint($hGfxCtx, 4)
        $hBrush = _GDIPlus_BrushCreateSolid($iColor)
        $hFormat = _GDIPlus_StringFormatCreate()
        $hFamily = _GDIPlus_FontFamilyCreate($sFontname)
        $hFont = _GDIPlus_FontCreate($hFamily, $iSize, $iStyle)
        $tLayout = _GDIPlus_RectFCreate(0, 0, $iW, $iH)
        $aInfo = _GDIPlus_GraphicsMeasureString($hGfxCtx, $sString, $hFont, $tLayout, $hFormat)
        _GDIPlus_GraphicsDispose($hGfxCtx)
        _GDIPlus_BitmapDispose($hBitmap)
        $iW = Ceiling($aInfo[0].Width)
        $iH = Ceiling($aInfo[0].Height)
    ;~     ConsoleWrite(StringFormat('Width x Height = %i x %i\r\n', $iW, $iH))
        $hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH)
        $hGfxCtx = _GDIPlus_ImageGetGraphicsContext($hBitmap)
        _GDIPlus_GraphicsSetTextRenderingHint($hGfxCtx, 4)
        $tLayout = _GDIPlus_RectFCreate(0, 0, $iW, $iH)
        $aInfo = _GDIPlus_GraphicsMeasureString($hGfxCtx, $sString, $hFont, $tLayout, $hFormat)
        _GDIPlus_GraphicsDrawStringEx($hGfxCtx, $sString, $hFont, $aInfo[0], $hFormat, $hBrush)
        $hBMP = _GDIPlus_BitmapCreateDIBFromBitmap($hBitmap)
        _WinAPI_SetWindowPos($hWnd, $HWND_NOTOPMOST, 0, 0, $iW, $iH, BitOR($SWP_FRAMECHANGED, $SWP_NOMOVE))
        $hPrevImage = _SendMessage($hWnd, $STM_SETIMAGE, $IMAGE_BITMAP, $hBMP)
        If $hPrevImage Then _WinAPI_DeleteObject($hPrevImage)
        _GDIPlus_FontDispose($hFont)
        _GDIPlus_FontFamilyDispose($hFamily)
        _GDIPlus_StringFormatDispose($hFormat)
        _GDIPlus_BrushDispose($hBrush)
        _GDIPlus_GraphicsDispose($hGfxCtx)
        _GDIPlus_BitmapDispose($hBitmap)
        _GDIPlus_Shutdown()
    EndFunc   ;==>_GUICtrlSetFont
    Alles anzeigen
  • Font size ist irgendwie komisch

    • Oscar
    • 15. April 2020 um 19:51
    Zitat von Professor Bernd

    Aber wo liegt der Fehler? Bzw. wie kann man Abhilfe schaffen?

    Den Fehler kann ich leider auch nicht erkennen.

    Aber eine Abhilfe könnte ich Dir anbieten:

    AutoIt
    #include <AutoItConstants.au3>
    #include <GDIPlus.au3>
    #include <SendMessage.au3>
    #include <StaticConstants.au3>
    #include <WinAPIHObj.au3>
    #include <WinAPIInternals.au3>
    #include <WinAPISysInternals.au3>
    
    Example1()
    
    Func Example1()
        Local $hGui = GUICreate("My GUI", 500, 800, 100)
        Local $iTop = 0
    
        ; Labels mit verschiedener Schriftgöße erstellen.
        For $i = 4 To 27
            $iTop += 15 + $i
            GUICtrlCreateLabel("fontsize " & $i, 10, $iTop, 0, 0, $SS_BITMAP) ; Wichtig! $SS_BITMAP als Style
            _GUICtrlSetFont(-1, $i, 0, "Courier New", 0xFF00007F)
        Next
        GUISetState(@SW_SHOW)
        Do
        Until GUIGetMsg() = -3
    EndFunc   ;==>Example
    
    Func _GUICtrlSetFont($idCtrl, $iSize, $iStyle, $sFontname, $iColor = 0xFF000000)
        Local $hWnd, $sString, $hBitmap, $hGfxCtx, $hBrush, $hFormat, $hFamily, $hFont, $tLayout, $aInfo
        Local $hBMP, $hPrevImage
        _GDIPlus_Startup()
        If $idCtrl = Default Or $idCtrl <= 0 Then $idCtrl = _WinAPI_GetDlgCtrlID(GUICtrlGetHandle($idCtrl))
        If $iStyle = Default Or $iStyle <= 0 Then $iStyle = 0
        $hWnd = GUICtrlGetHandle($idCtrl)
        If Not IsHWnd($hWnd) Then Return SetError(1)
        $sString = GUICtrlRead($idCtrl)
        Local $iW = 1000, $iH = 100
        $hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH)
        $hGfxCtx = _GDIPlus_ImageGetGraphicsContext($hBitmap)
        _GDIPlus_GraphicsSetTextRenderingHint($hGfxCtx, 4)
        $hBrush = _GDIPlus_BrushCreateSolid($iColor)
        $hFormat = _GDIPlus_StringFormatCreate()
        $hFamily = _GDIPlus_FontFamilyCreate($sFontname)
        $hFont = _GDIPlus_FontCreate($hFamily, $iSize, $iStyle)
        $tLayout = _GDIPlus_RectFCreate(0, 0, $iW, $iH)
        $aInfo = _GDIPlus_GraphicsMeasureString($hGfxCtx, $sString, $hFont, $tLayout, $hFormat)
        _GDIPlus_GraphicsDispose($hGfxCtx)
        _GDIPlus_BitmapDispose($hBitmap)
        $iW = Ceiling($aInfo[0].Width)
        $iH = Ceiling($aInfo[0].Height)
    ;~     ConsoleWrite(StringFormat('Width x Height = %i x %i\r\n', $iW, $iH))
        $hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH)
        $hGfxCtx = _GDIPlus_ImageGetGraphicsContext($hBitmap)
        _GDIPlus_GraphicsSetTextRenderingHint($hGfxCtx, 4)
        $tLayout = _GDIPlus_RectFCreate(0, 0, $iW, $iH)
        $aInfo = _GDIPlus_GraphicsMeasureString($hGfxCtx, $sString, $hFont, $tLayout, $hFormat)
        _GDIPlus_GraphicsDrawStringEx($hGfxCtx, $sString, $hFont, $aInfo[0], $hFormat, $hBrush)
        $hBMP = _GDIPlus_BitmapCreateDIBFromBitmap($hBitmap)
        _WinAPI_SetWindowPos($hWnd, $HWND_NOTOPMOST, 0, 0, $iW, $iH, BitOR($SWP_FRAMECHANGED, $SWP_NOMOVE))
        $hPrevImage = _SendMessage($hWnd, $STM_SETIMAGE, $IMAGE_BITMAP, $hBMP)
        If $hPrevImage Then _WinAPI_DeleteObject($hPrevImage)
        _GDIPlus_FontDispose($hFont)
        _GDIPlus_FontFamilyDispose($hFamily)
        _GDIPlus_StringFormatDispose($hFormat)
        _GDIPlus_BrushDispose($hBrush)
        _GDIPlus_GraphicsDispose($hGfxCtx)
        _GDIPlus_BitmapDispose($hBitmap)
        _GDIPlus_Shutdown()
    EndFunc
    Alles anzeigen
  • Font size ist irgendwie komisch

    • Oscar
    • 15. April 2020 um 17:41

    Nein, das denke ich auch nicht. "Courier New" ist eine TTF-Schriftart. Die wird vom Programm skaliert.

    Hier scheint AutoIt beim erstellen der Label die Schriftarten "falsch" zu skalieren.

    Wenn man GDI+ zum erstellen verwendet, dann stimmen die Werte:

    AutoIt
    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    
    Example1()
    Example2()
    
    Func Example1()
    
        ; GUI
        Local $hGui = GUICreate("My GUI", 500, 800, 100)
        ;   GUISetFont(10, Default, Default, "Courier New")
    
        Local $iTop = 0
    
        ; Labels mit verschiedener Schriftgöße erstellen.
        For $i = 4 To 27
            $iTop += 15 + $i
            GUICtrlCreateLabel("fontsize " & $i, 10, $iTop, 480, 15 + $i)
            GUICtrlSetFont(-1, $i, 0, 0, "Courier New")
        Next
    
        GUISetState(@SW_SHOW)
    EndFunc   ;==>Example
    
    Func Example2()
        Local $hGUI, $hGraphic, $hBrush, $hFormat, $hFamily, $hFont, $tLayout
        Local $sString, $aInfo, $iTop = 10
    
        ; Create GUI
        $hGUI = GUICreate("My GUI GDI+", 500, 800, 700)
        GUISetState(@SW_SHOW)
    
        ; Draw a string
        _GDIPlus_Startup()
        $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
        $hBrush = _GDIPlus_BrushCreateSolid(0xFF00007F)
        $hFormat = _GDIPlus_StringFormatCreate()
        $hFamily = _GDIPlus_FontFamilyCreate("Courier New")
        For $i = 4 To 27
            $iTop += 15 + $i
            $sString = "fontsize " & $i
            $hFont = _GDIPlus_FontCreate($hFamily, $i, 0)
            $tLayout = _GDIPlus_RectFCreate(10, $iTop, 0, 0)
            $aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, $sString, $hFont, $tLayout, $hFormat)
            _GDIPlus_GraphicsDrawStringEx($hGraphic, $sString, $hFont, $aInfo[0], $hFormat, $hBrush)
            _GDIPlus_FontDispose($hFont)
        Next
    
        ; Loop until the user exits.
        Do
        Until GUIGetMsg() = $GUI_EVENT_CLOSE
    
        ; Clean up resources
        _GDIPlus_FontFamilyDispose($hFamily)
        _GDIPlus_StringFormatDispose($hFormat)
        _GDIPlus_BrushDispose($hBrush)
        _GDIPlus_GraphicsDispose($hGraphic)
        _GDIPlus_Shutdown()
    EndFunc   ;==>Example
    Alles anzeigen
  • Statusbar small

    • Oscar
    • 7. April 2020 um 19:41

    Nicht schlecht! :thumbup:

    Aber es fehlt noch eine Funktion "SetFont" (mit Fontgröße und Schriftart). Das war bei mir immer der Grund warum ich die Status-UDF nicht benutzt habe, sondern etwas eigenes programmiert habe.

    Die 9er Schrift ist mir zu klein, da wäre es besser, wenn das änderbar ist.

  • MsgBox verlangsamt den Skriptablauf unter Win 10

    • Oscar
    • 5. April 2020 um 10:23

    Hmm...in der Tat sehr kritisch.

    Vor allem, weil wohl nicht direkt AutoIt Schuld daran ist. Wenn man nämlich in dem Script von Mars das _ArrayDisplay auskommentiert und stattdessen nur das About-Fenster von Windows öffnet (per DLL-Call), dann passiert dieser Performanceeinbruch trotzdem.

    AutoIt
     #include <Array.au3>
    
    Local $Gewichtungsfaktor = 1
    Local $fScore1 = Bench(2000, $Gewichtungsfaktor) ; Öffnet am Ende ein ArrayDisplay
    
    Local $aRet = DllCall('shell32.dll', 'int', 'ShellAboutW', 'hwnd', 0, 'wstr', 'test' & '#' & 'test', 'wstr', 'test', _
                'handle', 0)
    
    Local $fScore2 = Bench(2000, $Gewichtungsfaktor) ; Ist weeeeesentlich langsamer
    
    ConsoleWrite(StringFormat('%.2f', $fScore1) & ' (100.00%)' & @CRLF & StringFormat('%.2f', $fScore2) &  ' (' & StringFormat('%.2f', $fScore2/$fScore1*100) & '%)' & @CRLF)
    
    Func Bench($n = 2000, $m = 1)
    
        Local $u = 13, $r = 0
        Local $aBench[$u+1][5]
    
        $aBench[0][0] = 'Beschreibung'
        $aBench[0][1] = 'Funktionspointer'
        $aBench[0][2] = 'µs/Aufruf'
        $aBench[0][3] = 'µs Gewichtet'
        $aBench[0][4] = 'Gewichtung'
    
        $aBench[1][0] = 'Local $a'
        $aBench[1][1] = _01
        $aBench[1][2] = 0
        $aBench[1][3] = 0
        $aBench[1][4] = 24 * $m
    
        $aBench[2][0] = 'Local $aaaaa'
        $aBench[2][1] = _02
        $aBench[2][2] = 0
        $aBench[2][3] = 0
        $aBench[2][4] = 23 * $m
    
        $aBench[3][0] = 'Local $aaaaaaaaaa'
        $aBench[3][1] = _03
        $aBench[3][2] = 0
        $aBench[3][3] = 0
        $aBench[3][4] = 20 * $m
    
        $aBench[4][0] = '$a = 0'
        $aBench[4][1] = _04
        $aBench[4][2] = 0
        $aBench[4][3] = 0
        $aBench[4][4] = 10 * $m
    
        $aBench[5][0] = '$a += 0'
        $aBench[5][1] = _05
        $aBench[5][2] = 0
        $aBench[5][3] = 0
        $aBench[5][4] = 10 * $m
    
        $aBench[6][0] = '$a += b'
        $aBench[6][1] = _06
        $aBench[6][2] = 0
        $aBench[6][3] = 0
        $aBench[6][4] = 8 * $m
    
        $aBench[7][0] = '$a *= b'
        $aBench[7][1] = _07
        $aBench[7][2] = 0
        $aBench[7][3] = 0
        $aBench[7][4] = 8 * $m
    
        $aBench[8][0] = '$a /= b'
        $aBench[8][1] = _08
        $aBench[8][2] = 0
        $aBench[8][3] = 0
        $aBench[8][4] = 8 * $m
    
        $aBench[9][0] = 'should be zero'
        $aBench[9][1] = _09
        $aBench[9][2] = 0
        $aBench[9][3] = 0
        $aBench[9][4] = 0 * $m
    
        $aBench[10][0] = 'Timerinit()'
        $aBench[10][1] = _10
        $aBench[10][2] = 0
        $aBench[10][3] = 0
        $aBench[10][4] = 15 * $m
    
        $aBench[11][0] = '$a = $a ^ 1.01'
        $aBench[11][1] = _11
        $aBench[11][2] = 0
        $aBench[11][3] = 0
        $aBench[11][4] = 2 * $m
    
        $aBench[12][0] = '$a = $a ^ $b'
        $aBench[12][1] = _12
        $aBench[12][2] = 0
        $aBench[12][3] = 0
        $aBench[12][4] = 2 * $m
    
        $aBench[13][0] = '$a = Sin(3.1415)'
        $aBench[13][1] = _13
        $aBench[13][2] = 0
        $aBench[13][3] = 0
        $aBench[13][4] = 3 * $m
    
        For $i = 1 To $n Step 1
            $r = Random(1, $u, 1)
            $aBench[$r][2] += $aBench[$r][1]()
            $aBench[$r][3] += 1
        Next
    
        Local $fScore
    
        For $i = 1 To $u Step 1
            $aBench[$i][2] /= $aBench[$i][3]
            $aBench[$i][3] = $aBench[$i][2] * $aBench[$i][4]
            $fScore += $aBench[$i][3]
        Next
        $fScore /= ($u - 1) ; Should be Zero wird nicht mit eingerechnet.
        $fScore = Round(1000 / $fScore, 2)
        ; fScore ist auf 1000 normiert (auf meinem PC, gemacht wurde das mit den Gewichtungen)
        ; Ist fScore > 1000 ist der Benchmark proportional schneller gelaufen als bei mir
        ; Ist fScore < 1000 ist der Benchmark porportional langsamer gelaufen als bei mir
        ; Proportional bedeutet -> Score von 500 -> halb so schnell.
    ;~     _ArrayDisplay($aBench, $fScore)
        Return $fScore
    EndFunc
    
    Func _010()
        Local $t = TimerInit()
        For $i = 1 To 1e3 Step 1
        Next
        Return TimerDiff($t)
    EndFunc
    
    Func _01()
        Local $t = TimerInit()
        For $i = 1 To 1e3 Step 1
            Local $a
        Next
        Return TimerDiff($t) - _010()
    EndFunc
    
    Func _02()
        Local $t = TimerInit()
        For $i = 1 To 1e3 Step 1
            Local $aaaaa
        Next
        Return TimerDiff($t) - _010()
    EndFunc
    
    Func _03()
        Local $t = TimerInit()
        For $i = 1 To 1e3 Step 1
            Local $aaaaaaaaaa
        Next
        Return TimerDiff($t) - _010()
    EndFunc
    
    Func _04()
        Local $t = TimerInit(), $a = 0
        For $i = 1 To 1e3 Step 1
            $a = 0
        Next
        Return TimerDiff($t) - _010()
    EndFunc
    
    Func _05()
        Local $t = TimerInit(), $a = 0
        For $i = 1 To 1e3 Step 1
            $a += 0
        Next
        Return TimerDiff($t) - _010()
    EndFunc
    
    Func _06()
        Local $t = TimerInit(), $a = 1, $b = 1
        For $i = 1 To 1e3 Step 1
            $a += $b
        Next
        Return TimerDiff($t) - _010()
    EndFunc
    
    Func _07()
        Local $t = TimerInit(), $a = 1.5, $b = 1.5
        For $i = 1 To 1e3 Step 1
            $a *= $b
        Next
        Return TimerDiff($t) - _010()
    EndFunc
    
    Func _08()
        Local $t = TimerInit(), $a = 1.5, $b = 1.5
        For $i = 1 To 1e3 Step 1
            $a /= $b
        Next
        Return TimerDiff($t) - _010()
    EndFunc
    
    Func _09()
        Local $t = TimerInit()
        For $i = 1 To 1e3 Step 1
        Next
        Return TimerDiff($t) - _010()
    EndFunc
    
    Func _10()
        Local $t = TimerInit()
        For $i = 1 To 1e3 Step 1
            TimerInit()
        Next
        Return TimerDiff($t) - _010()
    EndFunc
    
    Func _11()
        Local $t = TimerInit(), $a = 1.5
        For $i = 1 To 1e3 Step 1
            $a = $a ^ 1.01
        Next
        Return TimerDiff($t) - _010()
    EndFunc
    
    Func _12()
        Local $t = TimerInit(), $a = 1.5, $b = 1.01
        For $i = 1 To 1e3 Step 1
            $a = $a ^ $b
        Next
        Return TimerDiff($t) - _010()
    EndFunc
    
    Func _13()
        Local $t = TimerInit(), $a = 0
        For $i = 1 To 1e3 Step 1
            $a = Sin(3.1415)
        Next
        Return TimerDiff($t) - _010()
    EndFunc
    Alles anzeigen
  • Variablen

    • Oscar
    • 2. April 2020 um 17:00

    So eine Funktion habe ich schonmal geschrieben: _FileCopyEx

  • Schleife wiederholt sich trotz ExitLoop

    • Oscar
    • 2. April 2020 um 11:35
    Zitat von alpines

    Bitte mal den originalen Thread wiederherstellen oder gleich komplett entfernen.

    Tja, wenn ich mir das ansehe, sehe ich viel Pixelsearch. Vermutlich war das sowieso ein Bot.

    Eine Wiederherstellung ist da wohl nicht angebracht.

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™