Seite 1 von 1

Analoguhr

Verfasst: 24.12.2011 14:10
von basicer
Und schon wieder ich :)

In meiner neuen Anwendung - mit herzlichstem Dank an DANILO!!! - habe ich rechs oben noch 140 x 140 Pixel Platz. Und irgendwie habe ich mir schon immer eine eigene Anwendung gewünscht wo man rechts oben in der Ecke eine anloge Uhr hat.

Gibt es für PureBasic Code dafür, den ich in mein Programm reinkopieren kann?
Fange gerade an, mich mit PureBasic anzufreunden, selbst bauen wäre mir derzeit zuviel.

Danke euch

Re: Analoguhr

Verfasst: 24.12.2011 14:19
von RSBasic
Hier findest du viele Beispielcodes: http://www.purearea.net/pb/CodeArchiv/German.html
Und in der Kategorie "Clock" findest du einen nützlichen Code von Danilo.
Der Code funktioniert zwar nicht mehr, aber hier der angepasste Code:

Code: Alles auswählen

EnableExplicit

Define EventID

Procedure.f DSin(angle_in_degree.f)
  ; returns Sinus of 'angle in degree
  ProcedureReturn Sin(angle_in_degree*0.01745329)
EndProcedure

Procedure.f DCos(angle_in_degree.f)
  ; returns CoSinus of 'angle in degree
  ProcedureReturn Cos(angle_in_degree*0.01745329)
EndProcedure

Procedure Lin(hDC,x,y,x1,y1,width,Color)
  Protected pen
  Protected hPenOld
  
  pen=CreatePen_(#PS_SOLID,width,Color)  ; You can also change the style with #Ps_dash, #Ps_dot, #Ps_dashdotdot, but only when the pen width equals 1.
  hPenOld=SelectObject_(hDC,pen)
  MoveToEx_(hDC,x,y,0):LineTo_(hDC,x1,y1)
  DeleteObject_(SelectObject_(hDC,hPenOld))
EndProcedure

Procedure UpdateDisplay()
  Protected date   = Date()
  Protected second = Second(date)
  Protected minute = Minute(date)
  Protected sec.f  = (180-second*6)
  Protected min.f  = (180-minute*6);-second/10
  Protected std.f  = (180-Hour(date)*30)-minute/2
  Protected hDC
  
  hDC = StartDrawing(ImageOutput(1))
  If hDC
    Circle(125,125,95,$999999)
    Lin(hDC,125,125,125+DSin(std)*70,125+DCos(std)*70,10,0) ; hours
    Lin(hDC,125,125,125+DSin(min)*80,125+DCos(min)*80, 4,0) ; minutes
    LineXY( 125,125,125+DSin(sec)*90,125+DCos(sec)*90,   0) ; seconds
    StopDrawing()
  EndIf

  SetGadgetState(1,ImageID(1))

EndProcedure


Procedure InitImage()
  Protected img = CreateImage(1,250,250)
  Protected ForeGround
  Protected a
  Protected sin.f
  Protected cos.f
  Protected b
  
  If img = 0
    MessageRequester("ERROR","Cant create image!",#MB_ICONERROR):End
  EndIf

  LoadFont(1,"Arial",14)
  If StartDrawing(ImageOutput(1))
    Box(0,0,250,250,GetSysColor_(#COLOR_BTNFACE))
    Circle(125,125,100,$999999)
    ForeGround = GetSysColor_(#COLOR_BTNTEXT)
    FrontColor(RGB(Red(ForeGround),Green(ForeGround),Blue(ForeGround)))
    DrawingMode(1)
    DrawingFont(FontID(1))
    DrawText(125-TextWidth("12")/2,4,"12")
    DrawText(10,115,"9")
    DrawText(230,115,"3")
    DrawText(125-TextWidth("6")/2,225,"6")
    For a = 0 To 360 Step 6
      sin.f = DSin(a)
      cos.f = DCos(a)
      Plot(125+sin*99,125+cos*99,0)
      If a % 10 = 0
        For b = 2 To 0 Step -1
          Plot(125+sin*(98-b),125+cos*(98-b),0)
        Next b
      EndIf
    Next a
    StopDrawing()
  EndIf

  ProcedureReturn img
EndProcedure

If OpenWindow(0,0,0,500,400,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  ImageGadget(1,10,10,250,250,InitImage())
  
  UpdateDisplay()
  AddWindowTimer(0, 123, 1000)
  
  Repeat
    EventID=WaitWindowEvent()
    If EventID=#PB_Event_Timer And EventTimer() = 123
      UpdateDisplay()
    EndIf  
    If EventID = #PB_Event_CloseWindow
      End
    EndIf
  ForEver
EndIf

Re: Analoguhr

Verfasst: 24.12.2011 17:53
von basicer
Au weia. Da ist es bestimmt nicht damit getan, das irgendwo in mein Programm rein zu kopieren.

Muss ich mal waren, wenn Danilo wieder etwas mehr Zeit hat und mir nochmal hilft :freak: :allright:

Re: Analoguhr

Verfasst: 24.12.2011 18:11
von RSBasic
Eigentlich ist sein Code gut portierbar. Du brauchst nur die folgenden Prozeduren in deinem Code einfügen:
  • DSin()
  • DCos()
  • Lin()
  • UpdateDisplay()
  • InitImage()
Also da, wo deine anderen Prozeduren vorhanden sind, falls du welche hast. Ansonsten einfach vor deinem OpenWindow-Aufruf diese Prozeduren einfügen.
Anschließend fügst du in deiner Gadgetliste die folgende Zeile ein:

Code: Alles auswählen

ImageGadget(1,10,10,250,250,InitImage())
Du musst nur ggf. die Gadgetnummer "1" anpassen oder durch #PB-Any ersetzen. (Bei ImageGadget() und in der Prozedur "UpdateDisplay()").
Und zuletzt fügst du in deiner Event-Schleife den folgenden Code ein:

Code: Alles auswählen

If EventID=#PB_Event_Timer And EventTimer() = 123
  UpdateDisplay()
EndIf  
Die Variable "EventID" musst du ebenfalls umbenennen, falls deine Event-Variable anders bezeichnet wurde.
Falls es für dich dennoch zu schwer ist, dann poste einfach mal deinen derzeitigen Programm-Code oder du wartest halt auf Danilo, der dir hilft.

Re: Analoguhr

Verfasst: 24.12.2011 18:54
von rolaf
basicer hat geschrieben:Au weia. Da ist es bestimmt nicht damit getan, das irgendwo in mein Programm rein zu kopieren.

Muss ich mal waren, wenn Danilo wieder etwas mehr Zeit hat und mir nochmal hilft :freak: :allright:
:freak: Ist zwar Weihnachten heute, aber wie wärs mal mit Kopf einschalten und probieren?

Alles vorgekaut wie ein Großmütterchen hier und dann den Denkapparat nicht mal einschalten... tz tz
RSBasic du bist zu großzügig, so lernt der Jung nix.