Progress

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

just me
Posts: 9424
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Progress

07 Sep 2017, 10:32

Die über das Array erstellte Bitmap sollte in etwa der tatsächlich benötigten Größe entsprechen.

Fragen:
Welche Windows Version läuft bei Dir?
Zeigst Du das auf einem skalierten Bildschirm an?
Hast Du die Größe des Pic Controls geändert?
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Progress

07 Sep 2017, 13:02

just me wrote:Die über das Array erstellte Bitmap sollte in etwa der tatsächlich benötigten Größe entsprechen.

Fragen:
Welche Windows Version läuft bei Dir? Win7 Pro SP1
Zeigst Du das auf einem skalierten Bildschirm an? 1280x800 (die native auflösung des nobos)
Hast Du die Größe des Pic Controls geändert? Yo. Habe den default w16 h12 (16/12 = 1.33) jeweils proportional verkleinert. zB w7.98 h6
Entsprechend anzupassen wäre dann noch der offset, klar. Der screenshot des "CEPG"s (several posts ago) zeigt den vorgesehenen platz des controls (rechts vom record-button) an.
Hier die von mir (zu testzwecken) verkleinerte version.
JMbar01.png
(2.77 KiB) Downloaded 127 times
Wird dieser screenshot in MS Paint vergrößert (ich erkenne es auch so), sieht man/frau das einzelne pixel des triangels mitunter 'auswandern'.
just me
Posts: 9424
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Progress

08 Sep 2017, 02:51

Moin BoBo,

ich habe nicht damit gerechnet, dass das Dreieck zu groß sein könnte. Wenn Du das einsetzen willst, solltest Du aber ohnehin besser eine passende bzw. gut skalierbare Grafik anstelle des selbstgebastelten Dreiecks verwenden. Das ist ja nur 'der Not entsprungen'.
BoBo wrote:Yo. Habe den default w16 h12 (16/12 = 1.33) jeweils proportional verkleinert. zB w7.98 h6
Das ist keine gute Idee. Bei einer Angabe wie w7.98 hängt AHK den Dezimalteil einfach ab und erstellt ein Control mit 7 Pixel Breite. Bei mir sorgt schon w8 h6 für ein etwas besseres Ergebnis. Beim Skalieren besteht generell das Problem, dass sich der Algorythmus beim Verteilen der Pixel für genau ein Pixel entscheiden muss. Je weniger Pixel es gibt, desto gößer ist die Wahrscheinlichkeit für 'Verzerrungen'. Das Ergebnis kann nur durch den Einsatz von 'Halbtonfarben' verbessert werden.

AHK / die Controls / die API-Funktionen scheinen sich auf Win 10 (und wahrscheinlich auch Win 8) beim Skalieren abhängig von der Farbtiefe anders zu verhalten als die früheren Versionen. Das ist mir bereits beim Testen von SKANs CreateDIB() aufgefallen. Soweit ich weiß, ist seit Win 8 die Farbtiefe des Systems auf 32 Bit festgenagelt. Unter Win 7 und früher war der Standard wohl eher 24 Bit. 32-Bit Bitmaps werden auf Win 10 bei 'passenden' Skalierungsfaktoren mit Kantenglättung skaliert. Auf Win 7 passiert das meiner Erinnerung nach bei 24-Bit Bitmaps. Das ist die Ursache dafür, dass man mit SKANs Funktion auch Farbverläufe erstellen kann. Vielleicht muss auch einfach nur die Farbtiefe der Bitmap mit der Farbtiefe des Desktops übereinstimmen.
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Progress

08 Sep 2017, 09:00

Die halbtonfarben habe ich ebenfalls angedacht. Es wäre eine lösung möglich, welche deine 'notlösung' :shh: und die verwendung einer vorhandenen grafik beinhaltet. Dabei wäre eine gewünschte grafik im vorfeld px für px als colorarray einzulesen. Mal schaun ob ich das irgendwie hinbekomme (hab schon erfolglos danach gesucht).

Fast letzte frage: Nach laden der programmübersicht wird im LV die aktuell laufende sendung selektiert - wie bekomme ich den zeiger, anstatt von 0 beginnend, direkt an die aktuelle zeit/position für die bereits laufende sendung (also zw start <und> endzeit) gesprungen? :think:

In der jetzigen form lässt sich die jmBar (interne projektbezeichnung ;) ) für das recording verwenden, wo start bis endzeit komplett durchlaufen wird.

Übrigens, merci vielemals für deine bemühungen - matsch ebrieschijäyded :thumbup:
just me
Posts: 9424
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Progress

08 Sep 2017, 10:13

Ich hatte das Skript schon überarbeitet und u.a. eineFunktion DIB_CreateFrom2Arrays() erstellt, die das Erstellen der Arrays zumindest insoweit erleichtern sollte, dass man nicht ganz so lange Zahlenangaben braucht.

Jetzt habe ich das Dreieck noch als 8x4 Bitmap erstellt und auf 8x6 skaliert. Du kannt ja mal schauen, wie das bei Dir aussieht.

Code: Select all

#NoEnv
SetBatchLines, -1
; --------------------------------------------------------------------------------------------------------------------------------
; Resources 0D547F
LineColorI := 0xFFFFFF                                               ; initial line color
LineColorC := 0x1BA8FE                                               ; color for completed line segments
TriColors  := [0x1BA8FE, 0x000000]                                   ; triangle bitmap
; TriPixels  := [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2]
;              , [2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2]
;              , [2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2]
;              , [2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2]
;              , [2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2]
;              , [2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2]
;              , [2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2]
;              , [2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2]]
TriPixels  := [[1, 1, 1, 1, 1, 1, 1, 2]
             , [2, 1, 1, 1, 1, 1, 2, 2]
             , [2, 2, 1, 1, 1, 2, 2, 2]
             , [2, 2, 2, 1, 2, 2, 2, 2]]
HBMT  := DIB_CreateFrom2Arrays(TriColors, TriPixels)
HBMLI := DIB_CreateUC(LineColorI)
HBMLF := DIB_CreateUC(LineColorC)
; --------------------------------------------------------------------------------------------------------------------------------
; Times
StartTime := "23:15:00"
EndTime := "23:15:30"
Today := A_YYYY . A_MM . A_DD
S := Today . StrReplace(StartTime, ":")
E := Today . StrReplace(EndTime, ":")
If (EndTime < StartTime)
   E += 1, D
RunTime := E
RunTime -= S, S
; --------------------------------------------------------------------------------------------------------------------------------
; Settings
FontSize := 16          ; font size
LineHeight := 3         ; height of the progress base line
TriangleWidth := 8      ; width of the triangle bitmap
TriangleHeight := 6     ; height of the triangle bitmap
TriangleOffset := 3     ; offset of the triangle bitmap
SegmentLength := 28     ; width of a line segment
; --------------------------------------------------------------------------------------------------------------------------------
; GUI
Gui, Color, Black
Gui, Margin, 20, 20
Gui, Font, s16
Gui, Add, Text, xm ym cWhite vT1, %StartTime%
GuiControlGet, T1, Pos
Y := Round(T1Y + (T1H / 2) - (LineHeight / 2))
Gui, Add, Pic, x+10 y%Y% w%SegmentLength% h%LineHeight% vP1, HBITMAP:*%HBMLI%
GuiControlGet, P1, Pos
Gui, Add, Pic, x+3 yp wp hp vP2, HBITMAP:*%HBMLI%
Gui, Add, Pic, x+3 yp wp hp vP3, HBITMAP:*%HBMLI%
Gui, Add, Pic, x+3 yp wp hp vP4, HBITMAP:*%HBMLI%
GuiControlGet, P4, Pos
Gui, Add, Text, x+10 y%T1Y% cWhite vT2, %EndTime%
X := P1X - TriangleOffset
Y := P1Y - TriangleHeight - LineHeight
Gui, Add, Pic, x%X% y%Y% w%TriangleWidth% h%TriangleHeight% vPB, HBITMAP:*%HBMT%
GuiControlGet, PB, Pos
Gui, Show, , Progress - %RunTime% Sekunden
; --------------------------------------------------------------------------------------------------------------------------------
; Timer
SegmentIndex := 1
SegmentTime := RunTime / 4
LineLength := P4X + P4W - P1X
ProgressDelta := LineLength / RunTime
StartTC := A_TickCount
ProgressX := PBX
SetTimer, UpdProgress, 10
Return
; --------------------------------------------------------------------------------------------------------------------------------
GuiClose:
ExitApp
; --------------------------------------------------------------------------------------------------------------------------------
UpdProgress:
CurrentSecs := (A_TickCount - STartTC) / 1000
If (CurrentSecs >= SegmentTime) {
   GuiControl, , P%SegmentIndex%, HBITMAP:*%HBMLF%
   SegmentIndex++
   SegmentTime += RunTime / 4
}
If (CurrentSecs >= RunTime) {
   SetTimer, UpdProgress, Off
   MsgBox, 0, Finished!, %CurrentSecs% Sekunden
   Return
}
CurrentX := Round(PBX + (CurrentSecs * ProgressDelta))
If (CurrentX > ProgressX) {
   GuiControl, Move, PB, x%CurrentX%
   ProgressX := CurrentX
}
Return
; ================================================================================================================================
; Modified versions of CreateDIB() by SKAN, 01-Apr-2014, autohotkey.com/boards/viewtopic.php?t=3203
; Colors have to be specified as RGB integer values (0xRRGGBB).
; ================================================================================================================================
; Creates an uni-colored DIB (1x1 pixels).
; ================================================================================================================================
DIB_CreateUC(Color) {
   Static W := 1, H := 1, Size := W * H * 4
   HBM := DllCall("CreateBitmap", "Int", W, "Int", H, "UInt", 1, "UInt", 32, "Ptr", 0, "UPtr")
   , HBM := DllCall("CopyImage", "Ptr", HBM, "UInt", 0, "Int", 0, "Int", 0, "UInt", 0x2008, "UPtr")
   , VarSetCapacity(BMBITS, Size, 0)
   , Numput(Color, BMBITS, "UInt")
   , DllCall("SetBitmapBits", "Ptr", HBM, "UInt", Size, "Ptr", &BMBITS)
   Return HBM
}
; ================================================================================================================================
; Creates a DIB from two arrays.
; Colors       -  1-dimensional array of colors.
; Pixels       -  2-dimensional array of color indices.
; ================================================================================================================================
DIB_CreateFrom2Arrays(Colors, Pixels, RepeatX := 1, RepeatY := 1) {
   If !(H := Pixels.Length()) || !(W := Pixels.1.Length())
      Return 0
   For Each, Row In Pixels {
      For I, V In Row
         If !Colors.HasKey(V)
            Return False
         Else
            Row[I] := Colors[V]
   }
   Size := W * RepeatX * H * RepeatY * 4
   HBM := DllCall("CreateBitmap", "Int", W * RepeatX, "Int", H * RepeatY, "UInt", 1, "UInt", 32, "Ptr", 0, "UPtr")
   HBM := DllCall("CopyImage", "Ptr", HBM, "UInt", 0, "Int", 0, "Int", 0, "UInt", 0x2008, "UPtr")
   VarSetCapacity(BMBITS, Size, 0)
   Addr := &BMBITS
   Loop, %RepeatY%
      For Each, Row In Pixels
         Loop, %RepeatX%
            For Each, Color In Row
               Addr := NumPut(Color, Addr + 0, "UInt")
   DllCall("SetBitmapBits", "Ptr", HBM, "UInt", Size, "Ptr", &BMBITS)
   Return HBM
}
Win 10 skaliert das so:
Dreieck.png
(774 Bytes) Downloaded 78 times
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Progress

08 Sep 2017, 10:31

Ich hatte zwztl mal in einem versuch img01.gif als 10x10 colorarray eingelesen (wobei eine ungerade anzahl an vertikalen pixeln die echte/einpixelige spitze ergibt).
Funzt. :thumbup:
just me
Posts: 9424
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Progress

08 Sep 2017, 10:38

Fast vergessen:

Wenn Du die seit der Startzeit bereits verstrichene Zeit in Sekunden ermittelst, ist die Startposition des Zeigers:

Code: Select all

X :=Round(P1X + (VerstricheneZeitInSekunden * ProgressDelta) - TriangleOffset)
Man müsste in der letzen Skriptversion aber noch ein paar zusätzliche Anpassungen machen.
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Progress

08 Sep 2017, 10:52

just me wrote: Ich hatte das Skript schon überarbeitet und u.a. eineFunktion DIB_CreateFrom2Arrays() erstellt, die das Erstellen der Arrays zumindest insoweit erleichtern sollte, dass man nicht ganz so lange Zahlenangaben braucht.

Jetzt habe ich das Dreieck noch als 8x4 Bitmap erstellt und auf 8x6 skaliert. Du kannt ja mal schauen, wie das bei Dir aussieht.

[...]

Win 10 skaliert das so:
Dreieck.png
Geht sehr gut (wie die vorversion. Der farbverlauf verliert sich allerdings). Insbesondere die farbliche veränderung der balken/line zur laufzeit entspricht (fast) dem original (obwohl ich dies nicht mal angesprochen hatte :shock: ) - dort läuft die farbe im balken auf pfeilhöhe mit - was ich allerdings nicht zwingend benötige.
Bin bereits reichlichst beeindruckt was sich so machen lässt!! Mille Grazie :clap:
just me
Posts: 9424
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Progress

09 Sep 2017, 09:42

BoBo wrote:... dort läuft die farbe im balken auf pfeilhöhe mit - was ich allerdings nicht zwingend benötige.
Ein Schelm, wer Böses dabei denkt! ;)

Ich habe mal einen Videofreak bei der AHK-Programmierung unterstützt. Dabei habe ich dieses 'nicht zwingend benötigt' auch oft gehört. Dennoch hat mein Partner nie wirklich Ruhe gegeben, bevor er es dann doch hatte. Irgenwann bin ich ausgestiegen, weil diese immer wieder nachgeschobenen 'Verschönerungen' der Oberfläche dazu geführt haben, dass immer größere Teile des immer komplexer werdenden Skripts überarbeitet werden mussten, ohne dass sich mir der Sinn erschlossen hat.

In diesem Fall bewegen wir uns aber noch auf einem einfachen Level. Bis auf die DIB-Funktionen wird alles mit stinknormalen Controls realisiert. Und weil mir das noch Spaß macht, gibt es auch noch diese Zugabe. Wenn Dein Adlerauge Ungenauigkeiten erkennt, solltest Du an den Offsets drehen:

Code: Select all

#NoEnv
SetBatchLines, -1
; --------------------------------------------------------------------------------------------------------------------------------
; Times - woher auch immer
StartTime := "15:01"
EndTime := "15:02"
StartTime := A_Now
EndTime := A_Now
EndTime += % (A_Sec > 30 ? 90 : 60) , S
FormatTime, StartTime, %StartTime%, HH:mm
FormatTime, EndTime, %EndTime%, HH:mm
; --------------------------------------------------------------------------------------------------------------------------------
; Settings
FontSize := 16                            ; GUI font size
; Line segments
LineHeight := 3                           ; height of the progress base line
LineColorI := 0xFFFFFF                    ; initial line color
LineColorE := 0x1BA8FE                    ; color for elapsed parts
SegmentLength := 28                       ; width of one line segment
SegmentOffset := 3                        ; distance between lind segments
; Triangle
TriangleWidth  := 16                      ; width of the triangle control
TriangleHeight := 12                      ; height of the triangle control
TriangleOffset := 7                       ; offset of the apex
TriangleColors := [0x1BA8FE, 0x000000]    ; colors used for triangle bitmap
; Bitmaps
TrianglePixels := [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2]
                 , [2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2]
                 , [2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2]
                 , [2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2]
                 , [2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2]
                 , [2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2]
                 , [2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2]
                 , [2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2]]
HBMT  := DIB_CreateFrom2Arrays(TriangleColors, TrianglePixels)
HBMLI := DIB_CreateUC(LineColorI)
HBMLE := DIB_CreateUC(LineColorE)
; --------------------------------------------------------------------------------------------------------------------------------
; Create GUI
Gui, Color, Black
Gui, Margin, 20, 20
Gui, Font, s16
Gui, Add, Text, xm ym cWhite vT1, %StartTime%
GuiControlGet, T1, Pos
Y := Round(T1Y + (T1H / 2) - (LineHeight / 2))
Gui, Add, Pic, x+10 y%Y% w%SegmentLength% h%LineHeight% vL1, HBITMAP:*%HBMLI%
GuiControlGet, L1, Pos
Gui, Add, Pic, x+%SegmentOffset% yp wp hp vL2, HBITMAP:*%HBMLI%
GuiControlGet, L2, Pos
Gui, Add, Pic, x+%SegmentOffset% yp wp hp vL3, HBITMAP:*%HBMLI%
GuiControlGet, L3, Pos
Gui, Add, Pic, x+%SegmentOffset% yp wp hp vL4, HBITMAP:%HBMLI%
GuiControlGet, L4, Pos
Gui, Add, Text, x+10 y%T1Y% cWhite vT2, %EndTime%
X := L1X - TriangleOffset
Y := L1Y - TriangleHeight - LineHeight
Gui, Add, Pic, x%X% y%Y% w%TriangleWidth% h%TriangleHeight% vPB, HBITMAP:%HBMT%
GuiControlGet, PB, Pos
; --------------------------------------------------------------------------------------------------------------------------------
; Time & Progress calculations
Today := A_YYYY . A_MM . A_DD
S := Today . StrReplace(StartTime, ":")
E := Today . StrReplace(EndTime, ":")
If (EndTime < StartTime)
   E += 1, D
TotalTime := E
TotalTime -= S, S
ElapsedTime := A_Now
If (ElapsedTime > S)
   ElapsedTime -= S, S
Else
   ElapsedTime := 0
RemainingTime := TotalTime - ElapsedTime
LineLength := (4 * SegmentLength) + 9
ProgressDelta := LineLength / TotalTime
ElapsedX := Round(PBX + (ElapsedTime * ProgressDelta))
GuiControl, Move, PB, x%ElapsedX%
If (ElapsedX > (L4X - TriangleOffset)) {
   GuiControl, , L3, HBITMAP:*%HBMLE%
   GuiControl, , L2, HBITMAP:*%HBMLE%
   GuiControl, , L1, HBITMAP:*%HBMLE%
   SegmentX := L4X - TriangleOffset
   SegmentIndex := 4
}
Else If (ElapsedX > (L3X - TriangleOffset)) {
   GuiControl, , L2, HBITMAP:*%HBMLE%
   GuiControl, , L1, HBITMAP:*%HBMLE%
   SegmentX := L3X - TriangleOffset
   SegmentIndex := 3
}
Else If (ElapsedX > (L2X - TriangleOffset)) {
   GuiControl, , L1, HBITMAP:*%HBMLE%
   SegmentX := L2X - TriangleOffset
   SegmentIndex := 2
}
Else {
   SegmentX := L1X - TriangleOffset
   SegmentIndex := 1
}
StartTC := A_TickCount
ProgressX := PBX
Gosub, UpdSegment
; --------------------------------------------------------------------------------------------------------------------------------
; Show GUI
Gui, Show, , %RemainingTime% of %TotalTime% seconds
SetTimer, UpdProgress, 10
Return
; --------------------------------------------------------------------------------------------------------------------------------
GuiClose:
ExitApp
; --------------------------------------------------------------------------------------------------------------------------------
UpdProgress:
CurrentTime := ElapsedTime + (A_TickCount - StartTC) / 1000
If (CurrentTime >= TotalTime) {
   CurrentTime -= ElapsedTime
   SetTimer, UpdProgress, Off
   MsgBox, 0, Finished!, %CurrentTime% of %TotalTime% Seconds
   Return
}
ElapsedX := Round(PBX + (CurrentTime * ProgressDelta))
If (ElapsedX > ProgressX) {
   GuiControl, Move, PB, x%ElapsedX%
   If (ElapsedX > (SegmentX + SegmentLength)) {
      SegmentIndex++
      SegmentX := L%SegmentIndex%X - TriangleOffset
   }
   GoSub, UpdSegment
   ProgressX := ElapsedX
}
Return
; --------------------------------------------------------------------------------------------------------------------------------
UpdSegment:
SegmentElapsed := ElapsedX - SegmentX
ColorArray := []
Loop, % (SegmentElapsed)
   ColorArray.Push(LineColorE)
Loop, % (SegmentLength - SegmentElapsed)
   ColorArray.Push(LineColorI)
HBM := DIB_CreateFromArray([ColorArray], 1, LineHeight)
GuiControl, , L%SegmentIndex%, HBITMAP:%HBM%
Return
; ================================================================================================================================
; Modified versions of CreateDIB() by SKAN, 01-Apr-2014, autohotkey.com/boards/viewtopic.php?t=3203
; Colors have to be specified as RGB integer values (0xRRGGBB).
; ================================================================================================================================
; Creates an uni-colored DIB (1x1 pixels).
; ================================================================================================================================
DIB_CreateUC(Color) {
   Static W := 1, H := 1, Size := W * H * 4
   HBM := DllCall("CreateBitmap", "Int", W, "Int", H, "UInt", 1, "UInt", 32, "Ptr", 0, "UPtr")
   , HBM := DllCall("CopyImage", "Ptr", HBM, "UInt", 0, "Int", 0, "Int", 0, "UInt", 0x2008, "UPtr")
   , VarSetCapacity(BMBITS, Size, 0)
   , Numput(Color, BMBITS, "UInt")
   , DllCall("SetBitmapBits", "Ptr", HBM, "UInt", Size, "Ptr", &BMBITS)
   Return HBM
}
; ================================================================================================================================
; Creates DIB from a color array.
; ColorArray   -  2-dimensional array of colors.
; ================================================================================================================================
DIB_CreateFromArray(ColorArray, RepeatX := 1, RepeatY := 1) {
   If !(H := ColorArray.Length()) || !(W := ColorArray.1.Length())
      Return 0
   Size := W * RepeatX * H * RepeatY * 4
   HBM := DllCall("CreateBitmap", "Int", W * RepeatX, "Int", H * RepeatY, "UInt", 1, "UInt", 32, "Ptr", 0, "UPtr")
   HBM := DllCall("CopyImage", "Ptr", HBM, "UInt", 0, "Int", 0, "Int", 0, "UInt", 0x2008, "UPtr")
   VarSetCapacity(BMBITS, Size, 0)
   Addr := &BMBITS
   Loop, %RepeatY%
      For Each, Row In ColorArray
         Loop, %RepeatX%
            For Each, Color In Row
               Addr := NumPut(Color, Addr + 0, "UInt")
   DllCall("SetBitmapBits", "Ptr", HBM, "UInt", Size, "Ptr", &BMBITS)
   Return HBM
}
; ================================================================================================================================
; Creates a DIB from two arrays.
; Colors       -  1-dimensional array of colors.
; Pixels       -  2-dimensional array of color indices.
; ================================================================================================================================
DIB_CreateFrom2Arrays(Colors, Pixels, RepeatX := 1, RepeatY := 1) {
   If !(H := Pixels.Length()) || !(W := Pixels.1.Length())
      Return 0
   For Each, Row In Pixels {
      For I, V In Row
         If !Colors.HasKey(V)
            Return False
         Else
            Row[I] := Colors[V]
   }
   Size := W * RepeatX * H * RepeatY * 4
   HBM := DllCall("CreateBitmap", "Int", W * RepeatX, "Int", H * RepeatY, "UInt", 1, "UInt", 32, "Ptr", 0, "UPtr")
   HBM := DllCall("CopyImage", "Ptr", HBM, "UInt", 0, "Int", 0, "Int", 0, "UInt", 0x2008, "UPtr")
   VarSetCapacity(BMBITS, Size, 0)
   Addr := &BMBITS
   Loop, %RepeatY%
      For Each, Row In Pixels
         Loop, %RepeatX%
            For Each, Color In Row
               Addr := NumPut(Color, Addr + 0, "UInt")
   DllCall("SetBitmapBits", "Ptr", HBM, "UInt", Size, "Ptr", &BMBITS)
   Return HBM
}
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Progress

09 Sep 2017, 09:57

just me wrote:
BoBo wrote:... dort läuft die farbe im balken auf pfeilhöhe mit - was ich allerdings nicht zwingend benötige.
Ein Schelm, wer Böses dabei denkt! ;)

Ich habe mal einen Videofreak bei der AHK-Programmierung unterstützt. Dabei habe ich dieses 'nicht zwingend benötigt' auch oft gehört. Dennoch hat mein Partner nie wirklich Ruhe gegeben, bevor er es dann doch hatte. Irgenwann bin ich ausgestiegen, weil diese immer wieder nachgeschobenen 'Verschönerungen' der Oberfläche dazu geführt haben, dass immer größere Teile des immer komplexer werdenden Skripts überarbeitet werden mussten, ohne dass sich mir der Sinn erschlossen hat.

In diesem Fall bewegen wir uns aber noch auf einem einfachen Level. Bis auf die DIB-Funktionen wird alles mit stinknormalen Controls realisiert. Und weil mir das noch Spaß macht, gibt es auch noch diese Zugabe. Wenn Dein Adlerauge Ungenauigkeiten erkennt, solltest Du an den Offsets drehen:
Spoiler
Ich meine es wie ich es sage. Und deine vorgehensweise entspricht auch exakt meiner meinung. Schließlich verbrate ich hier auch (d)eine lebenszeit. Ich bin über jede hilfe dankbar, und was ich selbst hinbekomme mach ich auch lieber selbst. Zumal das kolossal übt :)
just me
Posts: 9424
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Progress

09 Sep 2017, 10:27

Hallo BoBo,

ich wollte nicht herumkritteln. Es kam mir nur in den Sinn, weil auch hier ein Videothema im Hintergrund steht. Ich hätte das wohl auch für mich allein im stillen Kämmerlein gebastelt, weil mich interessiert hat, wie weit man das mit (meiner Meinung nach) einfachen Mitteln nachbauen kann. Das Aktualisieren der Fortschrittsbalken lässt sich wahrscheinlich auch mit vier echten Progress-Controls nachbilden. Ich werde das wohl auch noch einmal versuchen. Aber weil die DIB-Funktionen schon drin waren ...
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Progress

29 Jan 2022, 06:28

Bin heute bei Recherche zu Slidern über diesen 2017er Thread gestolpert und möchte mal anmerken das der Support, welchen @just me (und viele andere!) über Jahre hinweg geleistet haben (und immer noch leisten!!) gar nicht genug gewürdigt werden kann …

Deshalb hier mal ein dickes DANKE meinerseits für Eure (langjährige) Leistung :salute: :salute: :thumbup: 8-) :thumbup: :salute: :salute:

BoBo

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: Ragnar and 32 guests