 /* 'mrWindows.cpp' */

 /* Komplementarny plik nagłówka */
#include "mrWindow.h"

 /* Konstruktor domyślny */
mrWindow::mrWindow (void)
{
 /* Nic nie robi */
}

 /* Destruktor domyślny */
mrWindow::~mrWindow (void)
{
 /* Nic nie robi */
}

 /* Tworzenie okna */
mrError32 mrWindow::Create (HINSTANCE hInstance, LPSTR szTitle, mrInt iWidth, 
                            mrInt iHeight, mrUInt32 iStyle)
{
  /* Właściwości wizualne */
 m_kWndClass.hCursor       = LoadCursor (NULL, IDC_ARROW);
 m_kWndClass.hIcon         = LoadIcon (NULL, IDI_APPLICATION);
 m_kWndClass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);

  /* Właściwości systemowe */
 m_kWndClass.hInstance     = hInstance;
 m_kWndClass.lpfnWndProc   = WndProc;
 m_kWndClass.lpszClassName = "Mirus Window";

  /* Właściwości dodatkowe */
 m_kWndClass.lpszMenuName  = NULL;

 m_kWndClass.cbClsExtra = NULL;
 m_kWndClass.cbWndExtra = NULL;
 m_kWndClass.style      = NULL;

  /* Próba rejestracji klasy */
 if (!RegisterClass (&m_kWndClass))
 {
  return mrErrorRegisterClass;
 }

  /* Utworzenie okna */
 m_hWindow = CreateWindow ("Mirus Window", szTitle, iStyle, CW_USEDEFAULT,
                           CW_USEDEFAULT, iWidth, iHeight, 
                           NULL, NULL, hInstance, (void *) this);
 SetWindowText (m_hWindow, szTitle);

 return mrNoError;
}

 /* Normalny program obsługi komunikatów - przekierowuje komunikaty do naszego*/
LRESULT CALLBACK mrWindow::WndProc (HWND hWindow, UINT iMessage, 
                                    WPARAM wParam, LPARAM lParam)
{
 mrWindow * pkWindow   = NULL;
 mrBool32   bProcessed = mrFalse;

 switch (iMessage)
 {
  /* Okno jest tworzone - ustawienie informacji własnych */
 case WM_NCCREATE:
  SetWindowLong (hWindow, GWL_USERDATA, 
                 (long)((LPCREATESTRUCT(lParam))->lpCreateParams));
  break;
  /* Komunikat okna - niech obsłuży go nasz program obsługi */
 default:
   pkWindow = (mrWindow *) GetWindowLong (hWindow, GWL_USERDATA);
   if (NULL != pkWindow)
   {
    bProcessed = pkWindow->MessageHandler (iMessage, wParam, lParam);
   }
  break;
 }
   /* Komunikat nie przetworzony - niech obsłuży go Windows */
 if (mrFalse == bProcessed)
 {
  return DefWindowProc (hWindow, iMessage, wParam, lParam);
 }
 return 0;
}

 /* Pętla czasu rzeczywistego */
void mrWindow::Run (void)
{
 while (1)
 {
   /* Zapytanie o oczekujące w kolejce komunikaty */
  if (PeekMessage (&m_kMessage, m_hWindow, 0, 0, PM_REMOVE))
  {
    /* Jeżeli komunikat to WM_QUIT - wyjdź z pętli */
   if (WM_QUIT == m_kMessage.message)
   {
    break;
   }
    /* Przetwarzaj komunikat normalnie */
   else
   {
    TranslateMessage (&m_kMessage);
    DispatchMessage (&m_kMessage);
   }
  }
    /* Brak komunikatu, wykonuj funkcje Frame */
  else
  {
   Frame ();
  }
 }
}

 /* Nasz program obsługi */
mrBool32 mrWindow::MessageHandler (UINT iMessage, WPARAM wParam, 
                                   LPARAM lParam)
{
 switch (iMessage)
 {
  /* Zamknij okno */
 case WM_CLOSE:
  PostQuitMessage (0);
  return mrTrue;
 break;
  /* Nie obsłużony - niech obsłuży go Windows */
 default:
  return mrFalse;
 break;
 }
}


void mrWindow::SetPosition (mrInt iX, mrInt iY)
{
  /* Ustaw pozycję okna */
 SetWindowPos(m_hWindow, HWND_TOP, iX, iY, 0, 0, SWP_NOSIZE);
}


POINT mrWindow::GetPosition (void)
{
 RECT  rcWindow;
 POINT pPosition;
  /* Pobierz pozycję okna */
 GetWindowRect (m_hWindow, &rcWindow);

 pPosition.x = rcWindow.left;
 pPosition.y = rcWindow.top;
 
 return pPosition;
}


void mrWindow::SetSize (mrInt iWidth, mrInt iHeight)
{
  /* Ustaw rozmiar okna */
 SetWindowPos(m_hWindow, HWND_TOP, 0, 0, iWidth, iHeight, SWP_NOMOVE);
}


POINT mrWindow::GetSize (void)
{
 RECT  rcWindow;
 POINT pSize;
  /* Pobierz rozmiar okna */
 GetWindowRect (m_hWindow, &rcWindow);

 pSize.x = rcWindow.right  - rcWindow.left;
 pSize.y = rcWindow.bottom - rcWindow.top;
 
 return pSize;
}


void mrWindow::Show (mrInt iShow)
{
  /* Zmień status okna (widzialne/niewidzialne) */
 ShowWindow (m_hWindow, iShow);
}



 