Farbauswahl ähnlich wie in PB - Basisroutinen
- hjbremer
- Beiträge: 822
- Registriert: 27.02.2006 22:30
- Computerausstattung: von gestern
- Wohnort: Neumünster
Erklärung zu diesem Vista Problem.
Vista hat offenbar einen anderen internen Pfeil, der größer ist als der XP Pfeil.
Wenn man in der IniProzedur ganz unten die beiden DemoImages aktiviert, sieht man wo der Pfeil im schwarze Image plaziert ist. Die linke obere Ecke muß nun schwarz bleiben !
Denn dies ist der Punkt für GetPixel.
Es gibt nun verschiedene Möglichkeiten
1. ein Kreuz nehmen, siehe vorheriges Posting
oder
2. Den Pfeil im Image nach unten verschieben durch andere Werte bei DrawImage
oder
3. den Punkt für GetPixel verschieben, \imgColor = GetPixel_(dc, \curpos\x-1, \curpos\y-1) in der Prozedur myImageGadgetProcRGB(hWnd, message,wParam,lParam)
dann muß aber auch das RECT für ClipCursor verändert werden. r\left +1: r\top +1
oder
4. GetPixel holt sich die Farbe bevor der Cursor gemalt wird.
Also nach BitBlt_(hdmemdc1, 0, 0, \imgbr, \imghh, hdmemdc2, 0, 0,#SRCCOPY) im Paint Abschnitt
Wobei 4. wohl der beste Weg ist
Vista hat offenbar einen anderen internen Pfeil, der größer ist als der XP Pfeil.
Wenn man in der IniProzedur ganz unten die beiden DemoImages aktiviert, sieht man wo der Pfeil im schwarze Image plaziert ist. Die linke obere Ecke muß nun schwarz bleiben !
Denn dies ist der Punkt für GetPixel.
Es gibt nun verschiedene Möglichkeiten
1. ein Kreuz nehmen, siehe vorheriges Posting
oder
2. Den Pfeil im Image nach unten verschieben durch andere Werte bei DrawImage
oder
3. den Punkt für GetPixel verschieben, \imgColor = GetPixel_(dc, \curpos\x-1, \curpos\y-1) in der Prozedur myImageGadgetProcRGB(hWnd, message,wParam,lParam)
dann muß aber auch das RECT für ClipCursor verändert werden. r\left +1: r\top +1
oder
4. GetPixel holt sich die Farbe bevor der Cursor gemalt wird.
Also nach BitBlt_(hdmemdc1, 0, 0, \imgbr, \imghh, hdmemdc2, 0, 0,#SRCCOPY) im Paint Abschnitt
Wobei 4. wohl der beste Weg ist
Purebasic 5.70 x86 5.72 X 64 - Windows 10
Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
> Erklärung zu diesem Vista Problem.
> Vista hat offenbar einen anderen internen Pfeil, der größer ist als der XP Pfeil.
Ich nutze gerade XP zum Testen, also kein Vista Problem (obwohl Vista viele
Probleme hat, aber das gehört nicht hier hin).
Mit dem gemaltem Kreuz funktioniert es korrekt, daraufhin sollte man den
Source auch abändern, hat nicht jeder so ein kleinen Standard-Cursor,
den ich auf 2 Bildschirmen mit bis zu 1920x1200 zu lange suchen muß
Ich verwende zwar ein normales Set an Cursorn, aber den normallen Pfeil
hab ich durch einen speziellen Cursor (Allied.cur) ersetzt, da dieser besser
zu sehen, keinen Schatten dafür benötigt, größer und trotzdem exakt (dank
kleiner Spitze) funktioniert. Diesen Cursor nutze ich bereits über 10 Jahre, so
das Programme darauf Rücksicht nehmen sollten
Gruß
Thomas
> Vista hat offenbar einen anderen internen Pfeil, der größer ist als der XP Pfeil.
Ich nutze gerade XP zum Testen, also kein Vista Problem (obwohl Vista viele
Probleme hat, aber das gehört nicht hier hin).
Mit dem gemaltem Kreuz funktioniert es korrekt, daraufhin sollte man den
Source auch abändern, hat nicht jeder so ein kleinen Standard-Cursor,
den ich auf 2 Bildschirmen mit bis zu 1920x1200 zu lange suchen muß

Ich verwende zwar ein normales Set an Cursorn, aber den normallen Pfeil
hab ich durch einen speziellen Cursor (Allied.cur) ersetzt, da dieser besser
zu sehen, keinen Schatten dafür benötigt, größer und trotzdem exakt (dank
kleiner Spitze) funktioniert. Diesen Cursor nutze ich bereits über 10 Jahre, so
das Programme darauf Rücksicht nehmen sollten

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Das habe ich mich auch gefragtKaeru Gaman hat geschrieben:ich frag mich auch grad, was die form des cursors mit der ermittlung der klick-koordinate zu tunhaben soll....

Unter Vista funktioniert es genauso wie unter XP, keine Unterschiede
(also entweder kl. Standard-Cursor nutzen oder Kreuz malen

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

- hjbremer
- Beiträge: 822
- Registriert: 27.02.2006 22:30
- Computerausstattung: von gestern
- Wohnort: Neumünster
ganz viel, wenn man die Farbe ermittelt nachdem die Markierung (Cursor) gemalt wurde, erwischt man, wenn man Pech hat, die Farbe der Cursorspitze, so wie bei TSSOFT anscheinend geschehen.
Jetzt wird die Farbe ermittelt, vor dem Malen der Markierung, ich habs im Code geändert.
Nun sollte es egal sein, welche Form der Markierung (Cursor) man nimmt zum Anzeigen der letzten Farbwahl.
Jetzt wird die Farbe ermittelt, vor dem Malen der Markierung, ich habs im Code geändert.
Nun sollte es egal sein, welche Form der Markierung (Cursor) man nimmt zum Anzeigen der letzten Farbwahl.
Purebasic 5.70 x86 5.72 X 64 - Windows 10
Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
wieso ermittelst du die Farbe, indem du sie aus dem Bild extrahierst?
das Bild zeichnest du mittels einer Formel, die x- und y-koordinaten verwendet.
dieselbe formel benutzt du, um anhand der click-koordinaten die farbe zu berechnen.
das bild dient nur dazu, damit der Benutzer eine idee hat, was für eine Farbe er wählt.
das Bild zeichnest du mittels einer Formel, die x- und y-koordinaten verwendet.
dieselbe formel benutzt du, um anhand der click-koordinaten die farbe zu berechnen.
das bild dient nur dazu, damit der Benutzer eine idee hat, was für eine Farbe er wählt.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
Gute sache,
mich stört nur etwas, das sich das Farbfarbenkreuz nicht bewegt wenn ich die schieber unten bewegen.
Wäre gut wenn du das noch einbauen könntest, sonst kann man nach dem einstellen mit den Schiebern keine kleinen veränderungen mehr machen, da man ja nicht weiß wo das Kreuz ist.
mich stört nur etwas, das sich das Farbfarbenkreuz nicht bewegt wenn ich die schieber unten bewegen.
Wäre gut wenn du das noch einbauen könntest, sonst kann man nach dem einstellen mit den Schiebern keine kleinen veränderungen mehr machen, da man ja nicht weiß wo das Kreuz ist.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
- hjbremer
- Beiträge: 822
- Registriert: 27.02.2006 22:30
- Computerausstattung: von gestern
- Wohnort: Neumünster
Stargate: ein schöner Wunsch, aber die PB Farbauswahl macht das auch nicht und viel wichtiger, ich brauche es nicht.
Kaeru: Ich rechne nicht, benutze keine Formel, sondern die WinApi, genau wie es die PB Farbauswahl macht, glaube ich.
Kaeru: Ich rechne nicht, benutze keine Formel, sondern die WinApi, genau wie es die PB Farbauswahl macht, glaube ich.
Purebasic 5.70 x86 5.72 X 64 - Windows 10
Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Glaube ich nicht, in der alten IDE wurde ASM genutzt und da dasselbehjbremer hat geschrieben:Kaeru: Ich rechne nicht, benutze keine Formel, sondern die WinApi, genau wie es die PB Farbauswahl macht, glaube ich.
Werkzeug auch unter Linux zur Verfügung steht (MacOS kann ich nur
vermuten) wird Freak wohl API-Routinen vermieden haben, insoweit als
möglich.
Da ich persönlich undefinierte Variablen nicht mag, weils die Fehlersuche
erheblich erschwert, wenn ich den Code mit anderen vermenge und
ausserdem wohl irgendwann eine 64-Bit Version von PB kommt, wo man
dann doch zwischen Long und Handles unterscheiden muß, habe ich es mal
ergänzt:
Code: Alles auswählen
;BasisRoutinen für Farbauswahl wie bei PB
;HJBremer Juli 2008 Win XP PB 4.2
Declare myImageGadgetProcIni()
Declare myImageGadgetProcMakeRGB()
Declare myImageGadgetProcMakeSlide()
Declare myImageGadgetProcMakeRgbCursor()
Declare myImageGadgetProcMakeSlideCursor()
Declare myImageGadgetProcMakeDemo()
Declare myImageGadgetProcMakeDemoNew(newcolor)
Declare myImageGadgetProcMakeSlideNew(newcolor)
Declare myImageGadgetProcRGB(hWnd, message, wParam, lParam)
Declare myImageGadgetProcSlide(hWnd, message, wParam, lParam)
Declare Api_FarbverlaufRect(*var)
Declare Api_FarbverlaufTriangle(*var)
Declare myFarbenTrackBarIni()
Declare myFarbenTrackBarSet(farbe)
Declare myFarbenTrackBarState(wb)
Structure GRADIENT_TRIANGLE ;diese Structur fehlt immer noch in PB
Vertex1.l
Vertex2.l
Vertex3.l
EndStructure
Structure myFarbVerlauf
dc.l
trifarbe.l[3]
tripos.point[3]
trivert.TRIVERTEX[3]
trirect.GRADIENT_TRIANGLE
gradrect.GRADIENT_RECT
richtung.l
EndStructure
Structure myImgGadgetProcStruktur
hdcursor.l
lpPrevFunc.l
imgnr.l
imgid.l
imgsp.l
imgze.l
imgbr.l
imghh.l
imgHV.l
imgnrA.l
imgnrB.l
imgCursor1nr.l
imgCursor1id.l
imgCursor2nr.l
imgCursor2id.l
imgCursorbr.l
imgCursorhh.l
imgColor.l
mauspress.l
curpos.point
EndStructure
Structure myFarbTrackbar
tracksp.l
trackze.l
gesamtbr.l
trackbarNrR.l
trackbarNrG.l
trackbarNrB.l
trackbarNrX.l
tracktxtNrR.l
tracktxtNrG.l
tracktxtNrB.l
tracktxtNrX.l
tracktxt.s{8}
r.c ;Farbwerte intern
g.c
b.c
wert.l
EndStructure
Enumeration
#window
#butnrRGB
#butnrDemo
#butnrSlide
EndEnumeration
Define myRGBvar.myImgGadgetProcStruktur
Define myDemovar.myImgGadgetProcStruktur
Define mySlidevar.myImgGadgetProcStruktur
Define myTrackvar.myFarbTrackbar
;==============================
Define.l hwnd, EventID, wButton
hwnd = OpenWindow(#window, 100, 100, 420, 420, "Slider", #PB_Window_SystemMenu)
CreateGadgetList(hwnd)
myImageGadgetProcIni()
Repeat
EventID = WaitWindowEvent()
If EventID = #PB_Event_Gadget
wButton = EventGadget()
myFarbenTrackBarState(wbutton)
Debug Hex(myRGBvar\imgcolor) ;Farbe aus dem großen Farbfeld
Debug Hex(mySlidevar\imgcolor) ;Farbe aus dem Farbbalken
Debug Hex(myDemovar\imgcolor) ;Farbe aus dem Demofeld <----------
;Select wButton
; case xyz
;EndSelect
EndIf
Until EventID = #PB_Event_CloseWindow
End
;==============================
Procedure myImageGadgetProcIni()
Shared myRGBvar.myImgGadgetProcStruktur
Shared myDemovar.myImgGadgetProcStruktur
Shared mySlidevar.myImgGadgetProcStruktur
Shared myTrackvar.myFarbTrackbar
;großes Farbfeld
With myRGBvar
\imgsp = 10 ;Position
\imgze = 10
\imgbr = 200 ;Größe
\imghh = 300
\imgnr = CreateImage(#PB_Any,\imgbr,\imghh)
\imgid = ImageID(\imgnr)
;Startwert für mauspress im großen Farbfeld
;wenn 0, dann muß erst ins Farbfeld geklickt werden
;wenn 1, dann werden die Farben sofort geändert sowie Maus Farbfeld berührt
; allerdings kann man Feld erst verlassen, nach drücken und loslassen der Maustaste
\mauspress = 0
myImageGadgetProcMakeRGB()
myImageGadgetProcMakeRgbCursor()
ContainerGadget(#PB_Any,\imgsp,\imgze,\imgbr + 6,\imghh + 6, #PB_Container_Raised)
ImageGadget(#butnrRGB, 0, 0, 0, 0,\imgid)
SetClassLong_(GadgetID(#butnrRGB), #GCL_HCURSOR, 0) ;muß sein, wegen flackern
\lpPrevFunc = SetWindowLong_(GadgetID(#butnrRGB), #GWL_WNDPROC, @myImageGadgetProcRGB())
CloseGadgetList()
EndWith
;Farbbalken
With mySlidevar
;ergibt waagerechten Balken
;\imgsp = 240
;\imgze = 10
;\imgbr = 160
;\imghh = 50
;\imgHV = #GRADIENT_FILL_RECT_H
;ergibt senkrechten Balken
\imgsp = 240
\imgze = 10
\imgbr = 50
\imghh = 240
\imgHV = #GRADIENT_FILL_RECT_V
\imgnr = CreateImage(#PB_Any,\imgbr,\imghh)
\imgid = ImageID(\imgnr)
If \imgHV = #GRADIENT_FILL_RECT_V
\imgnrA = CreateImage(#PB_Any,\imgbr,\imghh / 2)
\imgnrB = CreateImage(#PB_Any,\imgbr,\imghh / 2)
\curpos\y =\imghh / 2
Else
\imgnrA = CreateImage(#PB_Any,\imgbr / 2,\imghh)
\imgnrB = CreateImage(#PB_Any,\imgbr / 2,\imghh)
\curpos\x =\imgbr / 2
EndIf
\imgcolor = #Gray
myImageGadgetProcMakeSlide()
myImageGadgetProcMakeSlideCursor()
ContainerGadget(#PB_Any,\imgsp,\imgze,\imgbr + 6,\imghh + 6, #PB_Container_Raised)
ImageGadget(#butnrSlide, 0, 0, 0, 0,\imgid)
SetClassLong_(GadgetID(#butnrSlide), #GCL_HCURSOR, 0) ;muß sein, wegen flackern
\lpPrevFunc = SetWindowLong_(GadgetID(#butnrSlide), #GWL_WNDPROC, @myImageGadgetProcSlide())
CloseGadgetList()
EndWith
;Demofeld
With myDemovar
\imgsp = 240
\imgze = 260
\imgbr = 50
\imghh = 50
\imgnr = CreateImage(#PB_Any,\imgbr,\imghh)
\imgid = ImageID(\imgnr)
myImageGadgetProcMakeDemo()
ContainerGadget(#PB_Any,\imgsp,\imgze,\imgbr + 6,\imghh + 6, #PB_Container_Raised)
ImageGadget(#butnrDemo, 0, 0, 0, 0,\imgid)
CloseGadgetList()
EndWith
;Trackbars
With myTrackvar
\tracksp = 10
\trackze = 330
\gesamtbr = 300
myFarbenTrackBarIni()
EndWith
;nur zur Demo
;ImageGadget(#PB_Any, 360, 10, 0, 0,ImageID(myRGBvar\imgCursor1nr))
;ImageGadget(#PB_Any, 360, 40, 0, 0,ImageID(myRGBvar\imgCursor2nr))
;ImageGadget(#PB_Any, 360, 70, 0, 0,ImageID(mySlidevar\imgCursor1nr))
;ImageGadget(#PB_Any, 360, 120, 0, 0,ImageID(mySlidevar\imgCursor2nr))
EndProcedure
Procedure myImageGadgetProcMakeRGB()
Shared myRGBvar.myImgGadgetProcStruktur
Protected br.l, hh.l, nr.l
Protected var.myFarbverlauf
Protected farbemitte.l, farbe_rot.l, farbe_blau.l, farbe_gruen.l, farbe_gelb.l
With myRGBvar
br =\imgbr
hh =\imghh
nr =\imgnr
EndWith
With var.myFarbverlauf
\dc = StartDrawing(ImageOutput(nr))
farbemitte = $707070 ;grau
farbe_rot = #Red
farbe_blau = #Blue
farbe_gruen = $90ff00
farbe_gelb = #Yellow
; p[0] = mittelpunkt des Rechtecks bzw. Spitze des Dreiecks
; p[1] = linker punkt Basis des Dreiecks
; p[2] = rechter punkt Basis des Dreiecks
\tripos[0]\x = br / 2 ;spalte Mittelpunkt bzw. Spitze des Dreiecks
\tripos[0]\y = hh / 2 ;zeile Mittelpunkt
;Dreieck unten
\tripos[1]\x = 0 :\tripos[1]\y = hh ;linker punkt Basis des Dreiecks
\tripos[2]\x = br :\tripos[2]\y = hh ;rechter punkt Basis des Dreiecks
\trifarbe[0] = farbemitte ;Spitze des Dreiecks, bleibt immer gleich
\trifarbe[1] = farbe_rot ;linker punkt Basis des Dreiecks
\trifarbe[2] = farbe_blau ;rechter punkt Basis des Dreiecks
Api_FarbverlaufTriangle(var)
;Dreieck rechts
\tripos[1]\x = br :\tripos[1]\y = hh
\tripos[2]\x = br :\tripos[2]\y = 0
\trifarbe[1] = farbe_blau
\trifarbe[2] = farbe_gruen
Api_FarbverlaufTriangle(var)
;Dreieck oben
\tripos[1]\x = br :\tripos[1]\y = 0
\tripos[2]\x = 0 :\tripos[2]\y = 0
\trifarbe[1] = farbe_gruen
\trifarbe[2] = farbe_gelb
Api_FarbverlaufTriangle(var)
;Dreieck links
\tripos[1]\x = 0 :\tripos[1]\y = 0
\tripos[2]\x = 0 :\tripos[2]\y = hh
\trifarbe[1] = farbe_gelb
\trifarbe[2] = farbe_rot
Api_FarbverlaufTriangle(var)
StopDrawing()
EndWith
EndProcedure
Procedure myImageGadgetProcMakeRgbCursor()
;diese Images werden nicht verändert, darum kann CreateImage(#PB_Any...) hier stehen
;die Farben stehen im direkten Zusammenhang mit den Parametern
;von BitBlt_(..., #SRCPAINT) + BitBlt_(..., #SRCAND) in myImageGadgetProcRGB ()
;werden die Farben vertauscht, müssen auch die Parameter vertauscht werden !
;siehe auch Reihenfolge von Farben und Parameter in den Slide Prozeduren
Shared myRGBvar.myImgGadgetProcStruktur
With myRGBvar
\hdcursor = LoadCursor_(0, #IDC_CROSS)
\imgCursorbr = 18
\imgCursorhh = 18
\imgCursor1nr = CreateImage(#PB_Any,\imgCursorbr,\imgCursorhh)
\imgCursor1id = ImageID(\imgCursor1nr)
StartDrawing(ImageOutput(\imgCursor1nr))
Box(0, 0,\imgCursorbr,\imgCursorhh, #White) ;hier White, bei BitBlt SCRAND benutzen
StopDrawing()
\imgCursor2nr = CreateImage(#PB_Any,\imgCursorbr,\imgCursorhh)
\imgCursor2id = ImageID(\imgCursor2nr)
StartDrawing(ImageOutput(\imgCursor2nr))
Box(0, 0,\imgCursorbr,\imgCursorhh, #Black) ;hier Black, bei BitBlt SCRPAINT benutzen
;Pfeil oder kleines Kreuz
;DrawImage(LoadCursor_(0, #IDC_ARROW),-10,-9) ;
Line(0, 3, 7, 0, #White)
Line(3, 0, 0, 7, #White)
StopDrawing()
EndWith
EndProcedure
Procedure myImageGadgetProcMakeSlide()
Shared mySlidevar.myImgGadgetProcStruktur
Protected br.l, hh.l, nr.l, nrA.l, nrB.l, farbe.l, richtung.l
Protected var.myFarbverlauf
Protected tp1sp.l, tp1ze.l, nrBsp.l, nrBze.l
With mySlidevar
br =\imgbr
hh =\imghh
nr =\imgnr
nrA =\imgnrA
nrB =\imgnrB
farbe =\imgcolor
richtung =\imgHV
EndWith
With var.myFarbverlauf
;richtung
\richtung = richtung ;#GRADIENT_FILL_RECT_V oder #GRADIENT_FILL_RECT_H
If \richtung = #GRADIENT_FILL_RECT_V
tp1sp = br
tp1ze = hh / 2
nrBsp = 0
nrBze = tp1ze
Else
tp1sp = br / 2
tp1ze = hh
nrBsp = tp1sp
nrBze = 0
EndIf
;oben links vom halben Balken
\tripos[0]\x = 0 ;spalte
\tripos[0]\y = 0 ;zeile
;unten rechts vom halben Balken
\tripos[1]\x = tp1sp
\tripos[1]\y = tp1ze
\dc = StartDrawing(ImageOutput(nrA)) ;dieses dc ist für Api_FarbverlaufRect
\trifarbe[0] = $200000 ;oder #Black, Startwert für Schwarz
\trifarbe[1] = farbe
Api_FarbverlaufRect(var)
StopDrawing()
\dc = StartDrawing(ImageOutput(nrB)) ;dieses dc ist für Api_FarbverlaufRect
\trifarbe[0] = farbe
\trifarbe[1] = #White
Api_FarbverlaufRect(var)
StopDrawing()
StartDrawing(ImageOutput(nr))
DrawImage(ImageID(nrA), 0, 0)
DrawImage(ImageID(nrB), nrBsp, nrBze)
StopDrawing()
EndWith
EndProcedure
Procedure myImageGadgetProcMakeSlideCursor()
;diese Images werden nicht verändert, darum kann CreateImage(#PB_Any...) hier stehen
Shared mySlidevar.myImgGadgetProcStruktur
With mySlidevar
\hdcursor = LoadCursor_(0, #IDC_CROSS)
If \imgHV = #GRADIENT_FILL_RECT_V
\imgCursorbr =\imgbr
\imgCursorhh = 9
Else
\imgCursorbr = 9
\imgCursorhh =\imghh
EndIf
\imgCursor1nr = CreateImage(#PB_Any,\imgCursorbr,\imgCursorhh)
\imgCursor1id = ImageID(\imgCursor1nr)
StartDrawing(ImageOutput(\imgCursor1nr))
Box(0, 0,\imgCursorbr,\imgCursorhh, #White) ;hier White, bei BitBlt SCRAND benutzen
StopDrawing()
\imgCursor2nr = CreateImage(#PB_Any,\imgCursorbr,\imgCursorhh)
\imgCursor2id = ImageID(\imgCursor2nr)
StartDrawing(ImageOutput(\imgCursor2nr))
Box(0, 0,\imgCursorbr,\imgCursorhh, #Black) ;hier Black, bei BitBlt SCRPAINT benutzen
If \imgHV = #GRADIENT_FILL_RECT_V ;werden Boxwerte geändert
Box(2, 2,\imgCursorbr - 4, 6, #White) ;ändern sich auch BitBltwerte in myImageGadgetProcSlide
Box(4, 4,\imgCursorbr - 8, 2, #Magenta) ;#red geht auch
Else
Box(2, 2,\imgCursorbr - 4,\imgCursorhh - 4, #White)
Box(4, 4,\imgCursorbr - 8,\imgCursorhh - 8, #Red)
EndIf
StopDrawing()
EndWith
EndProcedure
Procedure myImageGadgetProcMakeDemo()
Shared myDemovar.myImgGadgetProcStruktur
With myDemovar
StartDrawing(ImageOutput(\imgnr))
Box(0, 0,\imgbr,\imghh,\imgcolor)
StopDrawing()
EndWith
EndProcedure
Procedure myImageGadgetProcMakeDemoNew(newcolor)
Shared myDemovar.myImgGadgetProcStruktur
myDemovar\imgcolor = newcolor
myImageGadgetProcMakeDemo()
SetGadgetState(#butnrdemo, ImageID(myDemovar\imgnr))
EndProcedure
Procedure myImageGadgetProcMakeSlideNew(newcolor)
Shared mySlidevar.myImgGadgetProcStruktur
mySlidevar\imgcolor = newcolor
myImageGadgetProcMakeSlide()
SetGadgetState(#butnrslide, ImageID(myslidevar\imgnr))
EndProcedure
Procedure myImageGadgetProcRGB(hWnd, message, wParam, lParam)
;Dank an Danilo + Fluid Byte für die Beispiele als Anregung
;die Werte für curpos + mauspress sind Static durch die Strukturvariable
Shared myRGBvar.myImgGadgetProcStruktur
Protected dc.l, hdkopie.l, hdmemdc1.l, hdmemdc2.l
Protected paint.PAINTSTRUCT, r.rect
With myRGBvar
SetCursor_(\hdcursor)
Select message
Case #WM_PAINT
dc = BeginPaint_(hwnd, paint.PAINTSTRUCT)
hdkopie = CreateCompatibleBitmap_(dc,\imgbr,\imghh)
hdmemdc1 = CreateCompatibleDC_(dc)
SelectObject_(hdmemdc1, hdkopie)
hdmemdc2 = CreateCompatibleDC_(dc)
SelectObject_(hdmemdc2,\imgid)
BitBlt_(hdmemdc1, 0, 0,\imgbr,\imghh, hdmemdc2, 0, 0, #SRCCOPY)
;Farbe holen
\imgColor = GetPixel_(hdmemdc1,\curpos\x,\curpos\y)
;Cursor
SelectObject_(hdmemdc2,\imgCursor1id)
BitBlt_(hdmemdc1,\curpos\x,\curpos\y,\imgCursorbr,\imgCursorhh, hdmemdc2, 0, 0, #SRCAND)
SelectObject_(hdmemdc2,\imgCursor2id)
BitBlt_(hdmemdc1,\curpos\x,\curpos\y,\imgCursorbr,\imgCursorhh, hdmemdc2, 0, 0, #SRCPAINT)
;Bild fertig
BitBlt_(dc, 0, 0,\imgbr,\imghh, hdmemdc1, 0, 0, #SRCCOPY)
DeleteDC_(hdmemdc1)
DeleteDC_(hdmemdc2)
DeleteObject_(hdkopie)
;\imgColor = GetPixel_(dc, \curpos\x-0, \curpos\y-0) ;anstatt 0 eine 1, verschiebt GetPixel
EndPaint_(hwnd, paint)
myImageGadgetProcMakeSlideNew(\imgcolor) ;Farbbalken aktualisieren
Case #WM_LBUTTONDOWN, #WM_MOUSEMOVE
If message = #WM_LBUTTONDOWN :\mauspress = 1 : EndIf
If \mauspress
GetWindowRect_(hwnd, r.rect) ;wo ist Image auf Screen
r\right - 1 : r\bottom - 4 ;damit Cursor nicht ganz verschwindet
ClipCursor_(r) ;sorgt dafür, das Maus im Image bleibt
GetCursorPos_(\curpos) ;wo ist Maus im Screen
ScreenToClient_(hwnd,\curpos) ;umrechnen auf Image
InvalidateRect_(hwnd, 0, 0) ;Image aktualisieren
EndIf
Case #WM_LBUTTONUP
\mauspress = 0
ClipCursor_(0)
EndSelect
ProcedureReturn CallWindowProc_(\lpPrevFunc, hWnd, message, wParam, lParam)
EndWith
EndProcedure
Procedure myImageGadgetProcSlide(hWnd, message, wParam, lParam)
;Dank an Danilo + Fluid Byte für die Beispiele als Anregung
;die Werte für curpos + mauspress sind Static durch die Strukturvariable
;die Cursorwerte für BitBlt(..., SRCINVERT) durch probieren ermittelt
Shared mySlidevar.myImgGadgetProcStruktur
Protected dc.l, hdkopie.l, hdmemdc1.l, hdmemdc2.l
Protected paint.PAINTSTRUCT, r.rect
With mySlidevar
SetCursor_(\hdcursor)
Select message
Case #WM_PAINT
dc = BeginPaint_(hwnd, paint.PAINTSTRUCT)
hdkopie = CreateCompatibleBitmap_(dc,\imgbr,\imghh)
hdmemdc1 = CreateCompatibleDC_(dc)
SelectObject_(hdmemdc1, hdkopie)
hdmemdc2 = CreateCompatibleDC_(dc)
SelectObject_(hdmemdc2,\imgid)
BitBlt_(hdmemdc1, 0, 0,\imgbr,\imghh, hdmemdc2, 0, 0, #SRCCOPY)
;Farbe holen
\imgColor = GetPixel_(dc,\curpos\x,\curpos\y)
;Cursor
SelectObject_(hdmemdc2,\imgCursor1id)
BitBlt_(hdmemdc1,\curpos\x,\curpos\y,\imgCursorbr,\imgCursorhh, hdmemdc2, 0, 0, #SRCAND)
SelectObject_(hdmemdc2,\imgCursor2id)
BitBlt_(hdmemdc1,\curpos\x,\curpos\y,\imgCursorbr,\imgCursorhh, hdmemdc2, 0, 0, #SRCPAINT)
BitBlt_(hdmemdc1,\curpos\x + 4,\curpos\y + 4,\imgCursorbr - 8,\imgCursorhh - 7, hdmemdc2, 4, 4, #SRCINVERT)
;neues Bild zum dc
BitBlt_(dc, 0, 0,\imgbr,\imghh, hdmemdc1, 0, 0, #SRCCOPY)
DeleteDC_(hdmemdc1)
DeleteDC_(hdmemdc2)
DeleteObject_(hdkopie)
EndPaint_(hwnd, paint)
myImageGadgetProcMakeDemoNew(\imgcolor) ;Demofeld aktualisieren
myFarbenTrackBarSet(\imgcolor) ;Trackbars aktualisieren
Case #WM_LBUTTONDOWN, #WM_MOUSEMOVE
If message = #WM_LBUTTONDOWN :\mauspress = 1 : EndIf
If \mauspress
GetWindowRect_(hwnd, r.rect) ;wo ist Image auf Screen
r\right - 4 : r\bottom - 4 ;damit Cursor nicht ganz verschwindet
ClipCursor_(r) ;sorgt dafür, das Maus im Image bleibt
GetCursorPos_(\curpos) ;wo ist Maus im Screen
ScreenToClient_(hwnd,\curpos) ;umrechnen auf Image
InvalidateRect_(hwnd, 0, 0) ;Image aktualisieren
If \imgHV = #GRADIENT_FILL_RECT_V
\curpos\x = 0
Else
\curpos\y = 0
EndIf
EndIf
Case #WM_LBUTTONUP
\mauspress = 0
ClipCursor_(0) ;Maus freigeben von ClipCursor-Bereich
EndSelect
ProcedureReturn CallWindowProc_(\lpPrevFunc, hWnd, message, wParam, lParam)
EndWith
EndProcedure
Procedure myFarbenTrackBarIni()
Shared myTrackvar.myFarbTrackbar
Protected fontid.l, dc.l, zr.l, hh.l, br.l, sp.l, ze1.l, ze2.l, ze3.l, ze4.l
Protected lg.LOGFONT, size.size
fontid = GetStockObject_(#ANSI_FIXED_FONT) ;Systemfont holen
GetObject_(fontid, SizeOf (LOGFONT), lg.LOGFONT) ;Eigenschaften holen
fontid = CreateFontIndirect_(lg) ;Font create
dc = StartDrawing(WindowOutput(#window))
DrawingFont(FontID)
GetTextExtentPoint32_(dc, "", 8, size.size) ;bei FixFont kann man auf Text verzichten
StopDrawing()
With myTrackvar
zr = 1
hh = size\cy + 6 ;20
br = size\cx + 1 ;60
sp =\tracksp
ze1 =\trackze
ze2 = ze1 + hh + zr
ze3 = ze2 + hh + zr
ze4 = ze3 + hh + zr
\tracktxtNrR = TextGadget(#PB_Any, sp, ze1, br, hh, "$00 000", #PB_Text_Center | #PB_Text_Border)
\tracktxtNrG = TextGadget(#PB_Any, sp, ze2, br, hh, "$00 000", #PB_Text_Center | #PB_Text_Border)
\tracktxtNrB = TextGadget(#PB_Any, sp, ze3, br, hh, "$00 000", #PB_Text_Center | #PB_Text_Border)
\tracktxtNrX = TextGadget(#PB_Any, sp, ze4, br, hh, "$000000", #PB_Text_Center | #WS_DLGFRAME | #SS_NOTIFY)
SetGadgetFont(\tracktxtNrR, fontid)
SetGadgetFont(\tracktxtNrG, fontid)
SetGadgetFont(\tracktxtNrB, fontid)
SetGadgetFont(\tracktxtNrX, fontid)
SetGadgetColor(\tracktxtNrR, #PB_Gadget_BackColor, $8080FF)
SetGadgetColor(\tracktxtNrG, #PB_Gadget_BackColor, $74B416)
SetGadgetColor(\tracktxtNrB, #PB_Gadget_BackColor, $E3776F)
SetGadgetColor(\tracktxtNrX, #PB_Gadget_BackColor, #Black)
SetGadgetColor(\tracktxtNrR, #PB_Gadget_FrontColor, #White)
SetGadgetColor(\tracktxtNrG, #PB_Gadget_FrontColor, #White)
SetGadgetColor(\tracktxtNrB, #PB_Gadget_FrontColor, #White)
SetGadgetColor(\tracktxtNrX, #PB_Gadget_FrontColor, #White)
GadgetToolTip(\tracktxtNrX, "Hex-Farbwert zum Clipboard")
sp + br + zr
br =\gesamtbr - sp
ze1 =\trackze
ze2 = ze1 + hh + zr
ze3 = ze2 + hh + zr
ze4 = ze3 + hh + zr
\trackbarNrR = TrackBarGadget(#PB_Any, sp, ze1, br, hh, 0, 255)
\trackbarNrG = TrackBarGadget(#PB_Any, sp, ze2, br, hh, 0, 255)
\trackbarNrB = TrackBarGadget(#PB_Any, sp, ze3, br, hh, 0, 255)
\trackbarNrX = TrackBarGadget(#PB_Any, sp, ze4, br, hh, 0, 64)
EndWith
EndProcedure
Procedure myFarbenTrackBarSet(farbe)
Shared myTrackvar.myFarbTrackbar
With myTrackvar
\wert = farbe
\r = Red(farbe) : SetGadgetState(\trackbarNrR,\r)
\g = Green(farbe) : SetGadgetState(\trackbarNrG,\g)
\b = Blue(farbe) : SetGadgetState(\trackbarNrB,\b)
;r = \r / 8: g = \g / 8: b = \b / 8
;SetGadgetState(\trackbarNrX, r+g+b)
\tracktxt = "$" + RSet(Hex(\r), 2, "0") + " " + RSet(Str(\r), 3, "0")
SetGadgetText(\tracktxtNrR,\tracktxt)
\tracktxt = "$" + RSet(Hex(\g), 2, "0") + " " + RSet(Str(\g), 3, "0")
SetGadgetText(\tracktxtNrG,\tracktxt)
\tracktxt = "$" + RSet(Hex(\b), 2, "0") + " " + RSet(Str(\b), 3, "0")
SetGadgetText(\tracktxtNrB,\tracktxt)
\tracktxt = "$" + RSet(Hex(farbe), 6, "0")
SetGadgetText(\tracktxtNrX,\tracktxt)
EndWith
EndProcedure
Procedure myFarbenTrackBarState(wb)
Static x, xx
Shared myTrackvar.myFarbTrackbar
With myTrackvar
Select wB
Case \tracktxtNrX : SetClipboardText("$" + RSet(Hex(\wert), 6, "0"))
Case \trackbarNrR :\r = GetGadgetState(\trackbarnrR) :\wert = RGB(\r,\g,\b) : myFarbenTrackBarSet(\wert)
Case \trackbarNrG :\g = GetGadgetState(\trackbarnrG) :\wert = RGB(\r,\g,\b) : myFarbenTrackBarSet(\wert)
Case \trackbarNrB :\b = GetGadgetState(\trackbarnrB) :\wert = RGB(\r,\g,\b) : myFarbenTrackBarSet(\wert)
Case \trackbarNrX
If EventwParam() = 1
xx = GetGadgetState(\trackbarnrX)
If xx > x
\r + 8 :\g + 8 :\b + 8
ElseIf xx < x
\r - 8 :\g - 8 :\b - 8
EndIf
x = xx
\wert = RGB(\r,\g,\b)
myFarbenTrackBarSet(\wert)
EndIf
EndSelect
myImageGadgetProcMakeDemoNew(\wert)
EndWith
EndProcedure
Procedure Api_FarbverlaufRect(*var.myFarbverlauf)
;richtung
;#GRADIENT_FILL_RECT_V = 1
;#GRADIENT_FILL_RECT_H = 0
With *var
;UpperLeft = oben links vom Viereck
\trivert[0]\x =\tripos[0]\x
\trivert[0]\y =\tripos[0]\y
\trivert[0]\Red = Red(\trifarbe[0]) << 8
\trivert[0]\Green = Green(\trifarbe[0]) << 8
\trivert[0]\Blue = Blue(\trifarbe[0]) << 8
;LowerRight = unten rechts
\trivert[1]\x =\tripos[1]\x
\trivert[1]\y =\tripos[1]\y
\trivert[1]\Red = Red(\trifarbe[1]) << 8
\trivert[1]\Green = Green(\trifarbe[1]) << 8
\trivert[1]\Blue = Blue(\trifarbe[1]) << 8
\gradrect\UpperLeft = 0 ;an diesen Werten nicht rumspielen
\gradrect\LowerRight = 1 ;sonst Memory Fehler
Gradientfill_(\dc,\trivert, 2,\gradrect, 1,\richtung)
EndWith
EndProcedure
Procedure Api_FarbverlaufTriangle(*var.myFarbverlauf)
With *var
;oben
\trivert[0]\x =\tripos[0]\x
\trivert[0]\y =\tripos[0]\y
\trivert[0]\Red = Red(\trifarbe[0]) << 8
\trivert[0]\Green = Green(\trifarbe[0]) << 8
\trivert[0]\Blue = Blue(\trifarbe[0]) << 8
;links
\trivert[1]\x =\tripos[1]\x
\trivert[1]\y =\tripos[1]\y
\trivert[1]\Red =(Red(\trifarbe[1]) << 8)
\trivert[1]\Green =(Green(\trifarbe[1]) << 8)
\trivert[1]\Blue =(Blue(\trifarbe[1]) << 8)
;rechts
\trivert[2]\x =\tripos[2]\x
\trivert[2]\y =\tripos[2]\y
\trivert[2]\Red =(Red(\trifarbe[2]) << 8)
\trivert[2]\Green =(Green(\trifarbe[2]) << 8)
\trivert[2]\Blue =(Blue(\trifarbe[2]) << 8)
\trirect\Vertex1 = 0 ;nicht rumspielen
\trirect\Vertex2 = 1 ;sonst Memory Fehler
\trirect\Vertex3 = 2
Gradientfill_(\dc,\trivert, 3,\trirect, 1, #GRADIENT_FILL_TRIANGLE)
EndWith
EndProcedure
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
