Fenster aktualisieren
-
Ja, immer wenn die Uhr sich aktualisieren soll. Ich weiss ja nicht wie du das mit deiner Uhr machst. Ich denke mal du wirst sie in einem Timer updaten?
-
so das is die uhr:
HWND CreateDigiClock(HINSTANCE hInstance) { WNDCLASS wc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = LoadIcon(NULL, "IDI_APPLICATION"); wc.hInstance = hInstance; wc.lpfnWndProc = DigiProc; wc.lpszClassName = "DLGClock"; wc.lpszMenuName = NULL; wc.style = CS_HREDRAW | CS_VREDRAW; RegisterClass(&wc); return CreateWindow("DLGClock", szAppName, WS_CHILD | WS_THICKFRAME, 10, 700, 130, 40, hWnd, NULL, NULL, NULL); } void DisplayDigit (HDC hdc, int iNumber) { static BOOL fSevenSegment [10][7] = { 1, 1, 1, 0, 1, 1, 1, // 0 0, 0, 1, 0, 0, 1, 0, // 1 1, 0, 1, 1, 1, 0, 1, // 2 1, 0, 1, 1, 0, 1, 1, // 3 0, 1, 1, 1, 0, 1, 0, // 4 1, 1, 0, 1, 0, 1, 1, // 5 1, 1, 0, 1, 1, 1, 1, // 6 1, 0, 1, 0, 0, 1, 0, // 7 1, 1, 1, 1, 1, 1, 1, // 8 1, 1, 1, 1, 0, 1, 1 } ; // 9 static POINT ptSegment [7][6] = { 7, 6, 11, 2, 31, 2, 35, 6, 31, 10, 11, 10, 6, 7, 10, 11, 10, 31, 6, 35, 2, 31, 2, 11, 36, 7, 40, 11, 40, 31, 36, 35, 32, 31, 32, 11, 7, 36, 11, 32, 31, 32, 35, 36, 31, 40, 11, 40, 6, 37, 10, 41, 10, 61, 6, 65, 2, 61, 2, 41, 36, 37, 40, 41, 40, 61, 36, 65, 32, 61, 32, 41, 7, 66, 11, 62, 31, 62, 35, 66, 31, 70, 11, 70 } ; int iSeg ; for (iSeg = 0 ; iSeg < 7 ; iSeg++) if (fSevenSegment [iNumber][iSeg]) Polygon (hdc, ptSegment [iSeg], 6) ; } void DisplayTwoDigits (HDC hdc, int iNumber, BOOL fSuppress) { if (!fSuppress || (iNumber / 10 != 0)) DisplayDigit (hdc, iNumber / 10) ; OffsetWindowOrgEx (hdc, -42, 0, NULL) ; DisplayDigit (hdc, iNumber % 10) ; OffsetWindowOrgEx (hdc, -42, 0, NULL) ; } void DisplayColon (HDC hdc) { POINT ptColon [2][4] = { 2, 21, 6, 17, 10, 21, 6, 25, 2, 51, 6, 47, 10, 51, 6, 55 } ; Polygon (hdc, ptColon [0], 4) ; Polygon (hdc, ptColon [1], 4) ; OffsetWindowOrgEx (hdc, -12, 0, NULL) ; } void DisplayTime (HDC hdc, BOOL f24Hour, BOOL fSuppress) { SYSTEMTIME st ; GetLocalTime (&st) ; if (f24Hour) DisplayTwoDigits (hdc, st.wHour, fSuppress) ; else DisplayTwoDigits (hdc, (st.wHour %= 12) ? st.wHour : 12, fSuppress) ; DisplayColon (hdc) ; DisplayTwoDigits (hdc, st.wMinute, FALSE) ; DisplayColon (hdc) ; DisplayTwoDigits (hdc, st.wSecond, FALSE) ; } LRESULT CALLBACK DigiProc(HWND hWnd2, UINT message, WPARAM wParam, LPARAM lParam) { static BOOL f24Hour, fSuppress ; static HBRUSH hBrushRed ; static int cxClient, cyClient ; HDC hdc ; PAINTSTRUCT ps ; TCHAR szBuffer [2] ; switch (message) { case WM_CREATE: hBrushRed = CreateSolidBrush (RGB (0, 100, 0)) ; SetTimer (hWnd2, T1, 1000, NULL) ; // weiter mit WM_SETTINGCHANGE case WM_SETTINGCHANGE: GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_ITIME, szBuffer, 2) ; f24Hour = (szBuffer[0] == '1') ; GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_ITLZERO, szBuffer, 2) ; fSuppress = (szBuffer[0] == '0') ; InvalidateRect (hWnd2, NULL, TRUE) ; return 0 ; case WM_SIZE: cxClient = LOWORD (lParam) ; cyClient = HIWORD (lParam) ; return 0 ; case WM_TIMER: InvalidateRect (hWnd2, NULL, TRUE) ; return 0 ; case WM_PAINT: hdc = BeginPaint (hWnd2, &ps) ; SetMapMode (hdc, MM_ISOTROPIC) ; SetWindowExtEx (hdc, 276, 72, NULL) ; SetViewportExtEx (hdc, cxClient, cyClient, NULL) ; SetWindowOrgEx (hdc, 138, 36, NULL) ; SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ; SelectObject (hdc, GetStockObject (NULL_PEN)) ; SelectObject (hdc, hBrushRed) ; DisplayTime (hdc, f24Hour, fSuppress) ; EndPaint (hWnd2, &ps) ; return 0 ; case WM_DESTROY: KillTimer (hWnd2, T1) ; DeleteObject (hBrushRed) ; return 0 ; } return DefWindowProc (hWnd2, message, wParam, lParam) ; }
-
Das erinnert mich doch irgendwie an ein Beispiel aus dem Petzold :p
(das mit den Segmenten)
[ Dieser Beitrag wurde am 14.02.2003 um 18:40 Uhr von flenders editiert. ]
-
schlaues kerlchen...das grundgerüst is auch ausm petztold is aber ein wenig (o.k. ganz wenig) geändert.
trotzdem weiß ich immer noch nich wie ich mein problem lösen soll.
-
Was genau ist denn jetzt noch dein Problem
-
also noch ma
ich hab die uhr in ein anderes fenster eingebaut nur wird die zeit dann nur dann aktualisiert wenn ich die größe des uhrenfenster verändere!
-
Du musst halt einfach in WM_TIMER InvalidateRect für dasjenige Fenster aufrufen, in dem du die Uhr zeichnen willst. Ggf. musst du das Handle dieses Fensters in einer globalen Variablen speichern, damit du in WM_TIMER darauf zugreifen kannst.
-
das funzt irgendwie net...hab ich auch vorher schon ma probiert gehabt
also noch ma im einzelnen:
in der WinMain erzeuge ich ein einfaches graues fenster in dem
die Uhr in einem eigenen fenster angezeigt werden soll. das funzt auch soweit nur wird die zeit halt nich mehr aktualisiert wenn das proggi läuft. das klappt nur wenn man die größe von dem fenster mit der uhr ändert, danach bleibt die uhr wieder stehen.
-
Dann rufst du offenbar InvalidateRect nicht für das Fenster mit der Uhr auf?!
-
Doch hWnd is bei mir das graue Hauptfenster
und hWnd2 is die uhr...und ich nehmInvalidateRect(hWnd2, NULL, TRUE)
-
Ich glaube immer noch, dass du ein falschen Fenster-Handle verwendest! :p
hWnd2, kommt nämlich vom der Callbackfunktion! Speicher das Handle einfach in einer globalen Variablen und nenn das der Callback nochmal ganz anders!
-
jetzt versteh ich ger nix mehr....
-
Ich darf mal:
[..]
Das besondere an J.G. Systems ist, das der Chef und Gründer von J.G. Systems, ein 15-jähriger Schüler ist.
Obwohl er noch recht jung ist, kann er schon auf eine 11(!)-jährige Erfahrung im Umgang mit Computern zurückblicken.
[..]Ich will ja nicht gehässig sein aber, wer so was auf seiner HP rausposaunt...
Das Ziel von J.G. Systems ist, Ihnen die Software zu bieten, die Sie wirklich benötigen!
[..]Ich hätte gerne eine funktionierdende Digitaluhr, die sich nicht nur bei Größenänderung des Fensters aktualisiert. :p
-
na ja das mit den 11 jahren stimmte ja noch (is auch so ziemlich das einzige)
ich wollt nich sowas schreiben wie:
"armer schüler will billige konsolenprogramme verkaufen, trottel als käufer herzlich willkommen"
is ja auch egal, ich wollt halt ma mit was anderem als zeitung austragen oder ähnliches versuchen geld zu verdienen. aber ich glaub so langsam ich hab die hp zu früh gebastelt...na ja einen versuch wars wert...
so dann zeig du profi ma was du so kannst und sach mir wie ich meine uhr zum laufen krieg
-
Hehe. Ich hatte dich schon in verdacht mein Gästebuch zu zu müllen. Aber so wie es aussieht bist du es doch nicht.
Ich bin leider auch kein Profi. Ich vermute auch nur, dass du das falsche Handle nimmst ohne es zu merken. Bzw. was machst du denn anders als der Petzold?
-
Wenn du dein Fenster für die Digital-Uhr erzeugst speicherst du es einfach in einer globalen Variable hWndDigiClock falls du das Fenster in WinMain erstellst. Falls in WM_CREATE, kannst du es einfach in einer statischen Variable in DigiProc speichern. Dieses musst du dann auch beim Aufruf von InvalidateRect verwenden!
Hoffe mal, dass das das Problem nun endlich löst
-
poste einfach DEINEN code, dann kann man dier viel schneller helfen...
-
So ich hab mein problem jetzt selber gelöst...
hatte einen fehler in meine WM_PAINT message eingebaut