Yesterday i took an example program from Bloodshed Dev C++ 4.9.9.2, which by the way was pretty good, and tried to encapsulated in 2 classes, Window class and Ball class. I am almost sure i have everything typed down correctly, yet i keep getting errors on "undefined reference". I'll post all files of code below for anyone to examine them and see what's the problem:
WinClass.hpp
WinClass.cppCode:#ifndef WinClass_hpp #define WinClass_hpp #include <windows.h> class Window { public: Window(); ~Window(); int Register_Window(WNDPROC WndProc, char ClassName[ ], HINSTANCE g_hInst); int Create_Window(char ClassName[ ], char WindowCaption[ ], HINSTANCE hInst, int wndWidth, int wndHeight); void Show_Window(int nCmdShow); private: WNDCLASSEX wincl; HWND hwnd; }; #endif //WinClass_hpp
BallClass.hppCode:#include "WinClass.hpp" Window::Window() { } Window::~Window() { } int Window::Register_Window(WNDPROC WndProc, char ClassName[ ], HINSTANCE g_hInst) { wincl.hInstance = g_hInst; wincl.lpszClassName = ClassName; wincl.lpfnWndProc = WndProc; wincl.style = CS_DBLCLKS; wincl.cbSize = sizeof(WNDCLASSEX); wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon(NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor(NULL, IDC_ARROW); wincl.lpszMenuName = NULL; wincl.cbClsExtra = 0; wincl.cbWndExtra = 0; wincl.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1); if (!RegisterClassEx(&wincl)) { MessageBox(0, "Window Registration Failed!", "Error", MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL); return 0; } return 1; } int Window::Create_Window(char ClassName[ ], char WindowCaption[ ], HINSTANCE hInst, int wndWidth, int wndHeight) { hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, ClassName, WindowCaption, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, wndWidth, wndHeight, NULL, NULL, hInst, NULL); if (!hwnd) { MessageBox(0, "Window Creation Failed!", "Error", MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL); return 0; } return 1; } void Window::Show_Window(int nCmdShow) { ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); }
BallClass.cppCode:#ifndef BallClass_hpp #define BallClass_hpp #include <windows.h> class Ball { public: Ball(int FirstX, int FirstY, int direct, int speed); ~Ball(); void UpdateBall(HWND hwnd); int LoadImages(HWND hwnd, char Object[ ], char ObjectMask[ ], HINSTANCE g_hInstance); void DrawBall(HDC hdc); void EraseBall(HDC hdc); void DeleteImages(); private: HBITMAP hbmBall, hbmMask; BITMAP bm; int placeX, placeY; int deltaX, deltaY; int deltaValue; }; #endif //BallClass_hpp
resources.rcCode:#include "BallClass.hpp" Ball::Ball(int FirstX, int FirstY, int direct, int speed) { placeX = FirstX; placeY = FirstY; deltaValue = speed; switch ( direct ) { case 1: deltaX = deltaValue; deltaY = deltaValue; break; case 2: deltaX = -deltaValue; deltaY = deltaValue; break; case 3: deltaX = -deltaValue; deltaY = -deltaValue; break; case 4: deltaX = deltaValue; deltaY = -deltaValue; break; } } Ball::~Ball() { } int Ball::LoadImages(HWND hwnd, char Object[ ], char ObjectMask[ ], HINSTANCE g_hInstance) { hbmBall = LoadBitmap(g_hInstance, Object); hbmMask = LoadBitmap(g_hInstance, ObjectMask); if (!hbmBall||!hbmMask) { MessageBox(hwnd, "Load of Resources Failed!", "Error", MB_ICONERROR | MB_OK | MB_SYSTEMMODAL); return 0; } GetObject (hbmBall, sizeof(bm), &bm); return 1; } void Ball::DeleteImages() { DeleteObject (hbmBall); DeleteObject (hbmMask); } void Ball::DrawBall(HDC hdc) { HDC hdcMemory; hdcMemory = CreateCompatibleDC(hdc); SelectObject(hdcMemory, hbmMask); BitBlt(hdc, placeX, placeY, bm.bmWidth, bm.bmHeight, hdcMemory, 0, 0, SRCAND); SelectObject(hdcMemory, hbmBall); BitBlt(hdc, placeX, placeY, bm.bmWidth, bm.bmHeight, hdcMemory, 0, 0, SRCPAINT); DeleteDC(hdcMemory); } void Ball::EraseBall(HDC hdc) { RECT rc; rc.left = placeX; rc.top = placeY; rc.right = placeX + bm.bmWidth; rc.bottom = placeY + bm.bmHeight; FillRect(hdc, &rc, (HBRUSH) (COLOR_BTNFACE + 1)); } void Ball::UpdateBall(HWND hwnd) { RECT rc; GetClientRect(hwnd, &rc); placeX = deltaX; placeY = deltaY; if (placeX < 0) { placeX = 0; deltaX = deltaValue; } else if (placeX + bm.bmWidth > rc.right) { placeX = rc.right - bm.bmWidth; deltaX = -deltaValue; } if (placeY < 0) { placeY = 0; deltaY = deltaValue; } else if (placeY + bm.bmHeight > rc.bottom) { placeY = rc.bottom - bm.bmHeight; deltaY = -deltaValue; } }
main.cppCode:BALLBMP BITMAP "ball.bmp" BMPMASK BITMAP "mask.bmp"
And these are the linker errors i'm getting in both Dev C++ and Code::Blocks:Code:#include <windows.h> #include "WinClass.hpp" #include "BallClass.hpp" char szClassName[ ] = "MyWindowClass"; HINSTANCE g_hInstMain; Ball myBall(200, 150, 2, 4); const UINT idTimer1 = 1; UINT nTimerDelay = 5; LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpstCmdLine, int nCmdShow) { Window myWindow; MSG msg; g_hInstMain = hThisInstance; myWindow.Register_Window(WndProc, szClassName, hThisInstance); myWindow.Create_Window(szClassName, "A Bitmap Program", hThisInstance, 512, 400); myWindow.Show_Window(nCmdShow); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch ( message ) { case WM_CREATE: myBall.LoadImages(hwnd, "BALLBMP", "BMPMASK", g_hInstMain); SetTimer(hwnd, idTimer1, nTimerDelay, NULL); break; case WM_TIMER: HDC hdcWindow; hdcWindow = GetDC(hwnd); myBall.EraseBall(hdcWindow); myBall.UpdateBall(hwnd); myBall.DrawBall(hdcWindow); ReleaseDC(hwnd, hdcWindow); break; case WM_PAINT: PAINTSTRUCT ps; HDC hdcWindow2; hdcWindow = BeginPaint(hwnd, &ps); myBall.DrawBall(hdcWindow2); EndPaint(hwnd, &ps); break; case WM_CLOSE: DestroyWindow(hwnd); break; case WM_DESTROY: KillTimer(hwnd, idTimer1); myBall.DeleteImages(); PostQuitMessage(0); break; default: return DefWindowProc(hwnd, message, wParam, lParam); } return 0; }
Here Code::Blocks;
Please read this and apply if you have a solution.Code:Linking console executable: bin\Debug\WinAnimation.exe obj\Debug\BallClass.o: In function `ZN4Ball10LoadImagesEP6HWND(char *, signed _P, HINSTANCE__)': C:/Users/admin/Desktop/CodeBlocks Projects/WinAnimation/BallClass.cpp:43: undefined reference to `_GetObjectA@12' obj\Debug\BallClass.o: In function `_ZN4Ball12DeleteImagesEv': C:/Users/admin/Desktop/CodeBlocks Projects/WinAnimation/BallClass.cpp:49: undefined reference to `_DeleteObject@4' C:/Users/admin/Desktop/CodeBlocks Projects/WinAnimation/BallClass.cpp:50: undefined reference to `_DeleteObject@4' obj\Debug\BallClass.o: In function `_ZN4Ball8DrawBallEP5HDC__': C:/Users/admin/Desktop/CodeBlocks Projects/WinAnimation/BallClass.cpp:56: undefined reference to `_CreateCompatibleDC@4' C:/Users/admin/Desktop/CodeBlocks Projects/WinAnimation/BallClass.cpp:58: undefined reference to `_SelectObject@8' C:/Users/admin/Desktop/CodeBlocks Projects/WinAnimation/BallClass.cpp:59: undefined reference to `_BitBlt@36' C:/Users/admin/Desktop/CodeBlocks Projects/WinAnimation/BallClass.cpp:61: undefined reference to `_SelectObject@8' C:/Users/admin/Desktop/CodeBlocks Projects/WinAnimation/BallClass.cpp:62: undefined reference to `_BitBlt@36' C:/Users/admin/Desktop/CodeBlocks Projects/WinAnimation/BallClass.cpp:64: undefined reference to `_DeleteDC@4' collect2: ld returned 1 exit status
By the way, my bitmaps are in the same directory as the project.
Thanks in advance!



LinkBack URL
About LinkBacks




