error in my book? Win32 error...

Started by
14 comments, last by Strumpan_ 21 years, 8 months ago
Hi! I have some error when I try to compile a project on the CD that came with my BOOK? The Exe file that was already compiled is working but not the code... its a very simple code but if I dont get this cleat I think its usless to coninue... This is The code: --------------------------------------------------------- // PROG4_1.CPP - A complete windows program // INCLUDES /////////////////////////////////////////////// #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <windowsx.h> #include <stdio.h> #include <math.h> // DEFINES //////////////////////////////////////////////// // defines for windows #define WINDOW_CLASS_NAME "WINCLASS1" // GLOBALS //////////////////////////////////////////////// HWND main_window_handle = NULL; // save the window handle // FUNCTIONS ////////////////////////////////////////////// LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { // this is the main message handler of the system PAINTSTRUCT ps; // used in WM_PAINT HDC hdc; // handle to a device context // what is the message switch(msg) { case WM_CREATE: { // do initialization stuff here return(0); } break; case WM_PAINT: { // simply validate the window hdc = BeginPaint(hwnd,&ps); EndPaint(hwnd,&ps); return(0); } break; case WM_DESTROY: { // kill the application PostQuitMessage(0); return(0); } break; default:break; } // end switch // process any messages that we didn''t take care of return (DefWindowProc(hwnd, msg, wparam, lparam)); } // end WinProc // WINMAIN //////////////////////////////////////////////// int WINAPI WinMain( HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow) { WNDCLASS winclass; // this will hold the class we create HWND hwnd; // generic window handle MSG msg; // generic message // first fill in the window class stucture winclass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW; winclass.lpfnWndProc = WindowProc; winclass.cbClsExtra = 0; winclass.cbWndExtra = 0; winclass.hInstance = hinstance; winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); winclass.hCursor = LoadCursor(NULL, IDC_ARROW); winclass.hbrBackground = GetStockObject(BLACK_BRUSH); winclass.lpszMenuName = NULL; winclass.lpszClassName = WINDOW_CLASS_NAME; // register the window class if (!RegisterClass(&winclass)) return(0); // create the window if (!(hwnd = CreateWindow(WINDOW_CLASS_NAME, // class "Hello Dave", // title WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0,0, // x,y 320,200, // width, height NULL, // handle to parent NULL, // handle to menu hinstance,// instance NULL))) // creation parms return(0); // save the window handle in a global main_window_handle = hwnd; // enter main event loop while(1) { if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { // test if this is a quit if (msg.message == WM_QUIT) break; // translate any accelerator keys TranslateMessage(&msg); // send the message to the window proc DispatchMessage(&msg); } // end if // main game processing goes here } // end while // return to Windows like this return(msg.wParam); } // end WinMain /////////////////////////////////////////////////////////// -------------------------------------------------------------- Thats just a simple black window and the following error is displayed in my compiler (MSVS 6.0): --------------------Configuration: PROG4_1 - Win32 Debug-------------------- Compiling... PROG4_1.CPP c:\c++\source\gpchap4\prog4_1.cpp(82) : error C2440: ''='' : cannot convert from ''void *'' to ''struct HBRUSH__ *'' Conversion from ''void*'' to pointer to non-''void'' requires an explicit cast Error executing cl.exe. PROG4_1.OBJ - 1 error(s), 0 warning(s) I have n idea please tell me as soon as possible!
Advertisement
Well, I''ve not done any windows programming yet, but I found your problem. apparently the book did have an error, or you left your typecast out.

On this line...

winclass.hbrBackground = GetStockObject(BLACK_BRUSH); 


change it to this

winclass.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH); 


This tells the compiler that the Void Pointer returned by GetStockObject is pointing to an object of type HBRUSH. Called Typecasting... I can''t really describe it more than that though. I''m new to all this.

Program does compile and run with above change. good luck!



~~~~~~~~~~~
Chris Vogel
~~~~~~~~~~~
WyrmSlayer RPG - In Early Development
thanks...
That was not an error with the book. If you compiled the code in a C compiler, it probably would have worked fine. C++ does not allow you to use a void* without a cast (and HGDIOBJ is just a typedef for void* if I'm not mistaken).

[edited by - SilentCoder on August 16, 2002 7:16:54 PM]
you need the typecast because the function returns a baseclass(HGDIOBJECT), if you look at the documentation for the function youll see it works for a number of objects, and you have to tell it which kind you want back

[edited by - digitec devil on August 16, 2002 6:36:19 PM]
if your using visual C++ 6.0 it gets a little picky about typecasting, so the book you''re using is probably a bit older.
I OWN YOU
I bought it because gamedev is recommending it fow newbies.
Windows Game Programming for Dummies!

Yes its a bit old. around 97 i guess. I also bought Standard C++ Bible really great book

Thanks again guys!
It's a good book, but it has a lot of code errors. Btw, it isn't the Swedish version, is it?



"I have a cursing flasher."

[edited by - parklife on August 19, 2002 6:30:47 AM]
I think the problem is that while the code works on VC++ 5.0, VC++ 6.0 is stricter (which is a good thing) and forces you to use a cast in such cases.

[ MSVC Fixes | STL | SDL | Game AI | Sockets | C++ Faq Lite | Boost | Asking Questions | Organising code files | My stuff ]
yes its the swedish version...

This topic is closed to new replies.

Advertisement