Y0rkieP
July 13th, 2007, 10:32 AM
Hi there,
I'm trying to get a ball that follows the mouse pointer around the screen. To start with I'v made it static to the pointer & it should display below/right of the pointer.
I'v Googled & Yahoo'd, but can only find info on how to do this using a class that someone has made, but I want to learn how to do it myself. So I have written code to achieve this & it compiles fine . No errors are reported in loading the bmp and the point structure seems to be valid from the display of my app window. The only thing I lack is the ball...
Please see code below:
main.cpp (using dev-cpp & win.h definitions fixing GDI problems)
#include <windows.h>
#include "resource.h"
/* Declare Windows procedure */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
/* Make the class name into a global variable */
char szClassName[ ] = "WindowsApp";
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nFunsterStil)
{
HWND hwnd; /* This is the handle for our window */
MSG messages; /* Here messages to the application are saved */
WNDCLASSEX wincl; /* Data structure for the windowclass */
/* The Window structure */
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */
wincl.style = CS_DBLCLKS; /* Catch double-clicks */
wincl.cbSize = sizeof (WNDCLASSEX);
/* Use default icon and mouse-pointer */
wincl.hIcon = LoadIcon (hThisInstance, MAKEINTRESOURCE(IDI_ICON));
wincl.hIconSm = LoadIcon (hThisInstance, MAKEINTRESOURCE(IDI_ICON));
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL; /* No menu */
wincl.cbClsExtra = 0; /* No extra bytes after the window class */
wincl.cbWndExtra = 0; /* structure or the window instance */
/* Use Windows's default color as the background of the window */
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
/* Register the window class, and if it fails quit the program */
if (!RegisterClassEx (&wincl))
return 0;
/* The class is registered, let's create the program*/
hwnd = CreateWindowEx (
0, /* Extended possibilites for variation */
szClassName, /* Classname */
"Windows App", /* Title Text */
WS_OVERLAPPEDWINDOW, /* default window */
CW_USEDEFAULT, /* Windows decides the position */
CW_USEDEFAULT, /* where the window ends up on the screen */
200, /* The programs width */
100, /* and height in pixels */
HWND_DESKTOP, /* The window is a child-window to desktop */
NULL, /* No menu */
hThisInstance, /* Program Instance handler */
NULL /* No Window Creation data */
);
/* Make the window visible on the screen */
ShowWindow (hwnd, nFunsterStil);
/* Run the message loop. It will run until GetMessage() returns 0 */
while (GetMessage (&messages, NULL, 0, 0))
{
/* Translate virtual-key messages into character messages */
TranslateMessage(&messages);
/* Send message to WindowProcedure */
DispatchMessage(&messages);
}
/* The program return-value is 0 - The value that PostQuitMessage() gave */
return messages.wParam;
}
/* This function is called by the Windows function DispatchMessage() */
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HINSTANCE hInstance;
POINT ptCursor;
HWND hDesk;
HDC hDeskDC;
HBITMAP bmBall;
BITMAP bm;
char szInfo[40]; int iLen;
switch (message) /* handle the messages */
{
case WM_CREATE:
{
HINSTANCE hInstance = ((LPCREATESTRUCT) lParam)->hInstance;
hDesk = GetDesktopWindow();
//hDeskDC = GetDC(hDesk);
bmBall = LoadBitmap (hInstance, MAKEINTRESOURCE(IDB_IMAGE));
if (bmBall == NULL)
{
MessageBox (hwnd, "resource not loaded..", "Error", MB_OK);
}
int obj = GetObject (bmBall, sizeof (BITMAP), &bm);
if (obj == NULL)
{
MessageBox (hwnd, "error with GetObject()..", "Error", MB_OK);
}
SetTimer(hwnd, 1, 100, NULL);
}
break;
case WM_TIMER:
{
InvalidateRect(hwnd, NULL, FALSE);
}
break;
case WM_PAINT:
{
HDC hDC, hdcMem;
PAINTSTRUCT ps;
GetCursorPos (&ptCursor);
hDC = BeginPaint (hwnd, &ps);
hDeskDC = GetDC(hDesk);
//hdcMem = CreateCompatibleDC(hDC);
hdcMem = CreateCompatibleDC(hDeskDC); // Will ball show?
SelectObject (hdcMem, bmBall);
TransparentBlt(hDeskDC, (ptCursor.x + 32), (ptCursor.y + 32), 28, 28, hdcMem, 0, 0, 28, 28, RGB(255, 0, 255));
DeleteDC (hdcMem);
DeleteDC(hDeskDC);
iLen = wsprintf (szInfo, "x = %d ", ptCursor.x);
TextOut (hDC, 0, 0, szInfo, iLen);
iLen = wsprintf (szInfo, "y = %d ", ptCursor.y);
TextOut (hDC, 0, 32, szInfo, iLen);
EndPaint (hwnd, &ps);
//InvalidateRect(hDesk, NULL, FALSE); // Still wont show ball
}
break;
case WM_DESTROY:
{
KillTimer (hwnd, 1);
//DeleteDC(hDeskDC);
PostQuitMessage (0); /* send a WM_QUIT to the message queue */
}
break;
default: /* for messages that we don't deal with */
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
resource.h
#define IDI_ICON 1000
#define IDB_IMAGE 1010
resource.rc
#include "resource.h"
IDB_IMAGE BITMAP "c:\\dev-cpp\\examples\\Bmp2Scr\\Ball.bmp"
IDI_ICON ICON "c:\\dev-cpp\\examples\\Bmp2Scr\\Icon.ico"
As you can see, I'v tryed different things, but with no apparrent success. It's possibly something small that i'v missed. As usual, my thanks in advance for any help given...
I'm trying to get a ball that follows the mouse pointer around the screen. To start with I'v made it static to the pointer & it should display below/right of the pointer.
I'v Googled & Yahoo'd, but can only find info on how to do this using a class that someone has made, but I want to learn how to do it myself. So I have written code to achieve this & it compiles fine . No errors are reported in loading the bmp and the point structure seems to be valid from the display of my app window. The only thing I lack is the ball...
Please see code below:
main.cpp (using dev-cpp & win.h definitions fixing GDI problems)
#include <windows.h>
#include "resource.h"
/* Declare Windows procedure */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
/* Make the class name into a global variable */
char szClassName[ ] = "WindowsApp";
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nFunsterStil)
{
HWND hwnd; /* This is the handle for our window */
MSG messages; /* Here messages to the application are saved */
WNDCLASSEX wincl; /* Data structure for the windowclass */
/* The Window structure */
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */
wincl.style = CS_DBLCLKS; /* Catch double-clicks */
wincl.cbSize = sizeof (WNDCLASSEX);
/* Use default icon and mouse-pointer */
wincl.hIcon = LoadIcon (hThisInstance, MAKEINTRESOURCE(IDI_ICON));
wincl.hIconSm = LoadIcon (hThisInstance, MAKEINTRESOURCE(IDI_ICON));
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL; /* No menu */
wincl.cbClsExtra = 0; /* No extra bytes after the window class */
wincl.cbWndExtra = 0; /* structure or the window instance */
/* Use Windows's default color as the background of the window */
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
/* Register the window class, and if it fails quit the program */
if (!RegisterClassEx (&wincl))
return 0;
/* The class is registered, let's create the program*/
hwnd = CreateWindowEx (
0, /* Extended possibilites for variation */
szClassName, /* Classname */
"Windows App", /* Title Text */
WS_OVERLAPPEDWINDOW, /* default window */
CW_USEDEFAULT, /* Windows decides the position */
CW_USEDEFAULT, /* where the window ends up on the screen */
200, /* The programs width */
100, /* and height in pixels */
HWND_DESKTOP, /* The window is a child-window to desktop */
NULL, /* No menu */
hThisInstance, /* Program Instance handler */
NULL /* No Window Creation data */
);
/* Make the window visible on the screen */
ShowWindow (hwnd, nFunsterStil);
/* Run the message loop. It will run until GetMessage() returns 0 */
while (GetMessage (&messages, NULL, 0, 0))
{
/* Translate virtual-key messages into character messages */
TranslateMessage(&messages);
/* Send message to WindowProcedure */
DispatchMessage(&messages);
}
/* The program return-value is 0 - The value that PostQuitMessage() gave */
return messages.wParam;
}
/* This function is called by the Windows function DispatchMessage() */
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HINSTANCE hInstance;
POINT ptCursor;
HWND hDesk;
HDC hDeskDC;
HBITMAP bmBall;
BITMAP bm;
char szInfo[40]; int iLen;
switch (message) /* handle the messages */
{
case WM_CREATE:
{
HINSTANCE hInstance = ((LPCREATESTRUCT) lParam)->hInstance;
hDesk = GetDesktopWindow();
//hDeskDC = GetDC(hDesk);
bmBall = LoadBitmap (hInstance, MAKEINTRESOURCE(IDB_IMAGE));
if (bmBall == NULL)
{
MessageBox (hwnd, "resource not loaded..", "Error", MB_OK);
}
int obj = GetObject (bmBall, sizeof (BITMAP), &bm);
if (obj == NULL)
{
MessageBox (hwnd, "error with GetObject()..", "Error", MB_OK);
}
SetTimer(hwnd, 1, 100, NULL);
}
break;
case WM_TIMER:
{
InvalidateRect(hwnd, NULL, FALSE);
}
break;
case WM_PAINT:
{
HDC hDC, hdcMem;
PAINTSTRUCT ps;
GetCursorPos (&ptCursor);
hDC = BeginPaint (hwnd, &ps);
hDeskDC = GetDC(hDesk);
//hdcMem = CreateCompatibleDC(hDC);
hdcMem = CreateCompatibleDC(hDeskDC); // Will ball show?
SelectObject (hdcMem, bmBall);
TransparentBlt(hDeskDC, (ptCursor.x + 32), (ptCursor.y + 32), 28, 28, hdcMem, 0, 0, 28, 28, RGB(255, 0, 255));
DeleteDC (hdcMem);
DeleteDC(hDeskDC);
iLen = wsprintf (szInfo, "x = %d ", ptCursor.x);
TextOut (hDC, 0, 0, szInfo, iLen);
iLen = wsprintf (szInfo, "y = %d ", ptCursor.y);
TextOut (hDC, 0, 32, szInfo, iLen);
EndPaint (hwnd, &ps);
//InvalidateRect(hDesk, NULL, FALSE); // Still wont show ball
}
break;
case WM_DESTROY:
{
KillTimer (hwnd, 1);
//DeleteDC(hDeskDC);
PostQuitMessage (0); /* send a WM_QUIT to the message queue */
}
break;
default: /* for messages that we don't deal with */
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
resource.h
#define IDI_ICON 1000
#define IDB_IMAGE 1010
resource.rc
#include "resource.h"
IDB_IMAGE BITMAP "c:\\dev-cpp\\examples\\Bmp2Scr\\Ball.bmp"
IDI_ICON ICON "c:\\dev-cpp\\examples\\Bmp2Scr\\Icon.ico"
As you can see, I'v tryed different things, but with no apparrent success. It's possibly something small that i'v missed. As usual, my thanks in advance for any help given...