Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Ein Uhr Programm

Empfohlene Antworten

Veröffentlicht

Hallo,

ich soll eine Uhr programmieren. Leider habe ich nicht sehr viel Erfahrung und daher klappt es leider nicht so wie ich es will.

So sieht es in meinem Hauptprogramm aus:

LRESULT CALLBACK MainWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)

{

SYSTEMTIME st;

//static SYSTEMTIME st_fest;

switch (msg) {

case WM_CREATE:

SetTimer (hwnd, TIMER_1, 1000, NULL);

//GetLocalTime (&st);

break;

case WM_PAINT:

uhr_zeichnen(hwnd);

break;

case WM_SIZE:

SendMessage(hWndStatusbar,msg,wParam,lParam);

InitializeStatusBar(hWndStatusbar,1);

break;

case WM_MENUSELECT:

return MsgMenuSelect(hwnd,msg,wParam,lParam);

case WM_COMMAND:

HANDLE_WM_COMMAND(hwnd,wParam,lParam,MainWndProc_OnCommand);

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

case WM_TIMER:

zeiger_zeichnen (hwnd);

default:

return DefWindowProc(hwnd,msg,wParam,lParam);

}

return 0;

}

mein Unterprogramm:

#include <windowsx.h>

#include <commctrl.h>

#include <string.h>

#include "uhrzeitenvergleichres.h"

#include "prototypen.h"

#include <stdio.h>

#include <math.h>

int uhr_zeichnen (HWND hwnd)

{

HDC hdc;

PAINTSTRUCT ps;

int farbe;

int r,g,b;

HBRUSH pinsel;

InvalidateRect (hwnd, NULL, TRUE);

hdc = BeginPaint (hwnd, &ps);

farbe = RGB(220, 100, 50);

pinsel = CreateSolidBrush (farbe);

SelectBrush (hdc, pinsel);

Ellipse (hdc, 250, 80, 450, 280);

DeleteObject(pinsel);

EndPaint (hwnd, &ps);

UpdateWindow(hwnd);

return 0;

}

int zeiger_zeichnen (HWND hwnd)

{

HDC hdc;

PAINTSTRUCT ps;

int x, y;

int radius = 100;

static double winkel = 0;

double delta_winkel = 0.1047198;

x = radius * cos (winkel);

y = radius * sin (winkel);

winkel = winkel + delta_winkel;

InvalidateRect (hwnd, NULL, TRUE);

hdc = BeginPaint (hwnd, &ps);

SetViewportOrgEx(hdc, 350, 100, NULL);

MoveToEx (hdc, 0, 0, NULL);

LineTo (hdc, x, y);

EndPaint (hwnd, &ps);

UpdateWindow(hwnd);

return 0;

}

Mein Problem ist jetzt, dass das Programm erst den Kreis zeichnet und dann beginnt der Zeiger zu laufen und der Kreis verschwindet. Wie kann ich beides gleichzeitig laufen lassen?

Wäre sehr dankbar wenn mir jemand weiterhelfen könnte :)

Das ist ein totales Durcheinander.

BeginPaint und EndPaint darfst du nur während der Bearbeitung einer WM_PAINT-Nachricht aufrufen, das hat in den Zeichenfunktionen nichts verloren. Ebenso InvalidateRect. UpdateWindow brauchst du überhaupt nicht.

In der WM_TIMER-Behandlung solltest du nichts anderes tun als InvalidateRect. Das Zeichnen (Uhr und Zeiger) muss während der Bearbeitung von WM_PAINT stattfinden.

Ich weiß nicht, was SelectBrush tut, aber du darfst kein GDI-Objekt löschen, das noch in einen DC selektiert ist.

Okay vielen Dank, jetzt kann ich zumindest beides gleichzeitig zeichnen:)

Bewegen tut sich leider noch nichts..

was soll ich in WM-TIMER reinschreiben?

Ich dachte er sorgt dafür dass eine Funktion ständig neu gezeichnet wird in bestimmten Zeitabständen.

kann ich die Bewegung der Zeiger auch durch sin-Funktionen in Excel einlesen und damit dann Zeichnen??

Danke es bewegt sich:)

ich hab jetzt insgesamt 3 Zeiger und 3 TIMER für die Sekunden, Minuten und Stunden eingefügt.

Wie kann ich dem Programm die jeweiligen TIMER zuweisen??

ich hab jetzt insgesamt 3 Zeiger und 3 TIMER für die Sekunden, Minuten und Stunden eingefügt.
Das wird nichts. Timer sind dafür ungeeignet, weil sie nicht genau genug sind. Ein Timer von 1000 ms wird frühestens nach einer Sekunde ausgelöst, es kann aber auch später sein. Da Windows kein Echtzeitbetriebssystem ist, unter Umständen viel später.

Mach dir einen Sekundentimer, aber berechne nicht die Zeit durch Mitzählen der Timer-Ereignisse, sondern frag die Uhr des Computers ab.

  • 2 Wochen später...

Die Zeiger laufen mittlerweile wie die Zeit im Computer...

Doch leider laufen Sie nur schlagartig mit (z.B. von 12 sofort auf die 1 ).

Sie laufen nicht langsam mit, wie die analoge Uhren die man eigentlich kennt!

Hat jemand eine Idee an was das liegen könnte??

void seczeiger_zeichnen (HDC hdc)

{

time_t tnow;

time (&tnow);

tmnow= localtime (&tnow);

double pi = 3.1415926535;

// Variablen für den Sekundenzeiger

double xsec, ysec;

double radsec = 100;

double sekunde;

sekunde =(double) tmnow->tm_sec;

double winkel = (2.0*pi* sekunde/60.0);

//Variablen für den Minutenzeiger

double xmin, ymin;

double radmin = 100;

double minute = tmnow->tm_min;

double winkelmin = (2.0*pi*minute/60);

// Variablen für den Stundenzeiger

double xhour, yhour;

double radhour = 60;

double hour = tmnow->tm_hour;

double winkelhour; // (2.0*pi*hour/12);

// Bewegung des Sekundenzeigers

xsec = radsec * sin (winkel);

ysec = -1* radsec * cos (winkel);

// Bewegung des Minuternzeigers

xmin = radmin * sin (winkelmin);

ymin =-1* radmin * cos (winkelmin);

// Bewegung des Stundenzeigers

winkelhour = (2.0*pi*hour/12);

xhour = radhour * sin (winkelhour);

yhour = -1*radhour * cos (winkelhour);

// Nullpunkt setzten

SetViewportOrgEx(hdc, 350, 180, NULL);

// Befehle für Sekundenzeiger

MoveToEx (hdc, 0, 0, NULL);

LineTo (hdc, xsec, ysec);

// Befehle für Minutenzeiger

MoveToEx (hdc, 0, 0, NULL);

LineTo (hdc, xmin, ymin);

// Befehle für Stundenzeiger

MoveToEx (hdc, 0, 0, NULL);

LineTo (hdc, xhour, yhour);

}

  • 2 Wochen später...

Hallo,

jetzt funktioniert folgendes nicht:

wenn ich auf den KNOPF_BERLIN klicke, dann wird die Uhr gezeichnet aber sie läuft leider nicht...

Ich kann auch nicht erkennen an was das liegt!

Wäre super wenn mir da jemand weiter helfen könnte

BOOL APIENTRY zeitauswahlmaske (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)

{

int x = 0;

switch(msg)

{

case WM_INITDIALOG:

//Dieser Teil wird durchlaufen, wenn die Maske das 1. Mal geoeffnet wird

printf("\nDie Maske wurde aufdemacht");

break;

case WM_COMMAND:

//Dieser Teil wird durchlaufen, wenn in der Maske etwas ausgefuehrt werden soll.

switch(LOWORD(wParam))

{

case KNOPF_BERLIN:

printf("\nEs wurde der Knopf_BERLIN gedrueckt");

SetTimer (hwnd, TIMER, 1000, NULL);

case WM_TIMER:

uhr_zeichnen(hwndMain);

break;

break;

case KNOPF_NY:

printf("\nEs wurde der KNOPF_NY gedrueckt");

break;

case KNOPF_LONDON:

printf("\nEs wurde der KNOPF_LONDON gedrueckt");

break;

case KNOPF_SYDNEY:

printf("\nEs wurde der KNOPF_SYDNEY gedrueckt");

}

break;

}

return(HandleDefaultMessages(hwnd, msg, wParam, lParam));

}

Du hast nicht gezeigt, wie uhr_zeichnen aussieht, aber wenn da drin mal wieder BeginPaint und EndPaint auftauchen, darfst du diese Funktion nur während der Behandlung einer WM_PAINT-Nachricht des Hauptfensters aufrufen.

Der Timer hat außerdem im Maskenfenster nichts verloren, der gehört ins Hauptfenster.

BOOL APIENTRY zeitauswahlmaske (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)

{

int x = 0;

switch(msg)

{

case WM_INITDIALOG:

//Dieser Teil wird durchlaufen, wenn die Maske das 1. Mal geoeffnet wird

printf("\nDie Maske wurde aufdemacht");

break;

case WM_COMMAND:

//Dieser Teil wird durchlaufen, wenn in der Maske etwas ausgefuehrt werden soll.

switch(LOWORD(wParam))

{

case KNOPF_BERLIN:

printf("\nEs wurde der Knopf_BERLIN gedrueckt");

uhr_zeichnen(hwndMain);

SetTimer (hwndMain, TIMER_1, 1000, NULL);

zeiger_zeichnen(hwndMain);

break;

case KNOPF_NY:

printf("\nEs wurde der KNOPF_NY gedrueckt");

break;

case KNOPF_LONDON:

printf("\nEs wurde der KNOPF_LONDON gedrueckt");

break;

case KNOPF_SYDNEY:

printf("\nEs wurde der KNOPF_SYDNEY gedrueckt");

}

break;

}

return(HandleDefaultMessages(hwnd, msg, wParam, lParam));

}

Hallo nochmal,

leider wechseln die Funktionen sich ab...

ich kann die Zeiger nicht auf die Uhr zeichnen lassen!

Wäre super wenn jemand eine Möglichkeit kennt, wie es doch funktioniert:)

oder muss ich keine Funtionen zu einer zusammenfassen??

*beide Funktionen

Hat sich erledigt!:) Habe es gerade eben selber hinbekommen :)

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.