invalid conversion from `void*' to `HBRUSH__*' << Trotz Code aus Buch



  • Hi,
    bei folgendem Code

    #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);
    DeleteObject (hPen);
    DeleteObject (hBrush);
    EndPaint (hWnd, &ps);
    return 0;
    case WM_DESTROY:
    PostQuitMessage(0);
    return 0;
    default:
    return DefWindowProc (hWnd, uiMessage,
    wParam, lParam);
    }
    }
    

    kommt immer

    In function LRESULT WndProc(HWND__*, UINT, WPARAM, LPARAM)': 49 invalid conversion from \void*' to `HBRUSH__'
    50 invalid conversion from `void
    ' to `HPEN__*'

    die 2 Zeilen sind

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

    Obwohl ich diesen Code direkt aus einem Ebook reuskopiert hab 😮
    Was ist falsch?

    Danke im voraus,
    Xalon



  • Du hast C Code als C++ Code kompiliert.



  • Fazit:

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


  • Danke 😉
    Aber ich dachte man kann C in C++ nutzen?Und das Buch ist für WinAPI und C++ 😕

    Xalon



  • Es gibt in C++ aber keine implizite Umwandlung von void* nach T*. Das musst du schon explizit angeben, zB mit static_cast.



  • Xalon schrieb:

    Danke 😉
    Aber ich dachte man kann C in C++ nutzen?Und das Buch ist für WinAPI und C++ 😕
    Xalon

    Das hat nicht das geringste mit C oder C++ zu tun, sondern liegt
    daran das SelectObject einen void Zeiger zurückliefert, da es
    verschiedene Objekte zurückgeben kann. Caste es in den entsprechenden
    Typen und schon geht es. Dazu reicht übrigens auch unter C++
    ein normaler cast. static_cast und co sind nett, aber man kann
    auch die guten alten C-Cast nehmen.

    Das geht sogar bis zu diesem hier:

    CPoint *GetPoint ();

    CPoint& pt = *GetPoint ()

    if (&pt == NULL)
    {
    bla
    }



  • nesemes schrieb:

    CPoint *GetPoint ();

    CPoint& pt = *GetPoint ()

    if (&pt == NULL)
    {
    bla
    }

    Dir ist aber schon klar, dass das kein gültiges C++ ist, oder? Stichwort: Nullreferenz. Hier bewegst du dich auf dünnem Eis, da der Standard nicht garantiert, dass sowas funktioniert.



  • groovemaster schrieb:

    nesemes schrieb:

    CPoint *GetPoint ();

    CPoint& pt = *GetPoint ()

    if (&pt == NULL)
    {
    bla
    }

    Dir ist aber schon klar, dass das kein gültiges C++ ist, oder? Stichwort: Nullreferenz. Hier bewegst du dich auf dünnem Eis, da der Standard nicht garantiert, dass sowas funktioniert.

    Referenz ist Referenz. Ich laufe dann in Probleme wenn ich die
    Nullreferenz verwende, klar. Aber deswegen wird Sie ja vorher
    abgefragt. Es ist in jeden Fall richtig, dass dies TrickyProgramming
    ist und Lint einem das um die Ohren hauen würde ;-)).



  • nemeses schrieb:

    Referenz ist Referenz. Ich laufe dann in Probleme wenn ich die
    Nullreferenz verwende, klar.

    Was du als Problem bezeichnest ist was anderes als das, was der Standard als Problem bezeichnet. Undefiniertes Verhalten wird bereits durch das Dereferenzieren des Nullpointers ausgelöst.


Anmelden zum Antworten