1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

C++ /WinAPI - Programm hat einen(kleinen) Fehler

Discussion in 'Programmieren' started by C.M.Obrecht, Sep 7, 2007.

Thread Status:
Not open for further replies.
  1. Das Programm hat einen wahrscheinlich kleinen Fehler. Die Buttons sind noch nicht richtig beschriftet, kommt noch von der Fenstervorlage :) Jedenfalls, es sollte beim einen utton ein Öffnen-Dialog zeigen und dann eine ausgewählte mp3-Datei abspielen; mit dem anderen lässt es sich beenden.
    Allerdings spielt es nicht (keine Ahnung wieso, in einem ähnlichen Programm geht es und die Zeilen werden ausgeführt, MessageBox kommt auch) und wenn man danach nochmals den Dialog sehen will erscheint er nicht mehr. Ausserdem passiert nichts wenn man den 2. Button klickt (sollte eine Frage zum beenden kommen).
    Ich vermute entweder ein return 0 /Break oder einen falschen Abschluss eines Codeblockes.Findet jemand den Fehler?

    Daanke!
    Code:
     #include <windows.h>
     #include <commdlg.h>
     #include <string>
     #include <mmsystem.h>
    
    
    
    
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    const char szAppName[] = "Ein eigenes Fenster mit Text und Button";
    char filename[255];
    char mci1[] = "open ";
    char mci2[] = " alias MyAlias";
    
    char mcistop[] = "stop MyAlias";
    char mciclose[] = "close MyAlias";
    char mcifilename[255];
    char szShortName[12];
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                       PSTR szCmdLine, int iCmdShow)
    {
      HWND       hWnd;
        MSG        msg;
        WNDCLASS   wc;
        wc.style         =  CS_HREDRAW | CS_VREDRAW;
       wc.lpfnWndProc   =  WndProc;
       wc.cbClsExtra    =  0;
       wc.cbWndExtra    =  0;
    
       wc.hInstance     =  hInstance;
       wc.hCursor       =  LoadCursor(NULL,IDC_ARROW);
       wc.hIcon         =  LoadIcon(NULL,IDI_APPLICATION);
       wc.hbrBackground =  (HBRUSH)GetStockObject(WHITE_BRUSH);
       wc.lpszClassName =  szAppName;
       wc.lpszMenuName  =  NULL;
       RegisterClass(&wc);
    
       hWnd = CreateWindow(szAppName,
                           "Titelleiste :-p",
                           WS_OVERLAPPEDWINDOW,
                           CW_USEDEFAULT,          /* X-Position auf dem Monitor */
                           CW_USEDEFAULT,          /* Y-Position auf dem Monitor */
                           CW_USEDEFAULT,          /* Fensterbreite              */
                           CW_USEDEFAULT,          /* Fensterhoehe               */
                           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 hButton;  //Buttons
    static HWND hButton2;
    
    
         switch (message)
         {
         case WM_CREATE:   //Buttons
            {
    
    hButton = CreateWindow(  "button",
                                      "juhee :-D",
                                      WS_CHILD | WS_VISIBLE,
                                      0, 0, 0, 0,
                                      hWnd,
                                      NULL,
                                      ((LPCREATESTRUCT) lParam) -> hInstance,
                                      NULL);
    
                                      hButton2 = CreateWindow(  "button",
                                                                      "Beenden",
                                                                      WS_CHILD | WS_VISIBLE,
                                                                      0, 0, 0, 0,
                                                                      hWnd,
                                                                      NULL,
                                                                      ((LPCREATESTRUCT) lParam) -> hInstance,
                                                                      NULL);
    
    
             return 0;
          }
       case WM_SIZE:
          {
    
    MoveWindow(hButton, LOWORD(lParam) / 2 - 80, HIWORD(lParam) - 30,
       160, 22, TRUE);
        MoveWindow(hButton2, LOWORD(lParam) / 2 - 80, HIWORD(lParam) - 60,
         160, 22, TRUE);
            return 0;
         }
    
    case WM_COMMAND:
          {
             if (lParam == (LPARAM)hButton)
             {
                if (HIWORD(wParam) == BN_CLICKED)
    
              {
    OPENFILENAME ofn;       // common dialog box structure
    char szFile[260];       // buffer for file name
    HWND hwnd;              // owner window
    HANDLE hf;              // file handle
    
    // Initialize OPENFILENAME
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(ofn);
    ofn.hwndOwner = hWnd;
    ofn.lpstrFile = szFile;
    //
    // Set lpstrFile[0] to '\0' so that GetOpenFileName does not
    // use the contents of szFile to initialize itself.
    //
    ofn.lpstrFile[0] = '\0';
    ofn.nMaxFile = sizeof(szFile);
    ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
    ofn.nFilterIndex = 1;
    ofn.lpstrFileTitle = NULL;
    ofn.nMaxFileTitle = 0;
    ofn.lpstrInitialDir = NULL;
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
    
    // Display the Open dialog box.
    
    if (GetOpenFileName(&ofn)==TRUE)
        hf = CreateFile(ofn.lpstrFile, GENERIC_READ,
            0, (LPSECURITY_ATTRIBUTES) NULL,
            OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
            (HANDLE) NULL);
    
    
    
    MessageBox (0, ofn.lpstrFile, "OK", MB_ICONWARNING);
    
    GetShortPathName (ofn.lpstrFile, szShortName, 255);
    strcat (mcifilename, mci1);
    strcat (mcifilename, szShortName);
    strcat (mcifilename, mci2);
    
    
    
    
     mciSendString (mcifilename,0,0,0);
     MessageBox (0, mcifilename, "mci-str", MB_ICONWARNING);
     mciSendString ("play MyAlias", 0, 0, 0);
    }
    
             }
    
    
    
    
             if (lParam == (LPARAM)hButton2)  //Button2
             {
                if (HIWORD(wParam) == BN_CLICKED)
                   MessageBox (0, "Chasch denn guet klicke", "Super! ", 64);
    
                   int Antwort=MessageBox (0, "Zuemache !?", "Super! ",MB_ICONERROR| MB_YESNO);
                   {
                   if (IDYES==Antwort)
    
                   MessageBox (0, "Denn halt :-p", "OK", MB_ICONWARNING);
                   }
                   if (IDYES==Antwort) {
                   SendMessage(hWnd, WM_CLOSE, 0, 0);
    
                   }
             }
    
           return 0;
          }
    
         case WM_PAINT: //Text
         {
         PAINTSTRUCT ps;
             HDC         hDC;
             const char  szText[] = "Hallo, dies ist der Text.";
             const char szText2[]="Das isch nomol e Text!!!";
             hDC = BeginPaint(hWnd, &ps);
             {
    
               TextOut(hDC, 50, 50, szText, sizeof(szText) - 1);
               TextOut (hDC, 90, 90, szText2, sizeof(szText2) -1);
    
               }
             EndPaint(hWnd, &ps);
    
    
    
             return 0;       // ENDE neu Text
         }
    
    
    
         case WM_DESTROY:
          {
             mciSendString (mcistop,0,0,0);
             mciSendString (mciclose,0,0,0);
             PostQuitMessage(0);
             return 0;
          }
       }
    
    return DefWindowProc(hWnd, message, wParam, lParam);
    }
    
     
  2. Hallo!
    mit welchen programm kann man das schreiben weil z.B mit dem editor geht das ja nicht!
    Also welches programm
    mfg
     
  3. Klar geht das mit dem Editor; musst einfach die Datei als .c oder .cpp abspeichern anstatt als .txt. Und dann manuell kompilieren. Ich habe Borland C++ BuilderX genommen dazu.
     
  4. Michi0815

    Michi0815 Guest

    nur mal so als schuß ins blaue, ohne den text genau gelesen zu haben:

    du hast deine button handles lokal in der callback-proc definiert. _normalerweise_ ist das keine besonders gute idee, weil diese variablen dazu neigen ihren inhalt zu vergessen, wenn die procedure später wieder aufgerufen wird...
     
  5. Ah ja; könnte das die Ursache sein dass man nur einmal klicken kann und der Beenden-Button nicht geht? Wie könnte man es sonst machen? Habe nicht so viel Erfahrung mit WinAPI eben aber komm da nicht drumherum da ich Programme ohne Runtime und schnellere schreiben möchte.
     
  6. Michi0815

    Michi0815 Guest

    ja, durchaus
    die variablen global zu definieren hilft üblicherweise dagegen
    ohne runtime heisst nicht unbedingt schneller. die winapi hat ihre vorteile, aber auch ihre nachteile. was willst du genau erreichen?



    btw...
    dein programmierstiel ist für geschwindigkeitsoptimierung ungeeignet.
     
  7. Das Programm sollte auch auf dem Pentium 133 Laptop mit 32 Mb funktionieren; da ist das sicher immernoch schneller als wenn eine Visual Basic-Laufzeitumgebung im Speicher gehalten werden muss, und MFC habe ich nicht.
    Hab in Assembler so etwas programmiert, auch mit mciSendString, bin allerdings an der Stringverkettung hängen geblieben (geht nur in der falschen Reihenfolge sonst Absturz), habe zum Testen dann einen fixen Dateinamen angegeben und es macht wirklich einen Unterschied zum VB5-Programm.
     
Thread Status:
Not open for further replies.

Share This Page