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++
XalonDas 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.