Finde die Fehler nicht



  • Hallo zusammen !
    In meine Code bekommen ich Fehler, nun komme ich nicht klar wie ich sie beheben kann.

    #define NUMSAMPS (3*SAMPRATE)
    #define HALFSAMPS (NUMSAMPS/2)
    #define SAMPRATE 11025
    
    typedef struct
    {
    char chRiff[4];
    DWORD dwRiffSize;
    char chWave[4];
    char chFmt[4];
    DOWRD dwFmtSize;
    PCMWAVEFORMAT pwf;
    char chData[4];
    DWORD dwDataSize;
    BYTE byData[0];
    }
    WAVEFORM;
    
    // weitere Code
    //....
    static WAVEFORM waveform ={"RIFF", NUMSAMPS + 0x24, "WAVE", "fmt", sizeof(PCMWAVEFORMAT), 1 , 1, SAMPRATE, SAMPRATE, 1, 8, "data", NUMSAMPS};
    

    Wie kann ich diesen Fehler beheben ?
    In Zeile 21 tritt 4 mal der gleicher Fehler:
    \main.cpp|99|error: initializer-string for array of chars is too long[fpermissive]|

    Der zweiter Fehler:
    \main.cpp|103|error: 'INITCOMMONCONTROLSEX' was not declared in this scope

    - Header Datei commctrl.h in Code includiert
    - In Linker libcomctl32.a eingetragen

    Wie kann ich den zweiten Fehler beheben ?

    EDIT// Den Ersten Fehler habe ich behoben, einfach Char und Byte Arrays in Struct. WAVEFORM um 1 erhöcht. Fehler weg !



  • Also manchmal, echt... Setzt dich mit den Grundlagen noch einmal außeinander!

    Ich werde hier keine Lösung posten, denn diese würdest Du, wenn Du dich mit den Grundlagen beschäftigt hast, eigentlich auf Anhieb erkennen!

    Btw. Ich rede hier vom Code selbst, nicht von den Fehlern. Bevor Du Dich mit der WinAPI beschäftigst, musst Du Dich schon ein bisschen mehr mit den Grundlagen beschäftigen, ansonsten wird das nur ein Code, den Du Dir im Internet zusammenschnipselst.

    Gruß



  • @Hi: Thanks für die Hilfe, bin gerade in Lernphase !

    Sound wird nicht abgespielt, verstehe ich nicht warum, hier ist der Code:

    #include <windows.h>
    #define _WIN32_IE 0x0400 
    #include <commctrl.h>
    
         // Kennungen der 3 untergeordneten Fenster
    
    #define ID_TIMEPICK 0
    #define ID_CHECKBOX 1
    #define ID_PUSHBTN  2
    
         // Timer-Kennung
    
    #define ID_TIMER    1
    
    // Anzahl der 100-Nanosekundenintervalle je Stunde (FILETIME-Ticks) 
    #define FTTICKSPERHOUR (60 * 60 * (LONGLONG) 10000000)
    
    // Strukturdefinition für eine WAV-Datei
    #define SAMPRATE  11025
    #define NUMSAMPS  (3 * SAMPRATE)
    #define HALFSAMPS (NUMSAMPS / 2) 
    
    typedef struct
    {
         char  chRiff[5] ;
         DWORD dwRiffSize ;
         char  chWave[5] ;
         char  chFmt [5] ;
         DWORD dwFmtSize ;
         PCMWAVEFORMAT pwf ;
         char  chData[5] ;
         DWORD dwDataSize ;
         BYTE  byData[0] ;
    }
    WAVEFORM ;
    
    // Hauptfensterroutine und Fensterroutine für untergeordnete Fenster
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
    LRESULT CALLBACK SubProc (HWND, UINT, WPARAM, LPARAM) ;
    
    // Originale Fensterroutinen-Adressen für untergeordnete Fenster 
    WNDPROC SubbedProc [3] ;
    
    // Aktuelles Unterfenster mit Eingabefokus 
    HWND hwndFocus ;
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInst, PSTR szCmdLine, int iCmdShow)
    {
         static TCHAR szAppName [] = TEXT ("WakeUp") ;
         HWND         hwnd ;
         MSG          msg ;
         WNDCLASS     wndclass ;
    
         wndclass.style         = 0 ;
         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) (1 + COLOR_BTNFACE) ;
         wndclass.lpszMenuName  = NULL ;
         wndclass.lpszClassName = szAppName ;
    
         if (!RegisterClass (&wndclass))
         {
              // UNICODE-Kompilierung ist die einzige realistische Fehlermöglichkeit
              MessageBox (NULL, TEXT ("Programm arbeitet mit Unicode und setzt Windows NT voraus!"),
                          szAppName, MB_ICONERROR) ;
              return 0 ;
         }
    
         hwnd = CreateWindow (szAppName, szAppName,
                              WS_OVERLAPPED | WS_CAPTION | 
                                              WS_SYSMENU | WS_MINIMIZEBOX,
                              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 HWND          hwndDTP, hwndCheck, hwndPush ;
         static WAVEFORM      waveform = { "RIFF", NUMSAMPS + 0x24, "WAVE", "fmt ", 
                                           sizeof (PCMWAVEFORMAT), 1, 1, SAMPRATE, 
                                           SAMPRATE, 1, 8, "data", NUMSAMPS } ;
         static WAVEFORM    * pwaveform ;
         FILETIME             ft ;
         HINSTANCE            hInstance ;
         INITCOMMONCONTROLSEX icex ;
         int                  i, cxChar, cyChar ;
         LARGE_INTEGER        li ;
         SYSTEMTIME           st ;
          switch (message)
         {
         case WM_CREATE:
              // Initialisierungskram
              hInstance = (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE) ;
    
              icex.dwSize = sizeof (icex) ;
              icex.dwICC  = ICC_DATE_CLASSES ;
              InitCommonControlsEx (&icex) ;
    
              // WAV-Datei mit sich abwechselnden Rechteckwellen erzeugen 
              pwaveform = (WAVEFORM*) malloc (sizeof (WAVEFORM) + NUMSAMPS) ;
              * pwaveform = waveform ;
    
              for (i = 0 ; i < HALFSAMPS ; i++)
                   if (i % 600 < 300)
                        if (i % 16 < 8)
                             pwaveform->byData[i] = 25 ;
                        else
                             pwaveform->byData[i] = 230 ;
                   else
                        if (i % 8 < 4)
                             pwaveform->byData[i] = 25 ;
                        else
                             pwaveform->byData[i] = 230 ;
    
              // Zeichenhöhe ermitteln und feste Fenstergröße setzen
              cxChar = LOWORD (GetDialogBaseUnits ()) ;
              cyChar = HIWORD (GetDialogBaseUnits ()) ;
    
              SetWindowPos (hwnd, NULL, 0, 0, 
                            48 * cxChar,                    // Fensterbreite
                            10 * cyChar / 3 + 2 * GetSystemMetrics (SM_CYBORDER) +
                                                  GetSystemMetrics (SM_CYCAPTION),
                            SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE) ; 
    
              // Drei Child-Fenster anlegen 
              hwndDTP = CreateWindow (DATETIMEPICK_CLASS, TEXT (""), 
                             WS_BORDER | WS_CHILD | WS_VISIBLE | DTS_TIMEFORMAT,
                             2 * cxChar, cyChar, 12 * cxChar, 4 * cyChar / 3, 
                             hwnd, (HMENU) ID_TIMEPICK, hInstance, NULL) ;
    
              hwndCheck = CreateWindow (TEXT ("Button"), TEXT ("Alarm aktivieren"),
                             WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,
                             16 * cxChar, cyChar, 18 * cxChar, 4 * cyChar / 3,
                             hwnd, (HMENU) ID_CHECKBOX, hInstance, NULL) ;
    
              hwndPush = CreateWindow (TEXT ("Button "), TEXT ("Abschalten"),
                             WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_DISABLED,
                             34 * cxChar, cyChar, 10 * cxChar, 4 * cyChar / 3,
                             hwnd, (HMENU) ID_PUSHBTN, hInstance, NULL) ;
    
              hwndFocus = hwndDTP ;
    
               // Untergeordnete Fenster registrieren 
              SubbedProc [ID_TIMEPICK] = (WNDPROC) 
                             SetWindowLong (hwndDTP, GWL_WNDPROC, (LONG) SubProc) ;
              SubbedProc [ID_CHECKBOX] = (WNDPROC) 
                             SetWindowLong (hwndCheck, GWL_WNDPROC, (LONG) SubProc);
              SubbedProc [ID_PUSHBTN] = (WNDPROC) 
                             SetWindowLong (hwndPush, GWL_WNDPROC, (LONG) SubProc) ;
    
              // Zeit/Datums-Kontrollelement auf aktuelle Datum- und Zeitwerte 
              // plus 9 Stunden nach unten auf die nächste volle Stunde gerundet setzen
              GetLocalTime (&st) ;
              SystemTimeToFileTime (&st, &ft) ;
              li = * (LARGE_INTEGER *) &ft ;
              li.QuadPart += 9 * FTTICKSPERHOUR ; 
              ft = * (FILETIME *) &li ;
              FileTimeToSystemTime (&ft, &st) ;
              st.wMinute = st.wSecond = st.wMilliseconds = 0 ;
              SendMessage (hwndDTP, DTM_SETSYSTEMTIME, 0, (LPARAM) &st) ;
              return 0 ;
    
         case WM_SETFOCUS:
              SetFocus (hwndFocus) ;
              return 0 ;
    
         case WM_COMMAND:
              switch (LOWORD (wParam))      // Kennung des auslösenden Kontrollelements 
              {
              case ID_CHECKBOX:
    
                    // Wenn der Benutzer den Alarm einschaltet, Weckzeit in das Kontrollelement für 
                    // Zeit und Datum übernehmen und davon die aktuelle PC-Zeit abziehen.
                    if (SendMessage (hwndCheck, BM_GETCHECK, 0, 0))
                   {
                        SendMessage (hwndDTP, DTM_GETSYSTEMTIME, 0, (LPARAM) &st) ;
                        SystemTimeToFileTime (&st, &ft) ;
                        li = * (LARGE_INTEGER *) &ft ;
    
                        GetLocalTime (&st) ;
                        SystemTimeToFileTime (&st, &ft) ;
                        li.QuadPart -= ((LARGE_INTEGER *) &ft)->QuadPart ;
    
                        // Sicherstellen, dass die Zeit zwischen 0 und 24 Uhr liegt!
                        // Damit wird man auch den Datumsanteil der SYSTEMTIME-Struktur los
                        while (li.QuadPart < 0)
                             li.QuadPart += 24 * FTTICKSPERHOUR ;
    
                        li.QuadPart %= 24 * FTTICKSPERHOUR ;
    
                         // Timer setzen (Tschüß, bis morgen früh!)
                        SetTimer (hwnd, ID_TIMER, (int) (li.QuadPart / 10000), 0) ;
                   }
                   else   // Wenn das Kästchen nicht angekreuzt ist, Timer ausschalten
                        KillTimer (hwnd, ID_TIMER) ;
    
                   return 0 ;
    
                   // Die Schaltfläche "Abschalten" schaltet den Alarm ab, setzt das 
                   // Kästchen "Alarm aktivieren" zurück und deaktiviert sich selbst.
    
              case ID_PUSHBTN:
                   PlaySound (NULL, NULL, 0) ;
                   SendMessage (hwndCheck, BM_SETCHECK, 0, 0) ;
                   EnableWindow (hwndDTP, TRUE) ;
                   EnableWindow (hwndCheck, TRUE) ;
                   EnableWindow (hwndPush, FALSE) ;
                   SetFocus (hwndDTP) ;
                   return 0 ;
              }
              return 0 ;
    
                   // Die WM_NOTIFY-Nachricht kommt von der Zeit/Datumskontrolle.
                   // Wenn der Benutzer das Kästchen "Alarm aktivieren" angekreuzt hat, danach aber 
                   // die Alarmzeit verstellt hat, kann es sein, dass die angezeigte Zeit nicht mehr 
                   // mit der Weckzeit übereinstimmt. Das Programm setzt daher das Kästchen 
                   // "Alarm aktivieren" sowie den Timer zurück.
    
         case WM_NOTIFY:
              switch (wParam)          // Kennung
              {
              case ID_TIMEPICK:
                   switch (((NMHDR *) lParam)->code)       // Inhalt der Nachricht
                   {
                   case DTN_DATETIMECHANGE:
                        if (SendMessage (hwndCheck, BM_GETCHECK, 0, 0))
                        {
                             KillTimer (hwnd, ID_TIMER) ;
                             SendMessage (hwndCheck, BM_SETCHECK, 0, 0) ;
                        }
                        return 0 ;
                   }
              }
              return 0 ;
    
         case WM_TIMER:
              // Wenn diese Nachricht eintrifft, Timer freigeben, da er seinen 
              // Zweck erfüllt hat, und Alarmklang ausgeben.
              KillTimer (hwnd, ID_TIMER) ;
              PlaySound ((PTSTR) pwaveform,  NULL, 
                         SND_MEMORY | SND_LOOP | SND_ASYNC);
    
              // Möge der schläfrige Benutzer den Alarm durch Betätigen der Leertaste ausschalten. 
              // Wenn das Fenster minimiert ist, wird es wiederhergestellt, dann die Schaltfläche 
              // "Abschalten" aktiviert und der Eingabefokus darauf gesetzt.
              EnableWindow (hwndDTP, FALSE) ;
              EnableWindow (hwndCheck, FALSE) ;
              EnableWindow (hwndPush, TRUE) ;
    
              hwndFocus = hwndPush ;
              ShowWindow (hwnd, SW_RESTORE) ;
              SetForegroundWindow (hwnd) ;
              return 0 ;
    
              // Aufräumen, wenn der Alarm noch an oder der Timer noch gesetzt ist
          case WM_DESTROY:
              free (pwaveform) ;
    
              if (IsWindowEnabled (hwndPush))
                   PlaySound (NULL, NULL, 0) ;
    
              if (SendMessage (hwndCheck, BM_GETCHECK, 0, 0))
                   KillTimer (hwnd, ID_TIMER) ;
    
              PostQuitMessage (0) ;
              return 0 ;
         }
         return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
    
    LRESULT CALLBACK SubProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
         int idNext, id = GetWindowLong (hwnd, GWL_ID) ;
    
         switch (message)
         {
         case WM_CHAR:
              if (wParam == '\t')
              {
                   idNext = id ;
    
                   do
                        idNext = (idNext + (GetKeyState (VK_SHIFT) < 0 ? 2 : 1)) % 3 ;
                   while (!IsWindowEnabled (GetDlgItem (GetParent (hwnd), idNext)));
    
                   SetFocus (GetDlgItem (GetParent (hwnd), idNext)) ;
                   return 0 ;
              }
              break ;
    
         case WM_SETFOCUS:
              hwndFocus = hwnd ;
              break ;
         }
         return CallWindowProc (SubbedProc [id], hwnd, message, wParam, lParam) ;
    }
    

    Lösunng für INITCOMMONCONTROLSEX habe ich aus anderen Foren gefunden:

    #define _WIN32_IE 0x0400
    


  • Also erstmal fehler dir zwei Bibliotheken:

    #pragma comment(lib, "comctl32.lib")
    #pragma comment(lib, "Winmm.lib")
    

    Zweitens, existiert die Klasse "Button " nicht. -> "Button". Kein Leerzeichen danach!
    Deshalb erscheint der Abschalte-Button auch nicht und der Sound kann gar nicht mal abgespielt werden!

    Dittens: Schau in der MSDN nach: PlaySound()
    Woher soll die Funktion wissen, was sie abspielen muss?

    Sollte dann so in etwa aussehen:

    PlaySound(L"test.wav", NULL, SND_FILENAME) ;
    

    Gruß



  • Ey!



  • #include <windows.h>
    #include <commctrl.h>
    #include <mmsystem.h>
    
         // Kennungen der 3 untergeordneten Fenster
    
    #define ID_TIMEPICK 0
    #define ID_CHECKBOX 1
    #define ID_PUSHBTN  2
    
         // Timer-Kennung
    
    #define ID_TIMER    3
    
    // Anzahl der 100-Nanosekundenintervalle je Stunde (FILETIME-Ticks) 
    #define FTTICKSPERHOUR (60 * 60 * (LONGLONG) 10000000)
    
    // Strukturdefinition für eine WAV-Datei
    #define SAMPRATE  11025
    #define NUMSAMPS  (3 * SAMPRATE)
    #define HALFSAMPS (NUMSAMPS / 2) 
    
    // Hauptfensterroutine und Fensterroutine für untergeordnete Fenster
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
    LRESULT CALLBACK SubProc (HWND, UINT, WPARAM, LPARAM) ;
    
    // Originale Fensterroutinen-Adressen für untergeordnete Fenster 
    WNDPROC SubbedProc [3] ;
    
    // Aktuelles Unterfenster mit Eingabefokus 
    HWND hwndFocus ;
    
    typedef struct 
    {
         char  chRiff[5] ;
         DWORD dwRiffSize ;
         char  chWave[5] ;
         char  chFmt [5] ;
         DWORD dwFmtSize ;
         PCMWAVEFORMAT pwf ;
         char  chData[5] ;
         DWORD dwDataSize ;
         BYTE  byData[0] ;
    } WAVEFORM; 
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInst, PSTR szCmdLine, int iCmdShow)
    {
         static TCHAR szAppName [] = TEXT ("WakeUp") ;
         HWND         hwnd ;
         MSG          msg ;
         WNDCLASS     wndclass ;
    
         wndclass.style         = 0 ;
         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) (1 + COLOR_BTNFACE) ;
         wndclass.lpszMenuName  = NULL ;
         wndclass.lpszClassName = szAppName ;
    
         if (!RegisterClass (&wndclass))
         {
              // UNICODE-Kompilierung ist die einzige realistische Fehlermöglichkeit
              MessageBox (NULL, TEXT ("Programm arbeitet mit Unicode und setzt Windows NT voraus!"),
                          szAppName, MB_ICONERROR) ;
              return 0 ;
         }
    
         hwnd = CreateWindow (szAppName, szAppName,
                              WS_OVERLAPPED | WS_CAPTION | 
                                              WS_SYSMENU | WS_MINIMIZEBOX,
                              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 HWND          hwndDTP, hwndCheck, hwndPush ;
         static WAVEFORM      _waveform = { "RIFF", NUMSAMPS + 0x24, "WAVE", "fmt ", 
                                           sizeof (PCMWAVEFORMAT), 1, 1, SAMPRATE, 
                                           SAMPRATE, 1, 8, "data", NUMSAMPS } ;
         static WAVEFORM    * pwaveform ;
         FILETIME             ft ;
         HINSTANCE            hInstance ;
         //INITCOMMONCONTROLSEX icex ;
         int                  i, cxChar, cyChar ;
         LARGE_INTEGER        li ;
         SYSTEMTIME           st ;
    
          switch (message)
         {
         case WM_CREATE:
              // Initialisierungskram
              hInstance = (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE) ;
    
              //icex.dwSize = sizeof (icex) ;
             // icex.dwICC  = ICC_DATE_CLASSES ;
             // InitCommonControlsEx (&icex) ;
    
              // WAV-Datei mit sich abwechselnden Rechteckwellen erzeugen 
              pwaveform =(WAVEFORM*) malloc (sizeof (WAVEFORM) + NUMSAMPS) ;
              * pwaveform = _waveform ;
    
              for (i = 0 ; i < HALFSAMPS ; i++)
                   if (i % 600 < 300)
                        if (i % 16 < 8)
                             pwaveform->byData[i] = 25 ;
                        else
                             pwaveform->byData[i] = 230 ;
                   else
                        if (i % 8 < 4)
                             pwaveform->byData[i] = 25 ;
                        else
                             pwaveform->byData[i] = 230 ;
    
              // Zeichenhöhe ermitteln und feste Fenstergröße setzen
              cxChar = LOWORD (GetDialogBaseUnits ()) ;
              cyChar = HIWORD (GetDialogBaseUnits ()) ;
    
              SetWindowPos (hwnd, NULL, 0, 0, 
                            48 * cxChar,                    // Fensterbreite
                            15 * cyChar / 3 + 2 * GetSystemMetrics (SM_CYBORDER) +
                                                  GetSystemMetrics (SM_CYCAPTION),
                            SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE) ; 
    
              // Drei Child-Fenster anlegen 
              hwndDTP = CreateWindow (DATETIMEPICK_CLASS, TEXT (""), 
                             WS_BORDER | WS_CHILD | WS_VISIBLE | DTS_TIMEFORMAT,
                             2 * cxChar, cyChar, 12 * cxChar, 4 * cyChar / 3, 
                             hwnd, (HMENU) ID_TIMEPICK, hInstance, NULL) ;
    
              hwndCheck = CreateWindow (TEXT ("Button"), TEXT ("Alarm aktivieren"),
                             WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,
                             16 * cxChar, cyChar, 18 * cxChar, 4 * cyChar / 3,
                             hwnd, (HMENU) ID_CHECKBOX, hInstance, NULL) ;
    
              hwndPush = CreateWindow (TEXT ("Button "), TEXT ("Abschalten"),
                             WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_DISABLED,
                             34 * cxChar, cyChar, 10 * cxChar, 4 * cyChar / 3,
                             hwnd, (HMENU) ID_PUSHBTN, hInstance, NULL) ;
    
              hwndFocus = hwndDTP ;
    
               // Untergeordnete Fenster registrieren 
              SubbedProc [ID_TIMEPICK] = (WNDPROC) 
                             SetWindowLong (hwndDTP, GWL_WNDPROC, (LONG) SubProc) ;
              SubbedProc [ID_CHECKBOX] = (WNDPROC) 
                             SetWindowLong (hwndCheck, GWL_WNDPROC, (LONG) SubProc);
              SubbedProc [ID_PUSHBTN] = (WNDPROC) 
                             SetWindowLong (hwndPush, GWL_WNDPROC, (LONG) SubProc) ;
    
              // Zeit/Datums-Kontrollelement auf aktuelle Datum- und Zeitwerte 
              // plus 9 Stunden nach unten auf die nächste volle Stunde gerundet setzen
              GetLocalTime (&st) ;
              SystemTimeToFileTime (&st, &ft) ;
              li = * (LARGE_INTEGER *) &ft ;
              li.QuadPart += 9 * FTTICKSPERHOUR ; 
              ft = * (FILETIME *) &li ;
              FileTimeToSystemTime (&ft, &st) ;
              st.wMinute = st.wSecond = st.wMilliseconds = 0 ;
              SendMessage (hwndDTP, DTM_SETSYSTEMTIME, 0, (LPARAM) &st) ;
              return 0 ;
    
         case WM_SETFOCUS:
              SetFocus (hwndFocus) ;
              return 0 ;
    
         case WM_COMMAND:
              switch (LOWORD (wParam))      // Kennung des auslösenden Kontrollelements 
              {
              case ID_CHECKBOX:
    
                    // Wenn der Benutzer den Alarm einschaltet, Weckzeit in das Kontrollelement für 
                    // Zeit und Datum übernehmen und davon die aktuelle PC-Zeit abziehen.
                    if (SendMessage (hwndCheck, BM_GETCHECK, 0, 0))
                   {
                        SendMessage (hwndDTP, DTM_GETSYSTEMTIME, 0, (LPARAM) &st) ;
                        SystemTimeToFileTime (&st, &ft) ;
                        li = * (LARGE_INTEGER *) &ft ;
    
                        GetLocalTime (&st) ;
                        SystemTimeToFileTime (&st, &ft) ;
                        li.QuadPart -= ((LARGE_INTEGER *) &ft)->QuadPart ;
    
                        // Sicherstellen, dass die Zeit zwischen 0 und 24 Uhr liegt!
                        // Damit wird man auch den Datumsanteil der SYSTEMTIME-Struktur los
                        while (li.QuadPart < 0)
                             li.QuadPart += 24 * FTTICKSPERHOUR ;
    
                        li.QuadPart %= 24 * FTTICKSPERHOUR ;
    
                         // Timer setzen (Tschüß, bis morgen früh!)
                        SetTimer (hwnd, ID_TIMER, (int) (li.QuadPart / 10000), 0) ;
                   }
                   else   // Wenn das Kästchen nicht angekreuzt ist, Timer ausschalten
                        KillTimer (hwnd, ID_TIMER) ;
    
                   return 0 ;
    
                   // Die Schaltfläche "Abschalten" schaltet den Alarm ab, setzt das 
                   // Kästchen "Alarm aktivieren" zurück und deaktiviert sich selbst.
    
              case ID_PUSHBTN:
                   PlaySound (NULL, NULL, 0) ;
                   SendMessage (hwndCheck, BM_SETCHECK, 0, 0) ;
                   EnableWindow (hwndDTP, TRUE) ;
                   EnableWindow (hwndCheck, TRUE) ;
                   EnableWindow (hwndPush, FALSE) ;
                   SetFocus (hwndDTP) ;
                   return 0 ;
              }
              return 0 ;
    
                   // Die WM_NOTIFY-Nachricht kommt von der Zeit/Datumskontrolle.
                   // Wenn der Benutzer das Kästchen "Alarm aktivieren" angekreuzt hat, danach aber 
                   // die Alarmzeit verstellt hat, kann es sein, dass die angezeigte Zeit nicht mehr 
                   // mit der Weckzeit übereinstimmt. Das Programm setzt daher das Kästchen 
                   // "Alarm aktivieren" sowie den Timer zurück.
    
         case WM_NOTIFY:
              switch (wParam)          // Kennung
              {
              case ID_TIMEPICK:
                   switch (((NMHDR *) lParam)->code)       // Inhalt der Nachricht
                   {
                   case DTN_DATETIMECHANGE:
                        if (SendMessage (hwndCheck, BM_GETCHECK, 0, 0))
                        {
                             KillTimer (hwnd, ID_TIMER) ;
                             SendMessage (hwndCheck, BM_SETCHECK, 0, 0) ;
                        }
                        return 0 ;
                   }
              }
              return 0 ;
    
         case WM_TIMER:
              // Wenn diese Nachricht eintrifft, Timer freigeben, da er seinen 
              // Zweck erfüllt hat, und Alarmklang ausgeben.
              KillTimer (hwnd, ID_TIMER) ;
              PlaySound ((PTSTR) pwaveform,  NULL, 
                         SND_MEMORY | SND_LOOP | SND_ASYNC);
    
              // Möge der schläfrige Benutzer den Alarm durch Betätigen der Leertaste ausschalten. 
              // Wenn das Fenster minimiert ist, wird es wiederhergestellt, dann die Schaltfläche 
              // "Abschalten" aktiviert und der Eingabefokus darauf gesetzt.
              EnableWindow (hwndDTP, FALSE) ;
              EnableWindow (hwndCheck, FALSE) ;
              EnableWindow (hwndPush, TRUE) ;
    
              hwndFocus = hwndPush ;
              ShowWindow (hwnd, SW_RESTORE) ;
              SetForegroundWindow (hwnd) ;
              return 0 ;
    
              // Aufräumen, wenn der Alarm noch an oder der Timer noch gesetzt ist
          case WM_DESTROY:
              free (pwaveform) ;
    
              if (IsWindowEnabled (hwndPush))
                   PlaySound (NULL, NULL, 0) ;
    
              if (SendMessage (hwndCheck, BM_GETCHECK, 0, 0))
                   KillTimer (hwnd, ID_TIMER) ;
    
              PostQuitMessage (0) ;
              return 0 ;
         }
         return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
    
    LRESULT CALLBACK SubProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
         int idNext, id = GetWindowLong (hwnd, GWL_ID) ;
    
         switch (message)
         {
         case WM_CHAR:
              if (wParam == '\t')
              { 
                   idNext = id ;
    
                   do
                        idNext = (idNext + (GetKeyState (VK_SHIFT) < 0 ? 2 : 1)) % 3 ;
                   while (!IsWindowEnabled (GetDlgItem (GetParent (hwnd), idNext)));
    
                   SetFocus (GetDlgItem (GetParent (hwnd), idNext)) ;
                   return 0 ;
              }
              break ;
    
         case WM_SETFOCUS:
              hwndFocus = hwnd ;
              break ;
         }
         return CallWindowProc (SubbedProc [id], hwnd, message, wParam, lParam) ;
    }
    

    INITCOMMONCONTROLSEX habe auskomentiert weil mit Pragma und Makefils bekomme ich den selber Fehler, siehe ersten Post. Einzige lösung um den Fehler zu beheben:

    #define _WIN32_IE 0x0400
    

    Die Steuerelemente TimePicker und CheckBox werden problemlos ohne INITCOMMONCONTROLSEX initialisiert. Ich habe echt keine ahnung wie ich libcommctrl32.a noch in Projeckt rein bekommen, obwohl habe alle nötigste Libs gelinkt und Header includiert.
    Einziges was mir noch fellt, das die geschriebene daten in *pwaveform werden nicht abgespielt.In Projeckt von Charles Petzold funz alles bestens nur bei mir unter Code::Blocks klemmts.
    Kann mir jemand helfen und erklären warum die Daten werden nicht abgespielt ?



  • Evtl. weil Code::Blocks den MinGW Compiler verwendet...



  • Die gedanken mir auch schon durh Kopf geschossen.
    Ich lasse mich jetzt nicht von INITCOMMONCONTROLSE stören, Steuerelemente werden initialisiert und angezeigt.



  • Alexey schrieb:

    [...] was mir in viele Projekte von Charles Pet. aufgefallen, dass in Code werden nicht immer und nicht überall Datentypen casting vorgenommen, von daher beim ausführe der Code haufen casting fehler. Wie ist des in VS, nimmt VS Compiler autimatisch Datentypen casting vor ??? [...]

    Und jetzt nochmal in Deutsch und mit Farbe, bitte?


  • Mod

    👍



  • Ich befürchte Alexey hat entdeckt, dass C und C++ zwei verschiedene Sprachen sind, jedoch ist er sich darüber anscheinend noch nicht im Klaren. Charles Petzolds Beispiele sind in C geschrieben. Dort ist u.A. der erste Fehler nämlich kein Fehler und Casts sind weniger anzutreffen.

    Lustigerweise ist es ja sonst so, dass Anfänger, die Visual Studio verwenden und C programmieren möchten, stattdessen (unelegantes) C++ schreiben. Interessant, dass das auch bei C::B passiert!



  • ha ha, sehr lustig !!!
    Die Beispiele sind in Visual C++ Developer Studio geschrieben. Neee es kommt nicht in frage, das ich Visual Studio 2012/Visual C++ installiere. Ich habe mit MS Produkte schlechte erfahrung gemacht.
    Hier: http://www.amazon.de/Windows-Programmierung-Das-Entwicklerhandbuch-zur-WIN32-API/dp/3860631888
    Für anfang reicht Code:Blocks und MinGW.



  • 🙄

    Lies mal den ersten Satz im ersten Kapitel. Der ist sogar auf Amazon in der Buchvorschau enthalten.



  • Mein Ziel Nativen Sprachen kennen zu lernen, ja die Projekte sind in C geschrieben. Hab mich gewaltig verhaut, jetzt weise ich was zu tun....keine weitere fragen, war mein gewaltiges fehler, damit ist der Thread erledigt !!!!

    Ich befürchte Alexey hat entdeckt, dass C und C++ zwei verschiedene Sprachen

    @EinGast: ...... Hilfe wäre viel sinnvoller als nur bla bla bla bla..... Nativen sprachen ist für mich absolutes Neu Welt...kleinen dank für Ansatz !



  • Inwiefern war ich denn nicht hilfreich? Ich habe doch deine (schlecht formulierte) Frage beantwortet und eine Verwechslung deinerseits aufgeklärt. Und das ohne eine Gegenleistung zu verlangen! Außerdem hast du dich bedankt. 😕



  • Danke für die Hilfe !!!
    Habe vergessen das die Beispiele in C geschrieben sind, nächstes mal werde ich besser aufpassen.



  • Du darfst nicht einfach die länge der char-arrays erhöhen!
    Die (das? der?) WAVEFORM-struct muss schon die Originallänge behalten. In c++ kannst du mit memcpy die bytes an die richtige stelle kopieren:

    memcpy(&waveform.chRiff, "RIFF", 4);
    

    ~Ich weiß grad' nicht, ob es die funktion auch in c gibt. Ich glaube nicht
    *schäm weil kein passendes c-beispiel dahab*~


Anmelden zum Antworten