Clocktwo auf einem DPF

  • geschlossen
  • C#

  • wasawasa
  • 2479 Aufrufe 2 Antworten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Clocktwo auf einem DPF

    Hey, das ist mein erster Thread, den ich in "Coding" starte.
    Ich bin total aufgeregt. Was wollte ich eigentlich posten?
    Ah, jetzt ja. Ich saß gestern Abend vor meinem Rechner und habe den heise-Ticker gelesen. Dabei bin ich auf folgendes gestoßen: Digitale Bilderrahmen zweckentfremdet | heise Foto. Was mich vor allem begeisterte war die Verwendung des DPF also Clocktwo: QLOCKTWO BY BIEGERT & FUNK der Link ist hin und wieder down, dann klonblog.com/2009/05/28/clocktwo-die-uhr-ohne-zeiger/.

    Was mich nicht begeisterte, war der Vorschlag das ganze mit einem Grafikprogramm zu erstellen. Was, wenn die Buchstaben zu hell, zu dunkel, zu groß, zu klein, ... wären? Also musste ein Programm her. Da es die Arbeit von ca. drei Stunden ist, darf nicht zu viel erwartet werden. Aber es tut ...
    Der Code ist nicht allzu lange,darum werde ich ihn direkt posten.

    Als erstes die Klasse "Zeitgeber.cs"

    Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. namespace ClockTwo
    6. {
    7. class Zeitgeber
    8. {
    9. Dictionary<int, Stunde> dictStunde = new Dictionary<int, Stunde> ();
    10. Dictionary<int, Minute> dictMinute = new Dictionary<int, Minute>();
    11. Dictionary<int, string> dictPostMin = new Dictionary<int, string>();
    12. Dictionary<int,int[]> dictMS = new Dictionary<int,int[]> ();
    13. GrWr grwr = new GrWr(0, 0);
    14. public Zeitgeber()
    15. {
    16. // Nachfilgender Teil steuert die Hell/Dunkel Sequenzen in "dictMinute"
    17. // Index 1 => 5 Min; Index 2 => 10 Min; usw.
    18. // Da wo eine 1 steht ist es hell, da wo eine 2 steht ist es dunkel
    19. // spart jede Menge Tiparbeit
    20. dictMS.Add (1, new int[] { 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 });
    21. dictMS.Add (2, new int[] { 1, 2, 1, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2, 2 });
    22. dictMS.Add (3, new int[] { 1, 2, 1, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2 });
    23. dictMS.Add (4, new int[] { 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 1 });
    24. dictMS.Add (5, new int[] { 1, 2, 1, 2, 2, 1, 2, 1, 2, 2, 2, 1, 2, 2 });
    25. dictMS.Add (6, new int[] { 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 2, 1, 2, 2 });
    26. dictMS.Add (7, new int[] { 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2 });
    27. dictMS.Add (8, new int[] { 1, 2, 1, 2, 1, 2, 2, 2, 2, 1, 2, 1, 2, 2 });
    28. dictMS.Add (9, new int[] { 1, 2, 1, 2, 2, 1, 2, 2, 2, 1, 2, 1, 2, 2 });
    29. dictMS.Add (10, new int[] { 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 2 });
    30. dictMS.Add (11, new int[] { 1, 2, 1, 2, 2, 1, 2, 1, 2, 2, 2, 2, 2, 2 });
    31. dictMS.Add (12, new int[] { 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 2, 2, 2, 2 });
    32. // Befüllt die Klasse "Stunde" und packt sie in ein Dictionary
    33. // Der erste Teil ist die Stunde, der zweite Teil sind Füllzeichen.
    34. // Füllzeichen sind nie hell. Das Boolean sorgt bei "true" für einen Umbruch.
    35. dictStunde.Add (1, new Stunde("E I N S", " P T W ", false));
    36. dictStunde.Add (2, new Stunde("Z W E I", "", true));
    37. dictStunde.Add (3, new Stunde("D R E I", " S V B ", false));
    38. dictStunde.Add (4, new Stunde("V I E R", "", true));
    39. dictStunde.Add (5, new Stunde("F Ü N F", " R S ", false));
    40. dictStunde.Add (6, new Stunde("S E C H S", "", true));
    41. dictStunde.Add (7, new Stunde("S I E B E N", " T ", false));
    42. dictStunde.Add (8, new Stunde("A C H T", " ", true));
    43. dictStunde.Add (9, new Stunde("N E U N", " ", false));
    44. dictStunde.Add(10, new Stunde("Z E H N", " ", false));
    45. dictStunde.Add(11, new Stunde("E L F", "", true));
    46. dictStunde.Add(12, new Stunde("Z W Ö L F", " S D W K L S", false));
    47. // hier stecken die Minuten. Gesteuert von oben
    48. dictMinute.Add (1, new Minute ("E S", false));
    49. dictMinute.Add (2, new Minute (" A", false));
    50. dictMinute.Add (3, new Minute (" I S T", false));
    51. dictMinute.Add (4, new Minute (" A", false));
    52. dictMinute.Add (5, new Minute (" F Ü N F", true));
    53. dictMinute.Add (6, new Minute ("Z E H N", false));
    54. dictMinute.Add (7, new Minute (" U A D", false));
    55. dictMinute.Add (8, new Minute (" V O R", false));
    56. dictMinute.Add (9, new Minute (" G", true));
    57. dictMinute.Add (10, new Minute ("N A C H", false));
    58. dictMinute.Add (11, new Minute (" V I E R T E L", true));
    59. dictMinute.Add (12, new Minute ("H A L B", false));
    60. dictMinute.Add (13, new Minute (" V O R", false));
    61. dictMinute.Add (14, new Minute (" N A C H", true));
    62. // Ist ein Versuch und muss nicht beachtet werden.
    63. dictPostMin.Add(1, "A A A A A A A A A A A");
    64. }
    65. public void generiere()
    66. {
    67. DateTime dt = new DateTime();
    68. dt = DateTime.Parse("00:20");
    69. for (int i = 1; i <= 720; i++)
    70. {
    71. grwr = new GrWr(0, 0);
    72. grwr.setStartPunkt(58, 0);
    73. grwr.ladeBitmap("6x8.jpg");
    74. int std = dt.Hour;
    75. int min = dt.Minute;
    76. if (min >= 20) std++;
    77. int fmin = min / 5;
    78. minute(dictMS[fmin+1]);
    79. stunde(std);
    80. postMin(min % 5);
    81. string fname = (dt.Hour.ToString()).PadLeft(2, '0') + (dt.Minute.ToString()).PadLeft(2, '0');
    82. grwr.speichereDatei("clock\\"+fname+".jpg");
    83. dt = dt + TimeSpan.FromMinutes(1);
    84. }
    85. }
    86. private void minute(int[] minute)
    87. {
    88. grwr.nl();
    89. for (int i = 1; i <= 14; i++)
    90. {
    91. grwr.schreibeText(dictMinute[i].minute, minute[i-1]);
    92. if (dictMinute[i].umbruch == true)
    93. {
    94. grwr.nl();
    95. }
    96. }
    97. }
    98. private void stunde (int std)
    99. {
    100. for (int i=1; i<=12; i++)
    101. {
    102. if (i == std) grwr.schreibeText(dictStunde[i].std, 1); else grwr.schreibeText(dictStunde[i].std, 2);
    103. grwr.schreibeText(dictStunde[i].filler , 2);
    104. if (dictStunde[i].umbruch == true)
    105. {
    106. grwr.nl();
    107. }
    108. }
    109. }
    110. private void postMin (int pm)
    111. {
    112. grwr.nl();
    113. if (pm == 0)
    114. {
    115. grwr.schreibeText("A ", 2);
    116. grwr.schreibeText("0 ", 1);
    117. grwr.schreibeText("F 1 W 2 U 3 R 4 N", 2);
    118. }
    119. if (pm == 1)
    120. {
    121. grwr.schreibeText("A 0 F ", 2);
    122. grwr.schreibeText("1 ", 1);
    123. grwr.schreibeText("W 2 U 3 R 4 N", 2);
    124. }
    125. if (pm == 2)
    126. {
    127. grwr.schreibeText("A 0 F 1 W ", 2);
    128. grwr.schreibeText("2 ", 1);
    129. grwr.schreibeText("U 3 R 4 N", 2);
    130. }
    131. if (pm == 3)
    132. {
    133. grwr.schreibeText("A 0 F 1 W 2 U ", 2);
    134. grwr.schreibeText("3 ", 1);
    135. grwr.schreibeText("R 4 N", 2);
    136. }
    137. if (pm == 4)
    138. {
    139. grwr.schreibeText("A 0 F 1 W 2 U 3 R ", 2);
    140. grwr.schreibeText("4 ", 1);
    141. grwr.schreibeText("N", 2);
    142. }
    143. }
    144. }
    145. }
    Alles anzeigen


    Die Klasse "Stunde.cs"

    Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. namespace ClockTwo
    6. {
    7. class Stunde
    8. {
    9. public string std { get; set; }
    10. public string filler { get; set; }
    11. public bool umbruch { get; set; }
    12. public Stunde(string std, string filler, bool umbruch)
    13. {
    14. this.std = std;
    15. this.filler = filler;
    16. this.umbruch = umbruch;
    17. }
    18. }
    19. }
    Alles anzeigen


    Die Klasse "Minute.cs"

    Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. namespace ClockTwo
    6. {
    7. class Minute
    8. {
    9. public string minute { get; set; }
    10. public string filler { get; set; }
    11. public bool umbruch { get; set; }
    12. public Minute(string minute, bool umbruch)
    13. {
    14. this.minute = minute;
    15. this.umbruch = umbruch;
    16. }
    17. }
    18. }
    Alles anzeigen


    Bleibt noch die Klasse "GrWr.cs"

    Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Drawing;
    6. using System.Drawing.Imaging;
    7. using System.Drawing.Drawing2D;
    8. using System.Drawing.Text;
    9. namespace ClockTwo
    10. {
    11. // hier ist wichtig zu wissen, dass man mit Teilstrings arbeiten kann.
    12. // Die Klasse merkt sich alles was in einer Zeile steht und packt vor
    13. // einen neuen Text Leerzeichen (funktioniert nur bei Monospace!!!)
    14. // Ist einfach, aber tut soweit und spart gefrickel mit Pixeln
    15. // Wird ein Newline "nl" an der Klasse aufgerufen, löscht sich der Speicher
    16. // und es gibt durch die Addition eines Offsets eine neue Zeile.
    17. class GrWr
    18. {
    19. String aktTxt = "";
    20. Graphics graphicImage;
    21. Bitmap bitMapImage;
    22. int x, y;
    23. int step = 62;
    24. public GrWr (int x, int y)
    25. {
    26. this.x = x;
    27. this.y = y;
    28. }
    29. public void setStartPunkt(int x, int y)
    30. {
    31. this.x = x;
    32. this.y = y;
    33. aktTxt = "";
    34. }
    35. public void nl()
    36. {
    37. this.y = this.y + step;
    38. aktTxt = "";
    39. }
    40. public void ladeBitmap (String grafik)
    41. {
    42. bitMapImage = new Bitmap (grafik);
    43. graphicImage = Graphics.FromImage (bitMapImage);
    44. graphicImage.SmoothingMode = SmoothingMode.AntiAlias;
    45. }
    46. public void schreibeText(string text, int farbe)
    47. {
    48. string vorspann = "";
    49. int anz = aktTxt.Length;
    50. vorspann = vorspann.PadLeft(anz, ' ');
    51. SolidBrush db = null;
    52. if (farbe == 1) {db = new SolidBrush(Color.White);}
    53. if (farbe == 2)
    54. {
    55. Color customColor = Color.FromArgb(80, Color.DarkGray);
    56. db = new SolidBrush(customColor);
    57. }
    58. Font df = new Font("Consolas", 30, FontStyle.Bold);
    59. Point dp = new Point( x, y );
    60. graphicImage.DrawString ( vorspann + text, df, db, dp);
    61. aktTxt = aktTxt + text;
    62. }
    63. public void speichereDatei(String datei)
    64. {
    65. bitMapImage.Save (datei,ImageFormat.Jpeg);
    66. //bitMapImage.Save
    67. //(Response.OutputStream, ImageFormat.Jpeg);
    68. }
    69. }
    70. }
    Alles anzeigen


    Eine Form anlegen, ein Button drauf und da folgenden Code rein:

    Quellcode

    1. Zeitgeber zeitgeber = new Zeitgeber();
    2. zeitgeber.generiere();


    Jetzt füttert man eine JPG Datei im Format von 600x800, die den Hintergrund bildet.
    Der Name ist "6x8.jpg". Bei mir war die z.B. schwarz.

    Mein Code ist wie immer in perfekter Weise selbstkommentierend.
    Sollten Fragen auftreten, einfach die Frage stellen.


    Hab fertig.
    Es ist besser zu schweigen und für einen Narren gehalten zu werden, als zu reden und damit alle Zweifel zu beseitigen ...

    Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von wasawasa ()

  • Interessante Idee!

    Habe das Projekt bei mir eben erstellt, ohne weiteres läuft es bei mir aber nicht. In der "speichereDatei" Methode bekomme ich eine "External Exception" (Errorcode: -2147467259).

    Google bringt mich bei dem ErrorCode hierhin, was sich nach kurzem überfliegen des Codes auch plausibel anhört, mal schauen ob ichs selber rausbekomme...

    Edit: Habs jetzt durch ein bisschen rumpuzzeln hinbekommen, erzeuge das Ausgangsbild jetzt direkt im Speicher anstatt es von HDD zu laden und gebe beim Abspeichern den Pfad komplett an, an einem von beiden hat es wohl gehakt.



    Jetzt das ganze noch auf verschiedene Auflösungen anpassen und schon ists nen hübscher Bildschirmschoner ;)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von nile ()

  • Stimmt :-).
    Habe vergessen zu erwähnen, dass die Daten in einem bestehenden, relativen Ordner abgelegt werden ...
    Darum: An "und gebe beim Abspeichern den Pfad komplett an" hat es wohl gelegen.
    Es ist besser zu schweigen und für einen Narren gehalten zu werden, als zu reden und damit alle Zweifel zu beseitigen ...