Drehzahlmesser - wie wird das am elegantesten gelöst??
Das ist so, als ob Du von 10 Menschen, die an einemroherter hat geschrieben:Ich dachte hier geht es darum einen Forumbenutzer bei seinem Problem zu helfen???
Tisch sitzen, verlangen würdest, daß alle über das gleiche Thema reden,
ohne abzuschweifen.
Außerdem ist es doch nicht schlimm, wenn man in einem Thread gleich mehrere Probleme/Fragen behandeln kann.
Dem Fragesteller wurde ja auch schon zur genüge geholfen, denke ich.
..und nichts für ungut, ist nicht böse gemeint
schon ne lösung gefunden?
also, ich würde den anaclox-code von wichtel nehmen ...
dein bild passt du so an, dass es in den hintergrund passt ..
die anaclox.ini datei hat folgenden inhalt:
und dann schaust du dir gut an, wie das ganze funktioniert. das programm eignet sich super zum nachvollziehen und verändern.
du nimmst folgende anpassung vor:
1.) du modifizierst das programm so, dass es nicht mehr die aktuelle zeit nutzt
2.) du schmeisst die beiden zeiger, die du nicht magst, raus
3.) du übergibst, je nach deiner gerade aktuellen U/min, den Wert an die Variable für Deine Uhr
Bsp: Die U/Min 4000 soll auf "2" Uhr oben stehen - so muss die Variable für den Sekundenzeiger den Wert "10" annehmen - ist die U/Min = 0 und die U/Min = 0 soll auf "8 Uhr" stehen, dass musst Du die Variable so belegen, dass sie auf 40 Sekunden steht ...
Viel Spass!
Code: Alles auswählen
; Variablen und Konstanten initialisieren
#version="(c) oppi 2003, V1.70"
#appname="ANACLOX"
#ininame="anaclox.ini"
Global width, height, winx, winy
Global box.l,s, PI2.f, PI.f, xm, ym, radius
Global tickcol.l, seccol.l, mincol.l, hcol.l, backcol.l, boxcol.l, jewcol.l, txtcol.l
Global tid.l, info$, font.l,s.l,os.l
Global flags.l
PI2=ATan(1)*8
PI=ATan(1)*4
Structure xy
xa.l
ya.l
xe.l
ye.l
xb.l
yb.l
xc.l
yc.l
xf.l
yf.l
EndStructure
Dim ticks.xy(60)
Dim secs.xy(60)
Dim mins.xy(60)
Dim hrs.xy(60)
Dim M$(12)
M$(1)="JAN"
M$(2)="FEB"
M$(3)="MAR"
M$(4)="APR"
M$(5)="MAY"
M$(6)="JUN"
M$(7)="JUL"
M$(8)="AUG"
M$(9)="SEP"
M$(10)="OCT"
M$(11)="NOV"
M$(12)="DEZ"
;- GUI Konstanten
#win=0
#clock=0
#set=0
#OnTop=0
#ShowDay=1
#ShowMonth=2
#ShowYear=3
#ShowInfo=4
#setInfo=5
#default=8
#ver=9
#quit=10
#seccol=11
#mincol=12
#hrscol=13
#jewcol=14
#txtcol=15
#backcol=16
#boxcol=17
#tickcol=18
LoadImage(1,"hinter.bmp")
Procedure LoadPrefs(ininame.s)
OpenPreferences(ininame)
info$ =ReadPreferenceString("info",#version)
width =ReadPreferenceLong("width",300)
height =ReadPreferenceLong("height",300)
winx =ReadPreferenceLong("winx",GetSystemMetrics_(#SM_CXSCREEN)/2-width/2)
winy =ReadPreferenceLong("winy",GetSystemMetrics_(#SM_CYSCREEN)/2-height/2)
boxcol =ReadPreferenceLong("boxcol",$FFFFFF)
backcol=ReadPreferenceLong("backcol",$FFFFFF)
tickcol=ReadPreferenceLong("tickcol",$AAAAAA)
jewcol =ReadPreferenceLong("jewcol",$00FFFF)
seccol =ReadPreferenceLong("seccol",$0000FF)
mincol =ReadPreferenceLong("mincol",$00FF00)
hcol =ReadPreferenceLong("hcol",$FF0000)
txtcol =ReadPreferenceLong("txtcol",$111111)
flags =ReadPreferenceLong("flags",1+2+16)
ClosePreferences()
EndProcedure
Procedure savePrefs(ininame.s)
CreatePreferences(ininame)
WritePreferenceString("info",info$)
WritePreferenceLong("width",WindowWidth())
WritePreferenceLong("height",WindowHeight())
WritePreferenceLong("winx",WindowX())
WritePreferenceLong("winy",WindowY())
WritePreferenceLong("boxcol",boxcol)
WritePreferenceLong("backcol",backcol)
WritePreferenceLong("tickcol",tickcol)
WritePreferenceLong("jewcol",jewcol)
WritePreferenceLong("seccol",seccol)
WritePreferenceLong("mincol",mincol)
WritePreferenceLong("hcol",hcol)
WritePreferenceLong("txtcol",txtcol)
WritePreferenceLong("flags",flags)
ClosePreferences()
EndProcedure
Procedure resetPrefs(ininame.s)
CreatePreferences(ininame)
ClosePreferences()
LoadPrefs(ininame)
EndProcedure
Procedure DrawClock()
xm=WindowWidth()/2 : ym=WindowHeight()/2
If ym<xm : radius=ym*0.98 : Else : radius=xm*0.98 : EndIf
font = LoadFont(0, "comic sans ms", radius*0.06)
;- Koordinaten berechnen
a.f=PI2 : t=0
While a >= 0
ticks(t)\xa=Sin(a+PI)*(radius*0.91)+xm
ticks(t)\ya=Cos(a+PI)*(radius*0.91)+ym
ticks(t)\xb=Sin(a+PI+PI/40)*(radius*0.89)+xm
ticks(t)\yb=Cos(a+PI+PI/40)*(radius*0.89)+ym
ticks(t)\xc=Sin(a+PI-PI/40)*(radius*0.89)+xm
ticks(t)\yc=Cos(a+PI-PI/40)*(radius*0.89)+ym
ticks(t)\xf=Sin(a+PI)*(radius*0.89)+xm
ticks(t)\yf=Cos(a+PI)*(radius*0.89)+ym
ticks(t)\xe=Sin(a+PI)*(radius*0.87)+xm
ticks(t)\ye=Cos(a+PI)*(radius*0.87)+ym
secs(t)\xa=Sin(a+PI)*(radius*0.10)+xm
secs(t)\ya=Cos(a+PI)*(radius*0.10)+ym
secs(t)\xe=Sin(a+PI)*(radius*0.84)+xm
secs(t)\ye=Cos(a+PI)*(radius*0.84)+ym
secs(t)\xf=Sin(a+PI)*(radius*0.75)+xm
secs(t)\yf=Cos(a+PI)*(radius*0.75)+ym
mins(t)\xa=Sin(a+PI)*(radius*0.10)+xm
mins(t)\ya=Cos(a+PI)*(radius*0.10)+ym
mins(t)\xb=Sin(a+PI+PI/40)*(radius*0.60)+xm
mins(t)\yb=Cos(a+PI+PI/40)*(radius*0.60)+ym
mins(t)\xc=Sin(a+PI-PI/40)*(radius*0.60)+xm
mins(t)\yc=Cos(a+PI-PI/40)*(radius*0.60)+ym
mins(t)\xf=Sin(a+PI)*(radius*0.60)+xm
mins(t)\yf=Cos(a+PI)*(radius*0.60)+ym
mins(t)\xe=Sin(a+PI)*(radius*0.80)+xm
mins(t)\ye=Cos(a+PI)*(radius*0.80)+ym
hrs(t)\xa=Sin(a+PI)*(radius*0.10)+xm
hrs(t)\ya=Cos(a+PI)*(radius*0.10)+ym
hrs(t)\xb=Sin(a+PI+PI/20)*(radius*0.50)+xm
hrs(t)\yb=Cos(a+PI+PI/20)*(radius*0.50)+ym
hrs(t)\xc=Sin(a+PI-PI/20)*(radius*0.50)+xm
hrs(t)\yc=Cos(a+PI-PI/20)*(radius*0.50)+ym
hrs(t)\xf=Sin(a+PI)*(radius*0.50)+xm
hrs(t)\yf=Cos(a+PI)*(radius*0.50)+ym
hrs(t)\xe=Sin(a+PI)*(radius*0.70)+xm
hrs(t)\ye=Cos(a+PI)*(radius*0.70)+ym
a-PI2/60
t+1
Wend
;- Ziffernblatt
box = CreateImage(0, 2*xm,2*ym)
box = CopyImage(1,0)
StartDrawing(ImageOutput())
; Box(0, 0,2*xm, 2*ym,boxcol)
DrawingMode(4)
Circle(xm,ym,radius,tickcol)
Circle(xm,ym,radius*0.95,backcol)
DrawingMode(0)
Circle(xm,ym,radius*0.09,tickcol)
FillArea(xm+radius-2,ym,backcol,tickcol)
For t=0 To 59
If t=0 Or t=15 Or t=30 Or t=45
LineXY(ticks(t)\xa,ticks(t)\ya,ticks(t)\xb,ticks(t)\yb,tickcol)
LineXY(ticks(t)\xb,ticks(t)\yb,ticks(t)\xe,ticks(t)\ye,tickcol)
LineXY(ticks(t)\xe,ticks(t)\ye,ticks(t)\xc,ticks(t)\yc,tickcol)
LineXY(ticks(t)\xc,ticks(t)\yc,ticks(t)\xa,ticks(t)\ya,tickcol)
FillArea(ticks(t)\xf,ticks(t)\yf,tickcol,jewcol)
ElseIf t=5 Or t=10 Or t=20 Or t=25 Or t=35 Or t=40 Or t=50 Or t=55
Circle(ticks(t)\xf,ticks(t)\yf,radius*0.02,jewcol)
DrawingMode(4)
Circle(ticks(t)\xf,ticks(t)\yf,radius*0.02,tickcol)
DrawingMode(0)
Else
LineXY(ticks(t)\xa,ticks(t)\ya,ticks(t)\xe,ticks(t)\ye,tickcol)
EndIf
Next
StopDrawing()
CopyImage(0,2)
EndProcedure
Procedure tick(value.l)
Repeat
s=Second(Date())
If s<>os
m=Minute(Date())
h=Hour(Date())
If h > 12 : h=h-12 : EndIf
h=h*5+m/12
If h > 60 : h=h-60 : EndIf
d$=""
UseImage(0)
StartDrawing(ImageOutput())
DrawImage(UseImage(2),0,0)
DrawingMode(4)
Circle(xm,ym,radius*0.85,backcol)
Circle(xm,ym,radius*0.09,tickcol)
DrawingMode(1)
If flags&16
FrontColor(Red(txtcol),Green(txtcol),Blue(txtcol))
BackColor(Red(backcol),Green(backcol),Blue(backcol))
DrawingFont(font)
l=TextLength(info$)
Locate(xm-l/2,ym+radius*0.40)
DrawText(info$)
EndIf
If flags&2 : d$=Str(Day(Date())) : EndIf
If flags&2 And flags&4 : d$=" "+d$ : EndIf
If flags&4 : d$=M$( Month(Date() ))+d$ : EndIf
If (flags&2 Or flags&4) And flags&8 : d$+", " : EndIf
If flags&8 : d$+Str(Year(Date())) : EndIf
If d$
DrawingFont(font)
dl=TextLength(d$)
dh=TextLength("Mx")
Box(xm-dl/2*1.5,ym-radius*0.62,dl*1.5,dh*1.5,jewcol)
DrawingMode(4)
Box(xm-dl/2*1.5,ym-radius*0.62,dl*1.5,dh*1.5,tickcol)
DrawingMode(0)
Locate(xm-dl/2,ym-radius*0.60)
FrontColor(Red(txtcol),Green(txtcol),Blue(txtcol))
BackColor(Red(jewcol),Green(jewcol),Blue(jewcol))
DrawText(d$)
EndIf
; ;- neue Zeiger malen
LineXY(mins(m)\xa,mins(m)\ya,mins(m)\xb,mins(m)\yb,mincol)
LineXY(mins(m)\xb,mins(m)\yb,mins(m)\xe,mins(m)\ye,mincol)
LineXY(mins(m)\xe,mins(m)\ye,mins(m)\xc,mins(m)\yc,mincol)
LineXY(mins(m)\xc,mins(m)\yc,mins(m)\xa,mins(m)\ya,mincol)
FillArea(mins(m)\xf,mins(m)\yf,mincol,mincol)
LineXY(hrs(h)\xa,hrs(h)\ya,hrs(h)\xb,hrs(h)\yb,hcol)
LineXY(hrs(h)\xb,hrs(h)\yb,hrs(h)\xe,hrs(h)\ye,hcol)
LineXY(hrs(h)\xe,hrs(h)\ye,hrs(h)\xc,hrs(h)\yc,hcol)
LineXY(hrs(h)\xc,hrs(h)\yc,hrs(h)\xa,hrs(h)\ya,hcol)
FillArea(hrs(h)\xf,hrs(h)\yf,hcol,hcol)
LineXY(secs(s)\xa,secs(s)\ya,secs(s)\xe,secs(s)\ye,seccol)
Circle(secs(s)\xf,secs(s)\yf,radius*0.03,seccol)
StopDrawing()
SetGadgetState(0,box)
;SetGadgetState(0,UseImage(2))
os=s
; Delay(800); ein bischen warten, damit repeat until nicht soviel loopt
EndIf
Delay(1)
ForEver
EndProcedure
Procedure ToggleOnTop()
If GetMenuItemState(#set,#OnTop)
SetWindowPos_(WindowID(),#HWND_TOPMOST,0,0,0,0,#SWP_SHOWWINDOW|#SWP_NOMOVE|#SWP_NOSIZE)
Else
SetWindowPos_(WindowID(),#HWND_NOTOPMOST,0,0,0,0,#SWP_SHOWWINDOW|#SWP_NOMOVE|#SWP_NOSIZE)
EndIf
EndProcedure
;-main
LoadPrefs(#ininame)
box = CreateImage(0, width,height)
CopyImage(1,0)
;-create window
OpenWindow(#win,winx,winy,width,height,#PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget|#PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar,#appname)
CreateGadgetList(WindowID(0))
ImageGadget(#clock,0,0,width,height,box)
CreatePopupMenu(#set)
MenuTitle(#appname+" settings")
MenuItem(#OnTop,"always on top")
SetMenuItemState(#set,#OnTop,flags&1)
ToggleOnTop()
MenuItem(#ShowDay,"show day")
SetMenuItemState(#set,#ShowDay,flags&2)
MenuItem(#ShowMonth,"show month")
SetMenuItemState(#set,#ShowMonth,flags&4)
MenuItem(#ShowYear,"show year")
SetMenuItemState(#set,#ShowYear,flags&8)
MenuItem(#ShowInfo,"show info")
SetMenuItemState(#set,#ShowInfo,flags&16)
OpenSubMenu("change colors")
MenuItem(#seccol,"seconds")
MenuItem(#mincol,"minutes")
MenuItem(#hrscol,"hours")
MenuItem(#jewcol,"jewels")
MenuItem(#txtcol,"text")
MenuItem(#tickcol,"border")
MenuItem(#backcol,"background")
MenuItem(#boxcol,"box")
CloseSubMenu()
MenuItem(#setInfo,"change info")
MenuBar()
MenuItem(#default,"set defaults")
MenuBar()
MenuItem(#quit, "close")
MenuItem(#ver,#version)
DisableMenuItem(#ver,1)
;-draw clock
DrawClock()
tid=CreateThread(@tick(),0)
;SetWindowCallback(@SizeCallback())
;event loop
Repeat
EventID = WaitWindowEvent()
Select EventID
Case #PB_Event_SizeWindow
PauseThread(tid)
winx=WindowX() : winy=WindowY()
height=WindowHeight() : width=WindowWidth()
If height<50 : winy-(50-height) : height=50 : EndIf
If height>600 : height=600 : EndIf
If width>800 : width=800 : EndIf
MoveWindow(winx,winy) : ResizeWindow(width,height)
os=s-1 : DrawClock()
ResumeThread(tid)
Case #WM_SIZE
; PauseThread(tid)
; winx=WindowX() : winy=WindowY()
; height=WindowHeight() : width=WindowWidth()
; If height<50 : winy-(50-height) : height=50 : EndIf
; MoveWindow(winx,winy) : ResizeWindow(width,height)
; os=s-1 : DrawClock()
; ResumeThread(tid)
Case #WM_RButtonDown
popx.l=WindowX()+WindowMouseX()
popy.l=WindowY()+WindowMouseY()
DisplayPopupMenu(0,WindowID(0),popx,popy)
; Case #PB_EventGadget
; GadgetID = EventGadgetID()
; Select GadgetID
;
; EndSelect
Case #PB_EventMenu
MenuID = EventMenuID()
Select MenuID
Case #quit
Case #OnTop
SetMenuItemState(#set,#OnTop,GetMenuItemState(#set,#OnTop)!1)
ToggleOnTop()
flags!1
Case #ShowDay
SetMenuItemState(#set,#ShowDay,GetMenuItemState(#set,#ShowDay)!1)
flags!2
Case #ShowMonth
SetMenuItemState(#set,#ShowMonth,GetMenuItemState(#set,#ShowMonth)!1)
flags!4
Case #ShowYear
SetMenuItemState(#set,#ShowYear,GetMenuItemState(#set,#ShowYear)!1)
flags!8
Case #ShowInfo
SetMenuItemState(#set,#ShowInfo,GetMenuItemState(#set,#ShowInfo)!1)
flags!16
Case #setInfo
Repeat
info$=InputRequester(#appname+" info text edit","your text has: "+Str(Len(info$))+" chars, max. 30 chars are allowed",info$)
Until Len(info$)<30
Case #default
resetPrefs(#ininame)
; setwindowpos_(WindowID(),#HWND_TOP,winx,winy,width,height,#SWP_SHOWWINDOW)
PauseThread(tid)
MoveWindow(winx,winy) : ResizeWindow(width,height)
SetMenuItemState(#set,#OnTop,flags&1)
SetMenuItemState(#set,#ShowDay,flags&2)
SetMenuItemState(#set,#ShowMonth,flags&4)
SetMenuItemState(#set,#ShowYear,flags&8)
SetMenuItemState(#set,#ShowInfo,flags&16)
os=s-1 : DrawClock()
ResumeThread(tid)
ToggleOnTop()
Case #seccol
seccol=ColorRequester()
Case #mincol
mincol=ColorRequester()
Case #hrscol
hcol=ColorRequester()
Case #jewcol
jewcol=ColorRequester()
PauseThread(tid) : os=s-1 : DrawClock() : ResumeThread(tid)
Case #txtcol
txtcol=ColorRequester()
Case #tickcol
tickcol=ColorRequester()
PauseThread(tid) : os=s-1 : DrawClock() : ResumeThread(tid)
Case #backcol
backcol=ColorRequester()
PauseThread(tid) : os=s-1 : DrawClock() : ResumeThread(tid)
Case #boxcol
boxcol=ColorRequester()
PauseThread(tid) : os=s-1 : DrawClock() : ResumeThread(tid)
EndSelect
EndSelect
Until EventID = #PB_EventCloseWindow
savePrefs(#ininame)
CloseWindow(0)
die anaclox.ini datei hat folgenden inhalt:
Code: Alles auswählen
info = www.meineurl.de
width = 500
height = 500
winx = 262
winy = 50
boxcol = 16777215
backcol = 1118481
tickcol = 1118481
jewcol = 65535
seccol = 255
mincol = 16711680
hcol = 16711680
txtcol = 1118481
flags = 26
du nimmst folgende anpassung vor:
1.) du modifizierst das programm so, dass es nicht mehr die aktuelle zeit nutzt
2.) du schmeisst die beiden zeiger, die du nicht magst, raus
3.) du übergibst, je nach deiner gerade aktuellen U/min, den Wert an die Variable für Deine Uhr
Bsp: Die U/Min 4000 soll auf "2" Uhr oben stehen - so muss die Variable für den Sekundenzeiger den Wert "10" annehmen - ist die U/Min = 0 und die U/Min = 0 soll auf "8 Uhr" stehen, dass musst Du die Variable so belegen, dass sie auf 40 Sekunden steht ...
Viel Spass!
ne ...
... die wirklich ganze arbeit und damit das lob gebührt wichtel - ich hab nur die idee dazu beigesteuert, wie du das ganze für dich nutzbar machen kannst - das war 1 minute nachdenken, 1 minute im script-archiv gucken und eine minute hier posten - kein grosser aufwand
viel erfolg beim drehzahlmesser - falls du probleme hast, wie du das angehen sollst, kannst du dich gerne noch mal melden.
aber wie gesagt - der code eignet sich bestens zum spielen und experimentieren ...
viel erfolg beim drehzahlmesser - falls du probleme hast, wie du das angehen sollst, kannst du dich gerne noch mal melden.
aber wie gesagt - der code eignet sich bestens zum spielen und experimentieren ...
