codice:
void WindowApplication::SetMousePosition (int iX, int iY)
{
HWND hWnd = (HWND)IntToPtr(m_iWindowID);
POINT kPoint;
kPoint.x = (LONG)iX;
kPoint.y = (LONG)iY;
ClientToScreen(hWnd,&kPoint);
SetCursorPos(kPoint.x,kPoint.y);
}
//----------------------------------------------------------------------------
void WindowApplication::GetMousePosition (int& riX, int& riY) const
{
HWND hWnd = (HWND)IntToPtr(m_iWindowID);
POINT kPoint;
GetCursorPos(&kPoint);
ScreenToClient(hWnd,&kPoint);
riX = (int)kPoint.x;
riY = (int)kPoint.y;
}
//----------------------------------------------------------------------------
int WindowApplication::GetStringWidth (const char* acText) const
{
if (!acText || strlen(acText) == 0)
{
return 0;
}
HWND hWnd = (HWND)IntToPtr(m_iWindowID);
HDC hDC = GetDC(hWnd);
SIZE kSize;
GetTextExtentPoint32(hDC,acText,(int)strlen(acText),&kSize);
ReleaseDC(hWnd,hDC);
return (int)kSize.cx;
}
//----------------------------------------------------------------------------
int WindowApplication::GetCharacterWidth (const char cCharacter) const
{
HWND hWnd = (HWND)IntToPtr(m_iWindowID);
HDC hDC = GetDC(hWnd);
SIZE kSize;
GetTextExtentPoint32(hDC,&cCharacter,1,&kSize);
ReleaseDC(hWnd,hDC);
return (int)kSize.cx;
}
//----------------------------------------------------------------------------
int WindowApplication::GetFontHeight () const
{
HWND hWnd = (HWND)IntToPtr(m_iWindowID);
HDC hDC = GetDC(hWnd);
TEXTMETRIC kMetric;
GetTextMetrics(hDC,&kMetric);
ReleaseDC(hWnd,hDC);
return (int)kMetric.tmHeight;
}
//----------------------------------------------------------------------------
LRESULT CALLBACK MsWindowEventHandler (HWND hWnd, UINT uiMsg, WPARAM wParam,
LPARAM lParam)
{
WindowApplication* pkTheApp =
(WindowApplication*)Application::TheApplication;
if (!pkTheApp || !pkTheApp->GetWindowID())
{
return DefWindowProc(hWnd,uiMsg,wParam,lParam);
}
switch (uiMsg)
{
case WM_PAINT:
{
PAINTSTRUCT kPS;
BeginPaint(hWnd,&kPS);
pkTheApp->OnDisplay();
EndPaint(hWnd,&kPS);
return 0;
}
case WM_ERASEBKGND:
{
// This tells Windows not to erase the background (and that the
// application is doing so).
return 1;
}
case WM_MOVE:
{
int iXPos = int(LOWORD(lParam));
int iYPos = int(HIWORD(lParam));
pkTheApp->OnMove(iXPos,iYPos);
return 0;
}
case WM_SIZE:
{
int iWidth = int(LOWORD(lParam));
int iHeight = int(HIWORD(lParam));
pkTheApp->OnResize(iWidth,iHeight);
return 0;
}
case WM_CHAR:
{
unsigned char ucKey = (unsigned char)(char)wParam;
// quit application if the KEY_TERMINATE key is pressed
if (ucKey == pkTheApp->KEY_TERMINATE)
{
PostQuitMessage(0);
return 0;
}
// get the cursor position in client coordinates
POINT kPoint;
GetCursorPos(&kPoint);
ScreenToClient(hWnd,&kPoint);
int iXPos = (int)kPoint.x;
int iYPos = (int)kPoint.y;
pkTheApp->OnKeyDown(ucKey,iXPos,iYPos);
return 0;
}
case WM_KEYDOWN:
{
int iVirtKey = int(wParam);
// get cursor position client coordinates
POINT kPoint;
GetCursorPos(&kPoint);
ScreenToClient(hWnd,&kPoint);
int iXPos = (int)kPoint.x;
int iYPos = (int)kPoint.y;
if ((VK_F1 <= iVirtKey && iVirtKey <= VK_F12)
|| (VK_PRIOR <= iVirtKey && iVirtKey <= VK_DOWN)
|| (iVirtKey == VK_INSERT) || (iVirtKey == VK_DELETE))
{
pkTheApp->OnSpecialKeyDown(iVirtKey,iXPos,iYPos);
}
return 0;
}
case WM_KEYUP:
{
int iVirtKey = int(wParam);
// get the cursor position in client coordinates
POINT kPoint;
GetCursorPos(&kPoint);
ScreenToClient(hWnd,&kPoint);
int iXPos = (int)kPoint.x;
int iYPos = (int)kPoint.y;
if ((VK_F1 <= iVirtKey && iVirtKey <= VK_F12)
|| (VK_PRIOR <= iVirtKey && iVirtKey <= VK_DOWN)
|| (iVirtKey == VK_INSERT) || (iVirtKey == VK_DELETE))
{
pkTheApp->OnSpecialKeyUp(iVirtKey,iXPos,iYPos);
}
else
{
pkTheApp->OnKeyUp((unsigned char)iVirtKey,iXPos,iYPos);
}
return 0;
}
case WM_LBUTTONDOWN:
{
int iXPos = int(LOWORD(lParam));
int iYPos = int(HIWORD(lParam));
pkTheApp->OnMouseClick(WindowApplication::MOUSE_LEFT_BUTTON,
WindowApplication::MOUSE_DOWN,iXPos,iYPos,PtrToUint(wParam));
return 0;
}
case WM_LBUTTONUP:
{
int iXPos = int(LOWORD(lParam));
int iYPos = int(HIWORD(lParam));
pkTheApp->OnMouseClick(WindowApplication::MOUSE_LEFT_BUTTON,
WindowApplication::MOUSE_UP,iXPos,iYPos,PtrToUint(wParam));
return 0;
}
case WM_MBUTTONDOWN:
{
int iXPos = int(LOWORD(lParam));
int iYPos = int(HIWORD(lParam));
pkTheApp->OnMouseClick(WindowApplication::MOUSE_MIDDLE_BUTTON,
WindowApplication::MOUSE_DOWN,iXPos,iYPos,PtrToUint(wParam));
return 0;
}
case WM_MBUTTONUP:
{
int iXPos = int(LOWORD(lParam));
int iYPos = int(HIWORD(lParam));
pkTheApp->OnMouseClick(WindowApplication::MOUSE_MIDDLE_BUTTON,
WindowApplication::MOUSE_UP,iXPos,iYPos,PtrToUint(wParam));
return 0;
}
case WM_RBUTTONDOWN:
{
int iXPos = int(LOWORD(lParam));
int iYPos = int(HIWORD(lParam));
pkTheApp->OnMouseClick(WindowApplication::MOUSE_RIGHT_BUTTON,
WindowApplication::MOUSE_DOWN,iXPos,iYPos,PtrToUint(wParam));
return 0;
}
case WM_RBUTTONUP:
{
int iXPos = int(LOWORD(lParam));
int iYPos = int(HIWORD(lParam));
pkTheApp->OnMouseClick(WindowApplication::MOUSE_RIGHT_BUTTON,
WindowApplication::MOUSE_UP,iXPos,iYPos,PtrToUint(wParam));
return 0;
}
case WM_MOUSEMOVE:
{
int iXPos = int(LOWORD(lParam));
int iYPos = int(HIWORD(lParam));
int iButton = -1;
if (wParam & MK_LBUTTON)
{
iButton = WindowApplication::MOUSE_LEFT_BUTTON;
}
else if (wParam & MK_MBUTTON)
{
iButton = WindowApplication::MOUSE_MIDDLE_BUTTON;
}
else if (wParam & MK_RBUTTON)
{
iButton = WindowApplication::MOUSE_RIGHT_BUTTON;
}
if (iButton >= 0)
{
pkTheApp->OnMotion(iButton,iXPos,iYPos,PtrToUint(wParam));
}
else
{
pkTheApp->OnPassiveMotion(iXPos,iYPos);
}
return 0;
}
case WM_MOUSEWHEEL:
{
short sWParam = (short)(HIWORD(wParam));
int iDelta = ((int)sWParam)/WHEEL_DELTA;
int iXPos = int(LOWORD(lParam));
int iYPos = int(HIWORD(lParam));
unsigned int uiModifiers = (unsigned int)(LOWORD(wParam));
pkTheApp->OnMouseWheel(iDelta,iXPos,iYPos,uiModifiers);
return 0;
}
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
}
}
return DefWindowProc(hWnd,uiMsg,wParam,lParam);
}
//----------------------------------------------------------------------------
int WindowApplication::Main (int, char**)
{
WindowApplication* pkTheApp = (WindowApplication*)TheApplication;
pkTheApp->KEY_TERMINATE = WindowApplication::KEY_ESCAPE;