Uhrzeit wird als kryptische Zeichen ausgegebn im Fenster



  • Hi,

    Ich will die die aktuelle Uhrzeit in einem Fenster ausgeben die Uhrzeit hab ich so ermittelt:

    static TCHAR uhrzeit[30];
         SYSTEMTIME systime;
         GetLocalTime(&systime);
         wsprintf(uhrzeit, "%02d:%02d:%02d", systime.wHour, systime.wMinute, systime.wSecond);
    

    Nun will ich die Uhrzeit mit Textout auf das Fenster malen:

    case WM_PAINT :
              InvalidateRect (hwnd, &rect, TRUE) ;
              hdc = BeginPaint (hwnd, &ps) ;
              TextOut (hdc, 100,100,uhrzeit,strlen(uhrzeit));
    
              EndPaint (hwnd, &ps) ;
              return 0 ;
    

    Doch leider erscheinen nur kryptische Zeichen, hier der Screenshot http://320059987443.bei.t-online.de/uhrzeit.jpg

    [ Dieser Beitrag wurde am 24.05.2003 um 12:10 Uhr von 0x0000F editiert. ]



  • also bei mir funzt es...
    das einzige was ich anders hab ist:
    InvalidateRect (hwnd, NULL, TRUE) ;



  • Original erstellt von <ich>:
    also bei mir funzt es...
    das einzige was ich anders hab ist:
    InvalidateRect (hwnd, NULL, TRUE) ;

    Wenn ich die Zeile bei mir änder klappt es trotzdem irgendwie nicht.



  • wo steht der code, der die uhrzeit abruft?



  • Original erstellt von 0x0000F:
    **```cpp
    wsprintf(uhrzeit, "%02d:%02d:%02d", systime.wHour, systime.wMinute, systime.wSecond);

    soweit ich weiß, musst du TEXT("bla") und nicht "bla" machen.



  • quatsch. wie kommst du denn darauf?



  • Hier der komplette Code:

    #include <windows.h>
    #include <iostream.h>
    #define MAX_LOADSTRING 100
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
         static TCHAR szAppName[] = TEXT ("BtnLook") ;
         HWND         hwnd ;
         MSG          msg ;
         WNDCLASS     wndclass ;
    
         wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
         wndclass.lpfnWndProc   = WndProc ;
         wndclass.cbClsExtra    = 0 ;
         wndclass.cbWndExtra    = 0 ;
         wndclass.hInstance     = hInstance ;
         wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
         wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
         wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
         wndclass.lpszMenuName  = NULL ;
         wndclass.lpszClassName = szAppName ;
    
         if (!RegisterClass (&wndclass))
         {    
              MessageBox (NULL, TEXT ("Programm arbeitet mit Unicode und setzt Windows NT voraus!"), 
                          szAppName, MB_ICONERROR) ;
              return 0 ;
         }
    
         hwnd = CreateWindow (szAppName, TEXT ("Uhrzeitausgabe"),
                              WS_OVERLAPPEDWINDOW,
                              CW_USEDEFAULT, CW_USEDEFAULT,
                              CW_USEDEFAULT, CW_USEDEFAULT,
                              NULL, NULL, hInstance, NULL) ;
    
         ShowWindow (hwnd, iCmdShow) ;
         UpdateWindow (hwnd) ;
    
         while (GetMessage (&msg, NULL, 0, 0))
         {  
       TranslateMessage (&msg) ;
              DispatchMessage (&msg) ;
         }
         return msg.wParam ;
    }
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    
         static RECT  rect ;
         char uhrzeit[30];
         HDC          hdc ;
         PAINTSTRUCT  ps ;
         SYSTEMTIME systime;
         GetLocalTime(&systime);
         wsprintf(uhrzeit, "%02d:%02d:%02d", systime.wHour, systime.wMinute, systime.wSecond);
    
         switch (message)
         {
         case WM_CREATE :
    
              return 0 ;
    
         case WM_SIZE :
    
              return 0 ;
         case WM_PAINT :
              InvalidateRect (hwnd, NULL, TRUE) ; 
              hdc = BeginPaint (hwnd, &ps) ;
              TextOut (hdc, 100,100,uhrzeit,strlen(uhrzeit));
    
              EndPaint (hwnd, &ps) ;
              return 0 ;
    
         case WM_DRAWITEM :
         case WM_COMMAND :
    
              break ;
    
         case WM_DESTROY :
              PostQuitMessage (0) ;
              return 0 ;
         }
         return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
    

    Es gibt drei Warnungen:

    (65) : warning C4133: 'function' : Inkompatible Typen - von 'char [30]' zu 'unsigned short *'

    (65) : warning C4133: 'function' : Inkompatible Typen - von 'char [15]' zu 'const unsigned short *'

    (79) : warning C4133: 'function' : Inkompatible Typen - von 'char [30]' zu 'const unsigned short *'



  • bei mir funktionierts auch und zwar ohne diese warnings.

    Mahc mal nen Rebuild all, hilft manchmal wunder bei unerklärlichen fehlern 🙂

    [ Dieser Beitrag wurde am 24.05.2003 um 20:13 Uhr von dEUs editiert. ]



  • Original erstellt von dEUs:
    **bei mir funktionierts auch und zwar ohne diese warnings.

    Mahc mal nen Rebuild all, hilft manchmal wunder bei unerklärlichen fehlern 🙂

    [ Dieser Beitrag wurde am 24.05.2003 um 20:13 Uhr von [qb]dEUs** editiert. ][/QB]

    Cross hab mal rebuild und alles gemacht usw. hat aber nicht geklappt. Hab den Quellcode mal rauskopiert und in ein neues Projekt hinheinkopiert und auf einmal klappt es, weiß der Geier warum
    😮 😮



  • die zeitabfbfrage ist aber an der falschen stellen im programm. ich wuerde die in einen TIMER setzen.



  • Im originalen Projekt sind UNICODE und _UNICODE definiert. Dann vertragen sich die Funktionen natürlich nicht mehr char. Und genau deswegen ist Mr. Ns Beitrag kein Quatsch. Zusätzlich muß aber noch aus char TCHAR werden und aus strlen wird _tcslen.

    BTW: Ein Aufruf von InvalidateRect hat in WM_PAINT nichts zu suchen.



  • Original erstellt von -King-:
    **Im originalen Projekt sind UNICODE und _UNICODE definiert. Dann vertragen sich die Funktionen natürlich nicht mehr char. Und genau deswegen ist Mr. Ns Beitrag kein Quatsch. Zusätzlich muß aber noch aus char TCHAR werden und aus strlen wird _tcslen.

    BTW: Ein Aufruf von InvalidateRect hat in WM_PAINT nichts zu suchen.**

    Wo sind im Programm UNICODE und _UNICODE definiert. Hab das Programm aus einem Buch abgetippt und wollte es dann verändern. Wenn ich die gesagten Sachen veränder mit char und THCAR und _tcslen zeigt er trotzdem noch Müll an.



  • Wo sind im Programm UNICODE und _UNICODE definiert.

    Gar nicht. Das habe ich auch nie behauptet, ich schrieb Projekt. Und in den Einstellungen kannst Du das dann sehen.

    Hab das Programm aus einem Buch abgetippt und wollte es dann verändern.

    Das glaub ich Dir nicht. Du hast das nicht abgetippt, sondern einfach das Projekt und den Quelltext von der CD übernommen. Und ich weiß, daß Petzold in den Debug-Builds UNICODE enabled hat.

    Wenn ich die gesagten Sachen veränder mit char und THCAR und _tcslen zeigt er trotzdem noch Müll an.

    Bekommst Du noch weitere Warnungen?

    [ Dieser Beitrag wurde am 25.05.2003 um 15:19 Uhr von -King- editiert. ]



  • Ich hab gar keine CD zu dem Buch und ich bekomme noch zwei Warnungen:

    (65) : warning C4133: 'function' : Inkompatible Typen - von 'char [9]' zu 'const unsigned short *'

    (76) : warning C4013: '_tcslen' undefiniert; Annahme: extern mit Rueckgabetyp int

    [ Dieser Beitrag wurde am 25.05.2003 um 15:46 Uhr von 0x0000F editiert. ]



  • (65) : warning C4133: 'function' : Inkompatible Typen - von 'char [9]' zu 'const unsigned short *'

    Und welche Zeile ist das? Was steht da?

    (76) : warning C4013: '_tcslen' undefiniert; Annahme: extern mit Rueckgabetyp int

    Du hast <tchar.h> nicht inkludiert.



  • static RECT  rect ;
         TCHAR uhrzeit[30];
         HDC          hdc ;
         PAINTSTRUCT  ps ;
         SYSTEMTIME systime;
         GetLocalTime(&systime);
         wsprintf(uhrzeit, "%02d:%02d:%02d",systime.wHour,systime.wMinute,systime.wSecond);//<-----65) : warning C4133: 'function' : Inkompatible Typen - von 'char [15]' zu 'const unsigned short *'
    
         switch (message)
         {
         case WM_CREATE :
    
              return 0 ;
    
              return 0 ;
         case WM_PAINT :
              hdc = BeginPaint (hwnd, &ps) ;
              TextOut (hdc, 100,100,uhrzeit, _tcslen(uhrzeit));//<-----(76) : warning C4133: 'function' : Inkompatible Typen - von 'unsigned short [30]' zu 'const char *'
    
              EndPaint (hwnd, &ps) ;
              return 0 ;
    

    Ich hab jetzt <tchar.h> eingebunden.

    [ Dieser Beitrag wurde am 25.05.2003 um 16:00 Uhr von 0x0000F editiert. ]



  • Das ist doch das, was Mr. N bereits gesagt hat. Das muß so aussehen:

    wsprintf(uhrzeit, TEXT("%i:%i:%i"), 10,20,30);
    

    [edit]
    Ich habe eben erst gesehen, daß die zweite Warnung nun eine ganz andere ist. Das liegt daran, daß Du zwar UNICODE definiert hast, nicht aber _UNICODE.
    [/edit]

    [ Dieser Beitrag wurde am 25.05.2003 um 16:05 Uhr von -King- editiert. ]



  • Original erstellt von -King-:
    **Das ist doch das, was Mr. N bereits gesagt hat. Das muß so aussehen:

    wsprintf(uhrzeit, TEXT("%i:%i:%i"), 10,20,30);
    

    **

    Ja stimmt hab ich vergessen, dann bekomme ich nur noch diesen einen Fehler

    TextOut (hdc, 100,100,uhrzeit, _tcslen(uhrzeit)); //<--- (76) : warning C4133: 'function' : Inkompatible Typen - von 'unsigned short [30]' zu 'const char *'
    


  • Habe ich jetzt ach gesehen. Siehe edit des anderen Beitrags.



  • Original erstellt von -King-:
    Habe ich jetzt ach gesehen. Siehe edit des anderen Beitrags.

    Jo jetzt läuft es wie es soll. Danke das du dir die Zeit genommen hast das so zu
    analysieren. 🕶 Hab davor nur Java programmiert deshablb muss mich erstmal mit VC++ und seinen Funktionen und Einstellungen vertraut machen.


Anmelden zum Antworten