Zum Inhalt springen

Ein Uhr Programm


Angeli

Empfohlene Beiträge

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 :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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??

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 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);

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 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));

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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??

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...