Angeli Geschrieben 18. April 2012 Teilen Geschrieben 18. April 2012 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 18. April 2012 Teilen Geschrieben 18. April 2012 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Angeli Geschrieben 18. April 2012 Autor Teilen Geschrieben 18. April 2012 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?? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 18. April 2012 Teilen Geschrieben 18. April 2012 In WM_TIMER sollst du InvalidateRect aufrufen, das löst eine WM_PAINT-Nachricht aus. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Angeli Geschrieben 18. April 2012 Autor Teilen Geschrieben 18. April 2012 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?? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 18. April 2012 Teilen Geschrieben 18. April 2012 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Angeli Geschrieben 1. Mai 2012 Autor Teilen Geschrieben 1. Mai 2012 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); } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 1. Mai 2012 Teilen Geschrieben 1. Mai 2012 Hat jemand eine Idee an was das liegen könnte?? An der Art und Weise, wie du den Winkel des Stundenzeigers berechnest. Du verwendest nur die Stunden, und die springen natürlich, also springt dein Stundenzeiger auch. Bezieh die Minuten mit in diese Berechnung ein. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Angeli Geschrieben 15. Mai 2012 Autor Teilen Geschrieben 15. Mai 2012 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)); } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 15. Mai 2012 Teilen Geschrieben 15. Mai 2012 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Angeli Geschrieben 16. Mai 2012 Autor Teilen Geschrieben 16. Mai 2012 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?? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Angeli Geschrieben 16. Mai 2012 Autor Teilen Geschrieben 16. Mai 2012 *beide Funktionen Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Angeli Geschrieben 16. Mai 2012 Autor Teilen Geschrieben 16. Mai 2012 Hat sich erledigt! Habe es gerade eben selber hinbekommen Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.