Problems with GDI objects in C++

cyberphant0m

Member
Oct 21, 2003
99
0
0
Im reading a book about programming windows forms. I entered an example from the book into Visual C++ 6, and I get the following:

// PROGRAM FROM BOOK
#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 = CreateWindow("WinProg", "Window",
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_DESTROY:
PostQuitMessage(0);
return 0;
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); // <<
// These two lines cause the errors below
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;
default:
return DefWindowProc(hWnd, uiMessage, wParam, lParam);
}
}

// COMPILER ERRORS
c:\programs\window\window.cpp(59) : error C2440: '=' : cannot convert from 'void *' to 'struct HBRUSH__ *'
Conversion from 'void*' to pointer to non-'void' requires an explicit cast
c:\programs\window\window.cpp(60) : error C2440: '=' : cannot convert from 'void *' to 'struct HPEN__ *'
Conversion from 'void*' to pointer to non-'void' requires an explicit cast
Error executing cl.exe.



I've downloaded a chm version of the Win32 API Reference, and looked through it, but can't figure out for the life of me what is wrong... If anyone is interested, the book is Windows Programming with C++ by Henning Hansen.

Thanks in advance for any help provided...
 

Kntx

Platinum Member
Dec 11, 2000
2,270
0
71
hBrushalt = SelectObject(hdc, &hBrush);
hPenalt = SelectObject(hdc, &hPen);


try that yo.
 

DaveSimmons

Elite Member
Aug 12, 2001
40,730
670
126
If you look it up, SelectObject() returns a HGDIOBJ not a HFONT or a HPEN. C allows implicit casts but in C++ you must explicitly tell the compiler to convert from one type to another, e.g.

hOldFont = (HFONT) SelectObject(hdc, hfTitle) ;

just like if you try saying
float x = 1.25 ;
int i = x ;