WIEDERMAL Fehler im Buch ?



  • Hi!

    manchmal denk ich es liegt am DEV_C++ (obwohl ich den mag),
    aber sehr oft geht irgenntwas selbst dann nicht wenn ich es 1zu1 eingebe.
    (für mich als Anfänger ist es dann sehr schwer den fehler zu lokalisieren)

    hier mal ein bsp. und ich hoffe ihr könnt mir nen tip geben, weil das gesammte Buch auf dieses listing aufbaut.
    (und um das Programm wirklich zu verstehen muss es ja erstmal laufen...)

    das ganze ist aus folgendem Buch und ohne Fehler eingegeben:

    WINDOWS PROGRAMMIEREN mit C++ von Henning Hansen
    kapitel 2, einführung in die GDI, s.35 bis s.37

    ___________________________________________________________________________
    FEHLERMELDUNG beim Compilieren:
    ___________________________________________________________________________
    37 macro "CreateWindowA" requires 11 arguments, but only 10 given
    [Warning] In function `int WinMain(HINSTANCE__, HINSTANCE__, CHAR*,:

    37 CreateWindowA' undeclared (first use this function) (Each undeclared identifier is reported only once for each [Warning] In functionLRESULT WndProc(HWND__*, unsigned int, unsigned:

    66 invalid conversion from `void*' to `HBRUSH__*'

    67 invalid conversion from `void*' to `HPEN__*'

    80 cannot convert `HPEN__' to `HDC__' for argument `1' to `

    81 cannot convert `HBRUSH__' to `HDC__' for argument `1' to `

    [Build Error] [test-prog.o] Error 1
    __________________________________________________________________________

    SOURCE-CODE:

    // aus WINDOWS-PROGRAMMIERUNG in C++ von HENNING HANSEN
    //
    // original (UND OHNE TIPFEHLER! :) ) zum Test, ob das listing so im 
    // DEV-C++ läuft... !
    
    #include <windows.h>
    
    LRESULT CALLBACK WndProc (HWND,UINT,WPARAM,LPARAM);
    
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    
      {
          WNDCLASS WndClass;
          WndClass.style = 0;    
          WndClass.cbClsExtra = 0;
          WndClass.cbWndExtra = 0;
          WndClass.lpfnWndProc = WndProc;
          WndClass.hInstance = hInstance;
          WndClass.hbrBackground = (HBRUSH) (COLOR_WINDOW+1);
          WndClass.hCursor = LoadCursor (NULL, IDC_ARROW);
          WndClass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
          WndClass.lpszMenuName = 0;
          WndClass.lpszClassName = "WinProg";
    
          RegisterClass(&WndClass);
    
          HWND hWindow; 
    
          hWindow = CreateWindow("WinProg","Fenster",
                                 WS_OVERLAPPEDWINDOW,
                                 0,0,600,460,NULL,NULL
                                 hInstance, NULL);
    
          ShowWindow (hWindow, nCmdShow);
    
          UpdateWindow (hWindow);
    
          MSG Message;
          while (GetMessage(&Message, NULL, 0, 0))
          {
                DispatchMessage(&Message);
          }
          return (Message.wParam);
      }
    
      LRESULT CALLBACK WndProc (HWND hWnd, UINT uiMessage,
                                WPARAM wParam,LPARAM lParam)
      {
         switch(uiMessage)                                                                                              
         {                                                   
            case WM_PAINT:                               
               HPEN hPen;
               HPEN hPenalt;
               HBRUSH hBrush;
               HBRUSH hBrushalt;
               hBrush = CreateSolidBrush (RGB(255,100,0));
               hPen = CreatePen (PS_SOLID,2,RGB(0,255,255));
               HDC hdc;
               PAINTSTRUCT ps;
               hdc = BeginPaint (hWnd, &ps);
               hBrushalt = SelectObject (hdc, hBrush);
               hPenalt = SelectObject (hdc, hPen);
               MoveToEx (hdc, 20, 20, NULL);
               LineTo (hdc, 100, 100);
               Rectangle (hdc, 120, 20, 240, 140); 
               RoundRect (hdc, 260, 20, 420, 140, 20, 20);
               RECT rect;
               SetRect (&rect, 20, 260, 240, 420);
               FrameRect (hdc, &rect, hBrush);
               SetRect (&rect, 260, 260, 420, 420);
               FillRect (hdc, &rect, hBrush);
               Ellipse (hdc, 440, 260, 480, 420);
               SelectObject (hdc, hBrushalt);
               SelectObject (hdc, hPenalt);
               SelectObject (hPen);
               SelectObject (hBrush);
               EndPaint (hWnd, &ps);
               return 0;
            case WM_DESTROY:   
               PostQuitMessage(0);
               return 0;
            default:
               return DefWindowProc (hWnd, uiMessage,
                                     wParam, lParam);
          }
    
    }
    

    ===========================================================================

    wo steckt der verdammte Fehler? wieso kann DEV-c++ nix damit
    anfangen ??

    ich werd noch bekloppt! 😮

    ich hoffe ihr könnt mir helfen, gruß Cayamides



  • -cayamides- schrieb:

    das ganze ist aus folgendem Buch und ohne Fehler
    ...
    0,0,600,460,NULL,NULL

    Steht im Buch am Ende dieser Zeile wirklich kein Komma?



  • Compilermund tut Wahrheit kund.



  • Ok! da is ein komma, ich hab das aber im Listing drin! es geht trotzdem nicht!
    schau dir mal die Fehlermeldungen an...

    bei der Zeile:

    hBrushalt = SelectObject (hdc, hBrush);
    hPenalt   = SelectObject (hdc, hPen);
    

    und die steht wirklich so im Buch!

    kommt die Fehlermeldung:

    invalid conversion from `void*' to `HBRUSH__'
    invalid conversion from `void
    ' to `HPEN__*'

    __ 😕 __

    (übrigens ich hab tatsächlich schon listings in Büchern gesehen wo ; gefehlt hat 😉 )



  • Du musst den Rückgabewert von SelectObject auf HBRUSH bzw. HPEN casten.

    Was ist mit den beiden Zeilen:

    SelectObject (hPen);
    SelectObject (hBrush);

    Stehen die so im Buch?



  • oops! statt:

    SelectObject (hdc, hBrushalt);
    SelectObject (hdc, hPenalt);
    SelectObject (hPen);
    SelectObject (hBrush);
    EndPaint (hWnd, &ps);
    return 0;

    steht:

    SelectObject (hdc, hBrushalt);
    SelectObject (hdc, hPenalt);
    DeleteObject (hPen);
    DeleteObject (hBrush);
    EndPaint (hWnd, &ps);
    return 0;

    aber der Fehler wird immernoch angezeigt:

    invalid conversion from `void*' to `HBRUSH__'
    invalid conversion from `void
    ' to `HPEN__*'
    [Build Error] [w1.o] Error 1

    WAS HEIßT CASTEN?? erklär mal bitte den Begriff, davon ist hier im Buch noch nicht die Rede gewesen..



  • Das Problem ist, der Code ist C, du versuchst aber als C++ zu kompilieren. Entweder die Casts einfügen oder ein C-Projekt (wenn dass denn geht) erstellen.



  • ok C-project einfach

    #include <conio.c>
    

    oder ???

    in nem anderen Forum sagt jemand was von STATIC_CAST !
    wie geht das? kleiner Tip? den rest knoble ich mir schon aus...

    cayamides



  • DrGreenthumb schrieb:

    Das Problem ist, der Code ist C, du versuchst aber als C++ zu kompilieren. Entweder die Casts einfügen oder ein C-Projekt (wenn dass denn geht) erstellen.

    Das Buch heißt immerhin "WINDOWS PROGRAMMIEREN mit C++ "...

    -cayamides- schrieb:

    WAS HEIßT CASTEN?? erklär mal bitte den Begriff, davon ist hier im Buch noch nicht die Rede gewesen..

    Casten ist eine explizite Typumwandlung. Da gibt es verschiedene, du brauchst hier vermutlich reinterpret_cast:

    hBrushalt = reinterpret_cast<HBRUSH>(SelectObject (hdc, hBrush)); 
    hPenalt = reinterpret_cast<HPEN>(SelectObject (hdc, hPen));
    

    Ich rate dir aber dringend, dich erst mit den C++-Grundlagen vertraut zu machen, bevor du mit Windows-Programmierung anfängst.



  • Mir drängt sich der Verdacht auf das sich das alles vonselbst erledigt wenn du den abgetippten Quelltext mit dem Original solange vergleichst bis du dein Leben für die Aussage "der ist Fehlerfrei" riskieren würdest.

    Und casten heisst aus Typ A einen Typ B zu 'zaubern' in der Form
    typ_b var1;
    typ_a var2 = (typ_a)var1; bzw
    typ_a var2 = static_cast<typ_a>(var1);

    *edit* oops genau falschrum



  • MFK schrieb:

    DrGreenthumb schrieb:

    Das Problem ist, der Code ist C, du versuchst aber als C++ zu kompilieren. Entweder die Casts einfügen oder ein C-Projekt (wenn dass denn geht) erstellen.

    Das Buch heißt immerhin "WINDOWS PROGRAMMIEREN mit C++ "...

    Oh, schöne Verarsche.



  • DANKE MFK!!!!

    @ dreaddy! es war doch ein Fehler im Buch (*bäh*)

    nachdem ich die Zeilen:

    hBrushalt = SelectObject (hdc, hBrush);
    hPenalt = SelectObject (hdc, hPen);

    mit dem Vorschlag von MFK ersetzt hab:

    hBrushalt = reinterpret_cast<HBRUSH>(SelectObject (hdc, hBrush));
    hPenalt = reinterpret_cast<HPEN>(SelectObject (hdc, hPen));

    läufts Prima!!!!
    Danke nochmal an alle (und sorry für die zwei Fehler im Listing)

    gruß CAYAMIDES


Anmelden zum Antworten