Uhrenprogramm

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Armkrie
Beiträge: 17
Registriert: 30.12.2008 04:03

Uhrenprogramm

Beitrag von Armkrie »

Beim letzten Urlaub war in meinem Zimmer keine Uhr :evil: , selber Trage ich auch keine.
So blieb nur das Handy. Ist aber sehr umständlich, weil das Display laufend abschaltet.
Hatte mein Windows Tablet dabei und versuchte dieses zu nutzen.
Eine vernünftige Uhrenanzeige, die auch ohne Brille gut lesbar ist, konnte ich aber nicht finden.
Auch ein fertiges Programm welches meine Ansprüche erfüllte fand ich auf die Schnelle nicht.
Deshalb begann ich ein eigenes Programm zu schreiben. Hier das Ergebnis :allright: .

Weil ich auch in den Foren öfters nach Lösungen sucht und meistens auch finde,
möchte ich auch anderen helfen. Vielleicht können Teile des Programms auch anderen nützlich sein.
Denn nur auf diese Weise funktionieren diese Foren.

Das Programm hat eine Analog- und Digitalanzeige und eine Terminerinnerung.
Diese Anzeigen können beliebig Ein- oder Ausgeschaltet werden.
Die Größe und Position kann geändert werden und wird gespeichert.
Zu den Einstellungen mit der rechten Maustaste auf die Uhr oder das Taskleistensymbol klicken.
Linke Maustaste auf das Taskleistensymbol, Ein- oder Ausblenden.

Die Forenbeiträge von STARGÅTE und PureLust haben mir sehr geholfen, besten Dank hierfür.


Bild Bild Bild

Hier noch die Dateien.
Programm
Icon
Tondatei
EXE (64Bit)

Habe die Dateiverknüpfungen aktualisiert.

Code: Alles auswählen


;**************************************************
;* Programmname:      Uhr.pb                      *
;* Geschrieben von:   Krieger Armin               *
;* Erstellt am:       31.08.2016                  *
;* Letzte Änderung:   07.09.2016                  *
;* Funktion:          Uhr mit Erinnerung anzeigen *
;* PureBasic Version: V5.42                       *
;***************************************************************************************************************************
;* Benötigte Dateien:                                                                                                      *
;*  Uhr.ico  ->  Uhrensymbol für den SysTray (Ich verwende das Icon #266 aus der Datei 'C:\Windows\System32\shell32.dll')  *
;*  Uhr.wav  ->  Tondatei für die Erinnerung (Ich verwende eine Kopie von 'C:\Windows\Media\tada.wav')                     *
;***************************************************************************************************************************
;* Hilfreiche Informationen:                                                                                               *
;*  http://www.purebasic.fr/german/viewtopic.php?f=2&t=19283&hilit=bayerische+uhr&start=10                                 *
;*  http://www.purebasic.fr/english/viewtopic.php?f=12&t=43869                                                             *
;*  Besten Dank hierfür an STARGÅTE und PureLust                                                                           *
;***************************************************************************************************************************************************************************
;* API-Funktionen:                                                                                                                                                         *
;*  GetWindowLongPtr_(WindowID(0), #GWL_EXSTYLE)                                                             ->  Fensterstil ermitteln                                     *
;*  SetWindowLongPtr_(WindowID(0), #GWL_EXSTYLE, STYLE_NEU)                                                  ->  Fensterstil neu setzen                                    *
;*  SetLayeredWindowAttributes_(WindowID(0), TRANSPARENTFARBE, TRANSPARENTWERT, #LWA_ALPHA | #LWA_COLORKEY)  ->  Durchsichtige Farbe festlegen und Transparenz einstellen  *
;*  GetAsyncKeyState_(#VK_LBUTTON)                                                                           ->  Prüfen ob linke Maustaste gedrückt ist                    *
;*  LoadCursor_(0, #IDC_SIZEALL)                                                                             ->  Systemcursor '#IDC_SIZEALL' laden                         *
;*  SetSystemCursor_(CURSOR_NEU, #OCR_NORMAL)                                                                ->  Systemcursor '#OCR_NORMAL' ändern                         *
;*  SystemParametersInfo_(#SPI_SETCURSORS, 0, 0, 0)                                                          ->  Systemcursor zurücksetzen                                 *
;***************************************************************************************************************************************************************************
EnableExplicit

;-* Konstanten *
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  #Durchsichtig     = $006D82
  #Randfarbe        = $E6E6E6
  #Rahmenfarbe      = $D2D2D2
  #HintergrundFarbe = $F5F5F5
  #SchriftFarbe     = $000000
  #AlarmFarbe       = $AAAAAA
  #AlarmFarbeEin    = $00FF00
  #AlarmFarbeAus    = $0000FF
  #InfoTextFarbe    = $FF0000
  #StundenFarbe     = $000000
  #MinutenFarbe     = $808080
  #SekundenFarbe    = $FF0000
  Enumeration                                                                  ;Schriften
    #Schrift1
    #Schrift2
    #Schrift3
    #Schrift4
  EndEnumeration
  Enumeration                                                                  ;Bilder
    #BildBlatt
    #BildZeiger
    #BildIcon
  EndEnumeration
  Enumeration                                                                  ;Gadgets
    #UhrZeiger
    #InfoZeitText
    #InfoZeitWert
    #InfoMeldungText
    #InfoMeldungWert
    #InfoWeiterText
    #InfoWeiterWert
    #InfoSchliessen
    #InfoAendern
  EndEnumeration
  Enumeration                                                                  ;Menü
    #MenueInfoEin
    #MenueInfoText
    #MenuePosition
    #MenueGroesse
    #MenueAnzAnalog
    #MenueAnzDigital
    #MenueAnzInfo
    #MenueRand
    #MenueRahmen
    #MenueHintergrund
    #MenueTransp_0
    #MenueTransp_1
    #MenueTransp_2
    #MenueTransp_3
    #MenueTransp_4
    #MenueTransp_5
    #MenueTransp_6
    #MenueTransp_7
    #MenueTransp_8
    #MenueTransp_9
    #MenueVordergrund
    #MenueAnklickbar
    #MenueAusblenden
    #MenueBeenden
  EndEnumeration
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

;-* Globale Variablen anlegen *
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  OpenPreferences(GetCurrentDirectory() + "Uhr.ini")
    PreferenceGroup("Abmessungen")
      Global WinPosX.i            = ReadPreferenceLong  ("WinPosX"           , 10)
      Global WinPosY.i            = ReadPreferenceLong  ("WinPosY"           , 10)
      Global WinBreit.i           = ReadPreferenceLong  ("WinBreit"          , 300)
      Global WinHoch.i            = ReadPreferenceLong  ("WinHoch"           , 460)
    PreferenceGroup("Info")
      Global InfoStatus.i         = ReadPreferenceLong  ("InfoStatus"        , 0)
      Global InfoZeit.s           = ReadPreferenceString("InfoZeit"          , "12:00")
      Global InfoText.s           = ReadPreferenceString("InfoText"          , "-")
    PreferenceGroup("Ansicht")
      Global AnzeigeAnalog.i      = ReadPreferenceLong  ("AnzeigeAnalog"     , #True)
      Global AnzeigeDigital.i     = ReadPreferenceLong  ("AnzeigeDigital"    , #True)
      Global AnzeigeInfo.i        = ReadPreferenceLong  ("AnzeigeInfo"       , #True)
      Global AnzeigeRand.i        = ReadPreferenceLong  ("AnzeigeRand"       , #True)
      Global AnzeigeRahmen.i      = ReadPreferenceLong  ("AnzeigeRahmen"     , #True)
      Global AnzeigeHintergrund.i = ReadPreferenceLong  ("AnzeigeHintergrund", #True)
      Global AnzeigeTransparent.i = ReadPreferenceLong  ("AnzeigeTransparent", #False)
    PreferenceGroup("Verhalten")
      Global Dauerhaft.i          = ReadPreferenceLong  ("Dauerhaft"         , #True)
      Global Anklickbar.i         = ReadPreferenceLong  ("Anklickbar"        , #True)
      Global Minimieren.i         = ReadPreferenceLong  ("Minimieren"        , #False)
  ClosePreferences()
  Global ZeichenBreite.i, SchriftGroesse.i, MausStatus.i, Verschieben.i
  Global UhrX.i, UhrY.i, UhrR.i, ZeitX.i, ZeitY.i
  Global Schrift1.i, Schrift2.i, Schrift3.i, Schrift4.i
  Global AktZeit.i = Date(), SoundStatus.i, SoundAktiv.i
  Global FarbeRand        = #Randfarbe
  Global FarbeRahmen      = #Rahmenfarbe
  Global FarbeHintergrund = #HintergrundFarbe
  If AnzeigeRand        = #False : FarbeRand        = #Durchsichtig : EndIf
  If AnzeigeRahmen      = #False : FarbeRahmen      = #Durchsichtig : EndIf
  If AnzeigeHintergrund = #False : FarbeHintergrund = #Durchsichtig : EndIf
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

;Einstellungen speichern
Procedure EinstellungenSpeichern()
  CreatePreferences(GetCurrentDirectory() + "Uhr.ini")
    PreferenceGroup("Abmessungen")
      WritePreferenceLong  ("WinPosX"           , WinPosX)
      WritePreferenceLong  ("WinPosY"           , WinPosY)
      WritePreferenceLong  ("WinBreit"          , WinBreit)
      WritePreferenceLong  ("WinHoch"           , WinHoch)
    PreferenceGroup("Info")
      WritePreferenceLong  ("InfoStatus"        , InfoStatus)
      WritePreferenceString("InfoZeit"          , InfoZeit)
      WritePreferenceString("InfoText"          , InfoText)
    PreferenceGroup("Ansicht")
      WritePreferenceLong  ("AnzeigeAnalog"     , AnzeigeAnalog)
      WritePreferenceLong  ("AnzeigeDigital"    , AnzeigeDigital)
      WritePreferenceLong  ("AnzeigeInfo"       , AnzeigeInfo)
      WritePreferenceLong  ("AnzeigeRand"       , AnzeigeRand)
      WritePreferenceLong  ("AnzeigeRahmen"     , AnzeigeRahmen)
      WritePreferenceLong  ("AnzeigeHintergrund", AnzeigeHintergrund)
      WritePreferenceLong  ("AnzeigeTransparent", AnzeigeTransparent)
    PreferenceGroup("Verhalten")
      WritePreferenceLong  ("Dauerhaft"         , Dauerhaft)
      WritePreferenceLong  ("Anklickbar"        , Anklickbar)
      WritePreferenceLong  ("Minimieren"        , Minimieren)
  ClosePreferences()
EndProcedure

;Unschärfe entfernen
Procedure Unschaerfe(XVon.i, XBis.i, YVon.i, YBis.i, FarbeOK.i, FarbeSetzen.i)
  Protected X.i, Y.i

  For X = XVon To XBis
    For Y = YVon To YBis
      If Point(X, Y) <> FarbeOK
        Plot(X, Y, FarbeSetzen)
      EndIf
    Next Y
  Next X
EndProcedure

;Bild erstellen und Schriftgroesse ermitteln
Procedure.i Schriftgroesse(Breit.i, Hoch.i, ZBreite.i)
  Protected ID.i, Groesse.i = 4, Breite.i

  If IsImage(#BildBlatt) : FreeImage(#BildBlatt) : EndIf
  If CreateImage(#BildBlatt, Breit, Hoch, 24, #Durchsichtig)
    Repeat
      ID = LoadFont(#PB_Any, "Arial", Groesse, #PB_Font_Bold)
      If StartDrawing(ImageOutput(#BildBlatt))
        DrawingFont(FontID(ID))
        Breite = TextWidth("00:00:00")
        StopDrawing()
      Else
        MessageRequester("Fehler - 'Schriftgroesse ermitteln'", "  Das Bild kann zum Bearbeiten nicht geöffnet werden.    ", 16)
        End
      EndIf
      FreeFont(ID)

      If Breite > ZBreite
        Groesse - 1
        Break
      Else
        Groesse + 1
        If Groesse > 500 : Break : EndIf
      EndIf
    ForEver
  EndIf

  If IsImage(#BildZeiger) : FreeImage(#BildZeiger) : EndIf
  CreateImage(#BildZeiger, Breit, Hoch, 24, #Durchsichtig)
  ProcedureReturn Groesse
EndProcedure

;Grundbild Uhr Zeichnen
Procedure UhrGrundBild(Breit.i, Hoch.i)
  Protected SchriftBreite.i, SchriftHoehe.i, Winkel.i, Radius.i, PosX.i, PosY.i, Text.i
  Protected AlarmX.i, AlarmY.i, AlarmA.i, AlarmS.i, Korrektur.i, X.i, Y.i

  If StartDrawing(ImageOutput(#BildBlatt))
    DrawingMode(#PB_2DDrawing_Transparent)
    FrontColor(#SchriftFarbe)
    DrawingFont(Schrift1)
    SchriftBreite = TextWidth("00:00:00")
    SchriftHoehe  = TextHeight("00:00:00")
    RoundBox(0, 0, Breit     , Hoch     , 20, 20, FarbeRand)
    RoundBox(4, 4, Breit -  8, Hoch -  8, 18, 18, FarbeRahmen)
    RoundBox(8, 8, Breit - 16, Hoch - 16, 16, 16, FarbeHintergrund)

    If AnzeigeInfo = #True
      AlarmX = Int((Breit - SchriftBreite) / 2)
      AlarmY = Hoch - SchriftHoehe - 10
      DrawingFont(Schrift1)
      If (AnzeigeAnalog = #True) Or (AnzeigeDigital = #True)
        Box(8, AlarmY - 6, Breit - 16, 4 , FarbeRahmen)
      EndIf
      DrawText  (AlarmX, AlarmY, InfoZeit, #AlarmFarbe, FarbeHintergrund)
      Unschaerfe(AlarmX, AlarmX + TextWidth(InfoZeit), AlarmY, AlarmY + TextHeight(InfoZeit), FarbeHintergrund, #AlarmFarbe)
      AlarmA = AlarmX + TextWidth("12:00:")
      DrawingFont(Schrift2)
      AlarmS = AlarmY + TextHeight("12:00:")
      DrawText  (AlarmA, AlarmY, "Info", #AlarmFarbe, FarbeHintergrund)
      Unschaerfe(AlarmA, AlarmA + TextWidth("Info"), AlarmY, AlarmY + TextHeight("Info"), FarbeHintergrund, #AlarmFarbe)
      If InfoStatus = #False
        DrawText  (AlarmA, AlarmS, "Aus  ", #AlarmFarbeAus, FarbeHintergrund)
        Unschaerfe(AlarmA, AlarmA + TextWidth("Aus  "), AlarmS, AlarmS + TextHeight("Aus  "), FarbeHintergrund, #AlarmFarbeAus)
      Else
        DrawText  (AlarmA, AlarmS, "Ein  ", #AlarmFarbeEin, FarbeHintergrund)
        Unschaerfe(AlarmA, AlarmA + TextWidth("Ein  "), AlarmS, AlarmS + TextHeight("Ein  "), FarbeHintergrund, #AlarmFarbeEin)
      EndIf
    EndIf

    If AnzeigeDigital = #True
      ZeitX = Int((Breit - SchriftBreite) / 2)
      ZeitY = Hoch - SchriftHoehe - 10
      If AnzeigeInfo = #True : ZeitY - SchriftHoehe - 8 : EndIf
      If AnzeigeAnalog = #True
        Box(8, ZeitY - 6, Breit - 16, 4, FarbeRahmen)
      EndIf
    EndIf

    If AnzeigeAnalog = #True
      UhrX = Int(Breit / 2)
      UhrY = Int(Hoch / 2)
      Korrektur = 0
      If AnzeigeInfo    = #True : Korrektur + SchriftHoehe + 8 : EndIf
      If AnzeigeDigital = #True : Korrektur + SchriftHoehe + 8 : EndIf
      If Korrektur <> 0     : UhrY - Int(Korrektur / 2)    : EndIf
      If UhrX < UhrY
        UhrR = UhrX - 20
      Else
        UhrR = UhrY - 20
      EndIf

      DrawingFont(Schrift3)
      Radius = Int(UhrR * 0.94)                                                ;1 Minuten Punkte
      For Winkel = -84 To 270 Step 6
        PosX = Radius * Cos(Winkel * #PI / 180) + UhrX
        PosY = Radius * Sin(Winkel * #PI / 180) + UhrY
        Circle(PosX, PosY, Int(UhrR * 0.02), #SchriftFarbe)
      Next
      For Winkel = -60 To 270 Step 30                                          ;15 Minuten Striche
        For Radius = Int(UhrR * 0.90) To Int(UhrR * 0.98)
          PosX = Radius * Cos(Winkel * #PI / 180) + UhrX
          PosY = Radius * Sin(Winkel * #PI / 180) + UhrY
          Circle(PosX, PosY, Int(UhrR * 0.02), #SchriftFarbe)
        Next
        Radius = Int(UhrR * 0.75)                                              ;15 Minuten Beschriftung
        PosX = Radius * Cos(Winkel * #PI / 180) + UhrX
        PosY = Radius * Sin(Winkel * #PI / 180) + UhrY
        Text + 1
        X = PosX - (TextWidth(Str(Text)) / 2)
        Y = PosY - (TextHeight(Str(Text)) / 2)
        DrawText(X, Y, Str(Text), #SchriftFarbe, FarbeHintergrund)
        Unschaerfe(X, X + TextWidth(Str(Text)), Y, Y + TextHeight(Str(Text)), FarbeHintergrund, #SchriftFarbe)
      Next
    EndIf

    StopDrawing()
  Else
    MessageRequester("Fehler - 'Grundbild Uhr Zeichnen'", "  Das Bild kann zum Bearbeiten nicht geöffnet werden.    ", 16)
    End
  EndIf
EndProcedure

;Zeitanzeige Erneuern
Procedure Zeitanzeige(ZeitWert.i)
  Protected Radius.i, Laenge.i, PosZ.f, PosX.i, PosY.i

  If StartDrawing(ImageOutput(#BildZeiger))
    DrawingMode(#PB_2DDrawing_Transparent)
    FrontColor(#SchriftFarbe)
    DrawingFont(Schrift1)
    DrawImage(ImageID(#BildBlatt),0 ,0)

    If AnzeigeDigital = #True
      DrawText(ZeitX, ZeitY, FormatDate("%hh:%ii:%ss", ZeitWert), #SchriftFarbe, FarbeHintergrund)
      Unschaerfe(ZeitX, ZeitX + TextWidth("00:00:00"), ZeitY, ZeitY + TextHeight("00:00:00"), FarbeHintergrund, #SchriftFarbe)
    EndIf

    If AnzeigeAnalog = #True
      Radius = Int(UhrR * 0.06)                                                ;Stundenzeiger
      For Laenge = 0 To Int(UhrR * 0.50)
        PosZ = Hour(ZeitWert) * 5 + Minute(ZeitWert) / 60 * 5
        PosX = Sin(PosZ / 30 * #PI) * Laenge + UhrX
        PosY = -Cos(PosZ / 30 * #PI) * Laenge + UhrY
        Circle(PosX, PosY, Radius, #StundenFarbe)
      Next
      Radius = Int(UhrR * 0.04)                                                ;Minutenzeiger
      For Laenge = 0 To Int(UhrR * 0.75)
        PosZ = Minute(ZeitWert)
        PosX = Sin(PosZ / 30 * #PI) * Laenge + UhrX
        PosY = -Cos(PosZ / 30 * #PI) * Laenge + UhrY
        Circle(PosX, PosY, Radius, #MinutenFarbe)
      Next
      Radius = Int(UhrR * 0.01)                                                ;Sekundenzeiger
      For Laenge = Int(0 - (UhrR * 0.15)) To Int(UhrR * 0.90)
        PosZ = Second(ZeitWert)
        PosX = Sin(PosZ / 30 * #PI) * Laenge + UhrX
        PosY = -Cos(PosZ / 30 * #PI) * Laenge + UhrY
        Circle(PosX, PosY, Radius, #SekundenFarbe)
      Next
    EndIf

    StopDrawing()
  Else
    MessageRequester("Fehler - 'Zeitanzeige Erneuern'", "  Das Bild kann zum Bearbeiten nicht geöffnet werden.    ", 16)
    End
  EndIf
EndProcedure

;Grundeinstellung
Procedure Grundeinstellung()
  ZeichenBreite  = WinBreit - 52
  SchriftGroesse = Schriftgroesse (WinBreit, WinHoch, ZeichenBreite)
  Schrift1       = LoadFont(#Schrift1, "Arial", SchriftGroesse, #PB_Font_Bold)
  Schrift2       = LoadFont(#Schrift2, "Arial", Int(SchriftGroesse / 2))
  Schrift3       = LoadFont(#Schrift3, "Arial", Int(SchriftGroesse / 3))
  Schrift4       = LoadFont(#Schrift4, "Arial", 30, #PB_Font_Bold)
  UhrGrundBild(WinBreit, WinHoch)
  Zeitanzeige(AktZeit)
EndProcedure

;-* Programmstart *
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  SoundStatus    = InitSound()
  If SoundStatus <> #False
    SoundStatus  = CatchSound(0, ?Tondatei)
  EndIf
  Grundeinstellung()
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

;* Hauptfenster mit Eingabeschleife *
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  Define i.i, Wert.i, Event.i
  Define AltMausX.i, AltMausY.i, NeuMausX.i, NeuMausY.i, BewegungX.i, BewegungY.i
  Define WinVonX.i, WinBisX.i, WinVonY.i, WinBisY.i

  If OpenWindow(0, WinPosX, WinPosY, WinBreit, WinHoch, "Uhr v1.0", #PB_Window_BorderLess)
    SetWindowColor(0, #Durchsichtig)
    HideWindow(0, #True)
    For i = 0 To 9
      If ((AnzeigeTransparent >> i) & 1) = #True
        Wert = i * 10
        Break
      EndIf
    Next i
    SetWindowLongPtr_(WindowID(0), #GWL_EXSTYLE, GetWindowLongPtr_(WindowID(0), #GWL_EXSTYLE) | #WS_EX_LAYERED | #WS_EX_TOOLWINDOW)
    SetLayeredWindowAttributes_(WindowID(0), #Durchsichtig, 255 * (100 - Wert) / 100, #LWA_ALPHA | #LWA_COLORKEY)
    HideWindow(0, #False)
    ImageGadget(#UhrZeiger, 0, 0, WinBreit, WinHoch, ImageID(#BildZeiger))
    StickyWindow(0, Dauerhaft)
    HideWindow(0, Minimieren)
    AddSysTrayIcon(0, WindowID(0), CatchImage(#BildIcon, ?Icon))

    If CreatePopupMenu(0)                                                      ;Popup-Menü erstellen
      MenuItem(#MenueInfoEin    , "Info Ein/Aus")
      MenuItem(#MenueInfoText   , "Info ändern")
      MenuBar()
      MenuItem(#MenuePosition   , "Position ändern")
      MenuItem(#MenueGroesse    , "Größe ändern")
      MenuBar()
      MenuItem(#MenueAnzAnalog  , "Analoganzeige")
      MenuItem(#MenueAnzDigital , "Digitalanzeige")
      MenuItem(#MenueAnzInfo    , "Infoanzeige")
      MenuBar()
      MenuItem(#MenueRand       , "Rand anzeigen")
      MenuItem(#MenueRahmen     , "Rahmen anzeigen")
      MenuItem(#MenueHintergrund, "Hintergrund anzeigen")
      MenuBar()
      OpenSubMenu("Transparent anzeigen")
        MenuItem(#MenueTransp_0, "Transparenz Aus")
        MenuItem(#MenueTransp_1, "Transparenz 10%")
        MenuItem(#MenueTransp_2, "Transparenz 20%")
        MenuItem(#MenueTransp_3, "Transparenz 30%")
        MenuItem(#MenueTransp_4, "Transparenz 40%")
        MenuItem(#MenueTransp_5, "Transparenz 50%")
        MenuItem(#MenueTransp_6, "Transparenz 60%")
        MenuItem(#MenueTransp_7, "Transparenz 70%")
        MenuItem(#MenueTransp_8, "Transparenz 80%")
        MenuItem(#MenueTransp_9, "Transparenz 90%")
      CloseSubMenu()
      MenuBar()
      MenuItem(#MenueVordergrund, "Im Vordergrund")
      MenuItem(#MenueAnklickbar , "Anklickbar")
      MenuItem(#MenueAusblenden , "Ausblenden")
      MenuBar()
      MenuItem(#MenueBeenden    , "Beenden")

      SetMenuItemState(0, #MenueInfoEin    , InfoStatus)                       ;Popup-Menü Grundeinstellung
      SetMenuItemState(0, #MenueAnzAnalog  , AnzeigeAnalog)
      SetMenuItemState(0, #MenueAnzDigital , AnzeigeDigital)
      SetMenuItemState(0, #MenueAnzInfo    , AnzeigeInfo)
      SetMenuItemState(0, #MenueRand       , AnzeigeRand)
      SetMenuItemState(0, #MenueRahmen     , AnzeigeRahmen)
      SetMenuItemState(0, #MenueHintergrund, AnzeigeHintergrund)
      SetMenuItemState(0, #MenueTransp_0   , Bool((AnzeigeTransparent >> 0) & 1))
      SetMenuItemState(0, #MenueTransp_1   , Bool((AnzeigeTransparent >> 1) & 1))
      SetMenuItemState(0, #MenueTransp_2   , Bool((AnzeigeTransparent >> 2) & 1))
      SetMenuItemState(0, #MenueTransp_3   , Bool((AnzeigeTransparent >> 3) & 1))
      SetMenuItemState(0, #MenueTransp_4   , Bool((AnzeigeTransparent >> 4) & 1))
      SetMenuItemState(0, #MenueTransp_5   , Bool((AnzeigeTransparent >> 5) & 1))
      SetMenuItemState(0, #MenueTransp_6   , Bool((AnzeigeTransparent >> 6) & 1))
      SetMenuItemState(0, #MenueTransp_7   , Bool((AnzeigeTransparent >> 7) & 1))
      SetMenuItemState(0, #MenueTransp_8   , Bool((AnzeigeTransparent >> 8) & 1))
      SetMenuItemState(0, #MenueTransp_9   , Bool((AnzeigeTransparent >> 9) & 1))
      SetMenuItemState(0, #MenueVordergrund, Dauerhaft)
      SetMenuItemState(0, #MenueAnklickbar , Anklickbar)
      SetMenuItemState(0, #MenueAusblenden , Minimieren)
    EndIf

    Repeat
      Event = WaitWindowEvent(100)

      If AktZeit <> Date()                                                     ;Zeitanzeige aktualisieren
        AktZeit = Date()
        Zeitanzeige(AktZeit)
        SetGadgetState(#UhrZeiger, ImageID(#BildZeiger))
      EndIf

      If InfoStatus = #True                                                    ;Info anzeigen
        If InfoZeit = FormatDate("%hh:%ii", AktZeit)
          InfoStatus = #False
          If OpenWindow(1, 0, 0, 965, 370, "Information anzeigen", #PB_Window_Tool | #PB_Window_ScreenCentered, 0)
            SetGadgetFont(#PB_Default, Schrift4)
            TextGadget    (#InfoZeitText   ,  10,  10, 240,  58, "Zeit:")
            TextGadget    (#InfoZeitWert   , 250,  10, 200,  58, InfoZeit)
            SetGadgetColor(#InfoZeitWert   , #PB_Gadget_FrontColor, #InfoTextFarbe)
            TextGadget    (#InfoMeldungText,  10,  75, 240,  58, "Text:")
            TextGadget    (#InfoMeldungWert, 250,  75, 700, 108, InfoText)
            SetGadgetColor(#InfoMeldungWert, #PB_Gadget_FrontColor, #InfoTextFarbe)
            TextGadget    (#InfoWeiterText ,  10, 190, 240,  58, "Fortfahren:")
            ComboBoxGadget(#InfoWeiterWert , 250, 190, 700,  58)
            AddGadgetItem (#InfoWeiterWert ,   0, "Keine Wiederholung, Info beenden")
            AddGadgetItem (#InfoWeiterWert ,   1, "In 5 Minuten wiederholen")
            AddGadgetItem (#InfoWeiterWert ,   2, "In 10 Minuten wiederholen")
            AddGadgetItem (#InfoWeiterWert ,   3, "In 15 Minuten wiederholen")
            AddGadgetItem (#InfoWeiterWert ,   4, "In 30 Minuten wiederholen")
            SetGadgetState(#InfoWeiterWert ,   0)
            ButtonGadget  (#InfoSchliessen , 300, 290, 365,  70, "Übernehmen")
            StickyWindow(1, #True)
            SoundAktiv = #True
          EndIf
        EndIf
      EndIf

      If (SoundAktiv > #False) And (SoundStatus <> #False)                     ;Infoton abspielen
        If Mod(Second(AktZeit), 30) = 0
          If SoundAktiv = #True
            PlaySound(0, #PB_Sound_MultiChannel, 80)
            SoundAktiv = 2
          EndIf
        Else
          SoundAktiv = #True
        EndIf
      EndIf

      If Verschieben <> #False                                                 ;Fenster verschieben oder Größe ändern
        AltMausX  = NeuMausX
        AltMausY  = NeuMausY
        NeuMausX  = DesktopMouseX()
        NeuMausY  = DesktopMouseY()
        BewegungX = AltMausX - NeuMausX
        BewegungY = AltMausY - NeuMausY
        WinVonX   = WindowX(0)
        WinBisX   = WinVonX + WindowWidth(0)
        WinVonY   = WindowY(0)
        WinBisY   = WinVonY + WindowHeight(0)

        If GetAsyncKeyState_(#VK_LBUTTON)                                      ;Linke Maustaste drücken
          If (NeuMausX > WinVonX) And (NeuMausX < WinBisX) And (NeuMausY > WinVonY) And (NeuMausY < WinBisY)
            MausStatus + 1
            If Verschieben = #True                                             ;Fenster verschieben
              ResizeWindow(0, WinVonX - BewegungX, WinVonY - BewegungY, #PB_Ignore, #PB_Ignore)
            Else                                                               ;Fenster Größe ändern
              WinBreit = WindowWidth(0)  - BewegungX
              WinHoch  = WindowHeight(0) - BewegungY
              ResizeWindow(0, #PB_Ignore, #PB_Ignore, WinBreit, WinHoch)
              Grundeinstellung()
            EndIf
          EndIf
        Else                                                                   ;Linke Maustaste loslassen
          If MausStatus > 3
            MausStatus = #False
            Verschieben = #False
            SystemParametersInfo_(#SPI_SETCURSORS, 0, 0, 0)
            WinPosX  = WindowX(0)
            WinPosY  = WindowY(0)
            WinBreit = WindowWidth(0)
            WinHoch  = WindowHeight(0)
            EinstellungenSpeichern()
            ResizeWindow(0, WinPosX, WinPosY, WinBreit, WinHoch)
            Grundeinstellung()
          EndIf
        EndIf
      Else                                                                     ;Standardabfragen
        Select Event
          Case #PB_Event_Gadget
            Select EventGadget()
              Case #UhrZeiger                                                  ;Popup-Menü anzeigen
                If EventType() = #PB_EventType_RightClick
                  DisplayPopupMenu(0, WindowID(0))
                EndIf

              Case #InfoSchliessen                                             ;Info Anzeige wurde geschlossen
                Select GetGadgetState(#InfoWeiterWert)
                  Case 1 : InfoStatus = #True : InfoZeit = FormatDate("%hh:%ii", AddDate(AktZeit, #PB_Date_Minute, 5))
                  Case 2 : InfoStatus = #True : InfoZeit = FormatDate("%hh:%ii", AddDate(AktZeit, #PB_Date_Minute, 10))
                  Case 3 : InfoStatus = #True : InfoZeit = FormatDate("%hh:%ii", AddDate(AktZeit, #PB_Date_Minute, 15))
                  Case 4 : InfoStatus = #True : InfoZeit = FormatDate("%hh:%ii", AddDate(AktZeit, #PB_Date_Minute, 30))
                EndSelect
                CloseWindow(1)
                SoundAktiv = #False
                SetMenuItemState(0, #MenueInfoEin, InfoStatus)
                EinstellungenSpeichern()
                Grundeinstellung()

              Case #InfoAendern                                                ;Info Änderung wurde geschlossen
                InfoStatus = #True
                InfoZeit   = GetGadgetText(#InfoZeitWert)
                InfoText   = GetGadgetText(#InfoMeldungWert)
                InfoText   = ReplaceString(InfoText, #CRLF$, ", ")
                CloseWindow(1)
                SetMenuItemState(0, #MenueInfoEin, InfoStatus)
                EinstellungenSpeichern()
                Grundeinstellung()

            EndSelect

          Case #PB_Event_Menu
            Select EventMenu()
              Case #MenueBeenden                                               ;Programm schliessen
                Break

              Case #MenueInfoEin                                               ;Info Ein/Aus
                InfoStatus = Bool(Not InfoStatus)
                SetMenuItemState(0, #MenueInfoEin, InfoStatus)
                EinstellungenSpeichern()
                Grundeinstellung()

              Case #MenueInfoText                                              ;Info Text ändern
                If OpenWindow(1, 0, 0, 835, 305, "Information ändern", #PB_Window_Tool | #PB_Window_ScreenCentered, 0)
                  SetGadgetFont(#PB_Default, Schrift4)
                  TextGadget    (#InfoZeitText    ,  10,  10, 110,  58, "Zeit:")
                  DateGadget    (#InfoZeitWert    , 120, 10, 200, 58, "%hh:%ii", ParseDate("%hh:%ii", InfoZeit), #PB_Date_UpDown)
                  SetGadgetColor(#InfoZeitWert    , #PB_Gadget_FrontColor, #InfoTextFarbe)
                  TextGadget    (#InfoMeldungText ,  10,  75, 110,  58, "Text:")
                  EditorGadget  (#InfoMeldungWert , 120,  75, 700, 108, #PB_Editor_WordWrap)
                  SetGadgetText (#InfoMeldungWert , InfoText)
                  SetGadgetColor(#InfoMeldungWert , #PB_Gadget_FrontColor, #InfoTextFarbe)
                  ButtonGadget  (#InfoAendern     , 235, 225, 365,  70, "Übernehmen")
                  StickyWindow(1, #True)
                EndIf

              Case #MenuePosition                                              ;Fenster Position ändern
                Verschieben = #True
                NeuMausX = DesktopMouseX()
                NeuMausY = DesktopMouseY()
                SetSystemCursor_(LoadCursor_(0, #IDC_SIZEALL), #OCR_NORMAL)

              Case #MenueGroesse                                               ;Fenster Größe ändern
                Verschieben = 2
                NeuMausX = DesktopMouseX()
                NeuMausY = DesktopMouseY()
                SetSystemCursor_(LoadCursor_(0, #IDC_SIZEALL), #OCR_NORMAL)

              Case #MenueAnzAnalog                                             ;Analoganzeige Ein/Aus
                AnzeigeAnalog = Bool(Not AnzeigeAnalog)
                SetMenuItemState(0, #MenueAnzAnalog, AnzeigeAnalog)
                EinstellungenSpeichern()
                Grundeinstellung()

              Case #MenueAnzDigital                                            ;Digitalanzeige Ein/Aus
                AnzeigeDigital = Bool(Not AnzeigeDigital)
                SetMenuItemState(0, #MenueAnzDigital, AnzeigeDigital)
                EinstellungenSpeichern()
                Grundeinstellung()

              Case #MenueAnzInfo                                               ;Infoanzeige Ein/Aus
                AnzeigeInfo = Bool(Not AnzeigeInfo)
                SetMenuItemState(0, #MenueAnzInfo, AnzeigeInfo)
                EinstellungenSpeichern()
                Grundeinstellung()

              Case #MenueRand                                                  ;Rand durchsichtig Ein/Aus
                AnzeigeRand = Bool(Not AnzeigeRand)
                SetMenuItemState(0, #MenueRand, AnzeigeRand)
                EinstellungenSpeichern()
                If AnzeigeRand = #False
                  FarbeRand = #Durchsichtig
                Else
                  FarbeRand = #Randfarbe
                EndIf
                Grundeinstellung()

              Case #MenueRahmen                                                ;Rahmen durchsichtig Ein/Aus
                AnzeigeRahmen = Bool(Not AnzeigeRahmen)
                SetMenuItemState(0, #MenueRahmen, AnzeigeRahmen)
                EinstellungenSpeichern()
                If AnzeigeRahmen = #False
                  FarbeRahmen = #Durchsichtig
                Else
                  FarbeRahmen = #Rahmenfarbe
                EndIf
                Grundeinstellung()

              Case #MenueHintergrund                                           ;Hintergrund durchsichtig Ein/Aus
                AnzeigeHintergrund = Bool(Not AnzeigeHintergrund)
                SetMenuItemState(0, #MenueHintergrund, AnzeigeHintergrund)
                EinstellungenSpeichern()
                If AnzeigeHintergrund = #False
                  FarbeHintergrund = #Durchsichtig
                Else
                  FarbeHintergrund = #HintergrundFarbe
                EndIf
                Grundeinstellung()

              Case #MenueTransp_0 To #MenueTransp_9                            ;Fenster Transparent anzeigen
                Select EventMenu()
                  Case #MenueTransp_0 : AnzeigeTransparent = 1   : Wert = 0
                  Case #MenueTransp_1 : AnzeigeTransparent = 2   : Wert = 10
                  Case #MenueTransp_2 : AnzeigeTransparent = 4   : Wert = 20
                  Case #MenueTransp_3 : AnzeigeTransparent = 8   : Wert = 30
                  Case #MenueTransp_4 : AnzeigeTransparent = 16  : Wert = 40
                  Case #MenueTransp_5 : AnzeigeTransparent = 32  : Wert = 50
                  Case #MenueTransp_6 : AnzeigeTransparent = 64  : Wert = 60
                  Case #MenueTransp_7 : AnzeigeTransparent = 128 : Wert = 70
                  Case #MenueTransp_8 : AnzeigeTransparent = 256 : Wert = 80
                  Case #MenueTransp_9 : AnzeigeTransparent = 512 : Wert = 90
                EndSelect
                SetMenuItemState(0, #MenueTransp_0, Bool((AnzeigeTransparent >> 0) & 1))
                SetMenuItemState(0, #MenueTransp_1, Bool((AnzeigeTransparent >> 1) & 1))
                SetMenuItemState(0, #MenueTransp_2, Bool((AnzeigeTransparent >> 2) & 1))
                SetMenuItemState(0, #MenueTransp_3, Bool((AnzeigeTransparent >> 3) & 1))
                SetMenuItemState(0, #MenueTransp_4, Bool((AnzeigeTransparent >> 4) & 1))
                SetMenuItemState(0, #MenueTransp_5, Bool((AnzeigeTransparent >> 5) & 1))
                SetMenuItemState(0, #MenueTransp_6, Bool((AnzeigeTransparent >> 6) & 1))
                SetMenuItemState(0, #MenueTransp_7, Bool((AnzeigeTransparent >> 7) & 1))
                SetMenuItemState(0, #MenueTransp_8, Bool((AnzeigeTransparent >> 8) & 1))
                SetMenuItemState(0, #MenueTransp_9, Bool((AnzeigeTransparent >> 9) & 1))
                EinstellungenSpeichern()
                SetLayeredWindowAttributes_(WindowID(0), #Durchsichtig, 255 * (100 - Wert) / 100, #LWA_ALPHA | #LWA_COLORKEY)

              Case #MenueVordergrund                                           ;Fenster im Vordergrund halten
                Dauerhaft = Bool(Not Dauerhaft)
                SetMenuItemState(0, #MenueVordergrund, Dauerhaft)
                EinstellungenSpeichern()
                StickyWindow(0, Dauerhaft)

              Case #MenueAnklickbar                                            ;Fenster Anklickbar
                Anklickbar = Bool(Not Anklickbar)
                SetMenuItemState(0, #MenueAnklickbar, Anklickbar)
                EinstellungenSpeichern()
                If Anklickbar = #False
                  SetWindowLongPtr_(WindowID(0), #GWL_EXSTYLE, GetWindowLongPtr_(WindowID(0), #GWL_EXSTYLE) | #WS_EX_TRANSPARENT)
                Else
                  SetWindowLongPtr_(WindowID(0), #GWL_EXSTYLE, GetWindowLongPtr_(WindowID(0), #GWL_EXSTYLE) & ~#WS_EX_TRANSPARENT)
                EndIf

              Case #MenueAusblenden                                            ;Fenster Minimieren
                Minimieren = Bool(Not Minimieren)
                SetMenuItemState(0, #MenueAusblenden, Minimieren)
                EinstellungenSpeichern()
                HideWindow(0, Minimieren)

            EndSelect

          Case #PB_Event_SysTray
            Select EventType()
              Case #PB_EventType_LeftClick                                     ;Fenster Minimieren
                Minimieren = Bool(Not Minimieren)
                SetMenuItemState(0, #MenueAusblenden, Minimieren)
                EinstellungenSpeichern()
                HideWindow(0, Minimieren)

              Case #PB_EventType_RightClick                                    ;Popup-Menü anzeigen
                DisplayPopupMenu(0, WindowID(0))

            EndSelect

        EndSelect
      EndIf
    ForEver
  EndIf
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

;-* Programmende *
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  FreeFont (#PB_All)
  FreeImage(#PB_All)
  FreeSound(#PB_All)
  End
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

;-* Dateien *
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DataSection
  Tondatei:
    IncludeBinary "Uhr.wav"
  Icon:
    IncludeBinary "Uhr.ico"
EndDataSection
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Zuletzt geändert von Armkrie am 22.07.2018 19:25, insgesamt 6-mal geändert.
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Uhrenprogramm

Beitrag von RSBasic »

Ich wollte es gerade testen, aber gibt es die Dateien "Uhr.wav" und "Uhr.ico" auch zum Download?
Nachdem ich ein paar DataSection-Zeilen gelöscht habe, konnte ich deine Uhr testen. Sieht gut aus. :allright:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Armkrie
Beiträge: 17
Registriert: 30.12.2008 04:03

Re: Uhrenprogramm

Beitrag von Armkrie »

Habe die Dateien zum Download bereitgestellt.

Hat allerdings jeder Windows Benutzer schon auf seinen Rechner, siehe Kommentar im Programm.

;* Benötigte Dateien: *
;* Uhr.ico -> Uhrensymbol für den SysTray (Ich verwende das Icon #266 aus der Datei 'C:\Windows\System32\shell32.dll')
;* Uhr.wav -> Tondatei für die Erinnerung (Ich verwende eine Kopie von 'C:\Windows\Media\tada.wav')
Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

Re: Uhrenprogramm

Beitrag von Shardik »

Zunächst einmal vielen Dank für die schöne Uhren-Anwendung! :allright:
Armkrie hat geschrieben:Hat allerdings jeder Windows Benutzer schon auf seinen Rechner, siehe Kommentar im Programm.

;* Benötigte Dateien: *
;* Uhr.ico -> Uhrensymbol für den SysTray (Ich verwende das Icon #266 aus der Datei 'C:\Windows\System32\shell32.dll')
;* Uhr.wav -> Tondatei für die Erinnerung (Ich verwende eine Kopie von 'C:\Windows\Media\tada.wav')
Leider kann man sich auf die Icon-Nummern nicht verlassen, da die Shell32.dll in verschiedenen Windows-Versionen unterschiedliche Icons enthält, die teilweise auch aus einem ganz anderen Themenbereich stammen. Ich habe einmal das Icon #266 in 'C:\Windows\System32\shell32.dll' in Windows XP SP3, Windows 7 SP1 und Windows 8.1 verglichen: nur in Windows 7 und 8.1 ist das Icon #266 identisch, es unterscheidet sich aber von dem in Windows XP und dem von Dir zum Download freigegebenen (Windows 10?)...

Eine andere Kleinigkeit, die mir beim groben Überfliegen des Quellcodes aufgefallen ist:
man sollte nicht mehr GetWindowLong() oder SetWindowLong() verwenden, sondern GetWindowLongPtr() und SetWindowLongPtr():
MSDN hat geschrieben:Note If you are retrieving a pointer or a handle, this function has been superseded by the GetWindowLongPtr function. (Pointers and handles are 32 bits on 32-bit Windows and 64 bits on 64-bit Windows.) To write code that is compatible with both 32-bit and 64-bit versions of Windows, use GetWindowLongPtr.
Armkrie
Beiträge: 17
Registriert: 30.12.2008 04:03

Re: Uhrenprogramm

Beitrag von Armkrie »

Habe die Änderungen für GetWindowLong() und SetWindowLong() hinzugefügt.

Danke für den Hinweis.
Benutzeravatar
udg
Beiträge: 560
Registriert: 20.06.2013 23:27

Re: Uhrenprogramm

Beitrag von udg »

Wow sehr löblich und sehr nice.
Danke, dass man in den SC schauen darf :allright:
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE! TOP. Kauft Eure Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
dlldev
Beiträge: 23
Registriert: 28.07.2014 02:22

Re: Uhrenprogramm

Beitrag von dlldev »

:allright: Klasse gemacht!
Entwicklungsumgebung: Intel i7 Laptop mit 8GB RAM und Windows 8.1 drauf. PureBasic 5.24 LTS.
Antworten