home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / BC_502 / CHESS.PAK / PVALUE.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1997-05-06  |  6.8 KB  |  240 lines

  1. //----------------------------------------------------------------------------
  2. // ObjectWindows - (C) Copyright 1991, 1993 by Borland International
  3. //----------------------------------------------------------------------------
  4. #include <owl/pch.h>
  5. #include <owl/static.h>
  6. //#include <filedial.h>
  7. //#include <inputdia.h>
  8. //#include <bwcc.h>
  9. #include <string.h>
  10. #include <stdio.h>
  11. #include "wcdefs.h"
  12. #include "info.h"
  13. #include "wchess.h"
  14. #include "pvalue.h"
  15. #include "externs.h"
  16.  
  17. const int DefaultValues[5] = {0x90, 0x4c, 0x30, 0x30, 0x10};
  18.  
  19. enum PIECES { pvqueen, pvrook, pvbishop, pvknight, pvpawn};
  20.  
  21. #define min(x, y)  (((x) < (y)) ? (x) : (y))
  22. #define max(x, y)  (((x) > (y)) ? (x) : (y))
  23.  
  24.  
  25. DEFINE_RESPONSE_TABLE1(TPieceValueDialog, TDialog)
  26.   EV_MESSAGE(PV_KILLFOCUS, EvPvKillFocus),
  27.   EV_COMMAND(IDOK, CmOk),
  28.   EV_WM_HSCROLL,
  29.   EV_COMMAND(IDD_DEFAULT, CmDefault),
  30. END_RESPONSE_TABLE;
  31.  
  32. TPieceValueDialog::TPieceValueDialog(TWindow* parent, const char* name)
  33.   : TWindow(parent),
  34.     TDialog(parent, name)
  35. {
  36. }
  37.  
  38. inline void
  39. TPieceValueDialog::PVSetFocus(HWND hWnd)
  40. {
  41.   SendMessage(WM_NEXTDLGCTL, WPARAM(hWnd), 1L);
  42.   ::SendMessage(hWnd, EM_SETSEL, 0, MAKELONG(0, 32767));
  43. }
  44.  
  45. BOOL
  46. TPieceValueDialog::GetColorValue(WORD id)
  47. {
  48.   bool ok;
  49.   int newVal = GetDlgItemInt(id, &ok, TRUE);
  50.  
  51.   int* curVal;
  52.   HWND hScroller;
  53.   switch (id) {
  54.     case IDD_EQUEEN:
  55.       curVal = &Values[pvqueen];
  56.       hScroller = GetDlgItem(IDD_QUEEN);
  57.       break;
  58.     case IDD_EROOK:
  59.       curVal = &Values[pvrook];
  60.       hScroller = GetDlgItem(IDD_ROOK);
  61.       break;
  62.     case IDD_EBISHOP:
  63.       curVal = &Values[pvbishop];
  64.       hScroller = GetDlgItem(IDD_BISHOP);
  65.       break;
  66.     case IDD_EKNIGHT:
  67.       curVal = &Values[pvknight];
  68.       hScroller = GetDlgItem(IDD_KNIGHT);
  69.       break;
  70.     case IDD_EPAWN:
  71.       curVal = &Values[pvpawn];
  72.       hScroller = GetDlgItem(IDD_PAWN);
  73.       break;
  74.     }
  75.  
  76.   if (ok)
  77.     ok = (newVal > 255) ? FALSE : ((newVal < 0) ? FALSE : TRUE);
  78.   else
  79.     newVal = *curVal;
  80.  
  81.   if (!ok) {
  82.     Error("Please enter a valid number between 0 and 255.");
  83.     PVSetFocus(GetDlgItem(id));
  84.  
  85.   } else if (newVal != *curVal) {
  86.     *curVal = newVal;
  87.     ::SetScrollPos(hScroller, SB_CTL, *curVal, TRUE);
  88.   }
  89.   return ok;
  90. }
  91.  
  92. void
  93. TPieceValueDialog::CmOk()
  94. {
  95.   MSG msg;
  96.   while (PeekMessage(&msg, HWindow, PV_KILLFOCUS, PV_KILLFOCUS, PM_NOREMOVE))
  97.     continue;
  98.  
  99.   if (GetColorValue(IDD_EQUEEN) && GetColorValue(IDD_EROOK) &&
  100.       GetColorValue(IDD_EBISHOP) && GetColorValue(IDD_EKNIGHT) &&
  101.       GetColorValue(IDD_EPAWN)) {
  102.     PieceValue[queen] = Values[pvqueen] * 16;
  103.     PieceValue[rook]  = Values[pvrook] * 16;
  104.     PieceValue[bishop] = Values[pvbishop] * 16;
  105.     PieceValue[knight] = Values[pvknight] * 16;
  106.     PieceValue[pawn] = Values[pvpawn] * 16;
  107.     CloseWindow(IDOK);
  108.   }
  109. }
  110.  
  111. void
  112. TPieceValueDialog::SetupWindow()
  113. {
  114.   TDialog::SetupWindow();
  115.  
  116.   Values[pvqueen] = PieceValue[queen] / 16;
  117.   Values[pvrook] = PieceValue[rook] / 16;
  118.   Values[pvbishop] = PieceValue[bishop] / 16;
  119.   Values[pvknight] = PieceValue[knight] / 16;
  120.   Values[pvpawn] = PieceValue[pawn] / 16;
  121.  
  122.   SetDlgItemInt(IDD_EQUEEN, Values[pvqueen], FALSE);
  123.   SetDlgItemInt(IDD_EROOK, Values[pvrook], FALSE);
  124.   SetDlgItemInt(IDD_EBISHOP, Values[pvbishop], FALSE);
  125.   SetDlgItemInt(IDD_EKNIGHT, Values[pvknight], FALSE);
  126.   SetDlgItemInt(IDD_EPAWN, Values[pvpawn], FALSE);
  127.  
  128.   ::SetScrollRange(GetDlgItem(IDD_QUEEN), SB_CTL, 0, 255, FALSE);
  129.   ::SetScrollPos(GetDlgItem(IDD_QUEEN), SB_CTL, Values[pvqueen], FALSE);
  130.  
  131.   ::SetScrollRange(GetDlgItem(IDD_ROOK), SB_CTL, 0, 255, FALSE);
  132.   ::SetScrollPos(GetDlgItem(IDD_ROOK), SB_CTL, Values[pvrook], FALSE);
  133.  
  134.   ::SetScrollRange(GetDlgItem(IDD_BISHOP), SB_CTL, 0, 255, FALSE);
  135.   ::SetScrollPos(GetDlgItem(IDD_BISHOP), SB_CTL, Values[pvbishop], FALSE);
  136.  
  137.   ::SetScrollRange(GetDlgItem(IDD_KNIGHT), SB_CTL, 0, 255, FALSE);
  138.   ::SetScrollPos(GetDlgItem(IDD_KNIGHT), SB_CTL, Values[pvknight], FALSE);
  139.  
  140.   ::SetScrollRange(GetDlgItem(IDD_PAWN), SB_CTL, 0, 255, FALSE);
  141.   ::SetScrollPos(GetDlgItem(IDD_PAWN), SB_CTL, Values[pvpawn], FALSE);
  142. }
  143.  
  144.  
  145. void
  146. TPieceValueDialog::CmDefault()
  147. {
  148.   memcpy(Values, DefaultValues, 5 * sizeof(int));
  149.  
  150.   SetDlgItemInt(IDD_EQUEEN, Values[pvqueen], FALSE);
  151.   SetDlgItemInt(IDD_EROOK, Values[pvrook], FALSE);
  152.   SetDlgItemInt(IDD_EBISHOP, Values[pvbishop], FALSE);
  153.   SetDlgItemInt(IDD_EKNIGHT, Values[pvknight], FALSE);
  154.   SetDlgItemInt(IDD_EPAWN, Values[pvpawn], FALSE);
  155.  
  156.   ::SetScrollPos(GetDlgItem(IDD_QUEEN), SB_CTL, Values[pvqueen], TRUE);
  157.   ::SetScrollPos(GetDlgItem(IDD_ROOK), SB_CTL, Values[pvrook], TRUE);
  158.   ::SetScrollPos(GetDlgItem(IDD_BISHOP), SB_CTL, Values[pvbishop], TRUE);
  159.   ::SetScrollPos(GetDlgItem(IDD_KNIGHT), SB_CTL, Values[pvknight], TRUE);
  160.   ::SetScrollPos(GetDlgItem(IDD_PAWN), SB_CTL, Values[pvpawn], TRUE);
  161. }
  162.  
  163. void
  164. TPieceValueDialog::EvHScroll(UINT scrollCode, UINT thumbPos, HWND hWndCtl)
  165. {
  166.   int id = ::GetDlgCtrlID(hWndCtl);
  167.   HWND hScroller;
  168.   int* curvalue;
  169.   int  dlgitem;
  170.  
  171.   if (id == ::GetDlgCtrlID(hScroller = GetDlgItem(IDD_QUEEN))) {
  172.     curvalue = &Values[pvqueen];
  173.     dlgitem = IDD_EQUEEN;
  174.  
  175.   } else if (id == ::GetDlgCtrlID(hScroller = GetDlgItem(IDD_ROOK))) {
  176.     curvalue = &Values[pvrook];
  177.     dlgitem = IDD_EROOK;
  178.  
  179.   } else if (id == ::GetDlgCtrlID(hScroller = GetDlgItem(IDD_BISHOP))) {
  180.     curvalue = &Values[pvbishop];
  181.     dlgitem = IDD_EBISHOP;
  182.  
  183.   } else if (id == ::GetDlgCtrlID(hScroller = GetDlgItem(IDD_KNIGHT))) {
  184.     curvalue = &Values[pvknight];
  185.     dlgitem = IDD_EKNIGHT;
  186.  
  187.   } else if (id == ::GetDlgCtrlID(hScroller = GetDlgItem(IDD_PAWN))) {
  188.     curvalue = &Values[pvpawn];
  189.     dlgitem = IDD_EPAWN;
  190.  
  191.   } else
  192.     return;
  193.  
  194.   switch (scrollCode) {
  195.     case SB_PAGEDOWN:
  196.       *curvalue += 15;
  197.     case SB_LINEDOWN:
  198.       *curvalue = min(255, *curvalue + 1);
  199.       break;
  200.     case SB_PAGEUP:
  201.       *curvalue -= 15;
  202.     case SB_LINEUP:
  203.       *curvalue = max(0, *curvalue - 1);
  204.       break;
  205.     case SB_TOP:
  206.       *curvalue = 0;
  207.       break;
  208.     case SB_BOTTOM:
  209.       *curvalue = 255;
  210.       break;
  211.     case SB_THUMBPOSITION:
  212.     case SB_THUMBTRACK:
  213.       *curvalue = thumbPos;
  214.     }
  215.   ::SetScrollPos(hScroller, SB_CTL, *curvalue, TRUE);
  216.   SetDlgItemInt(dlgitem, *curvalue, FALSE);
  217. }
  218.  
  219. LRESULT
  220. TPieceValueDialog::EvPvKillFocus(WPARAM wParam, LPARAM)
  221. {
  222.   WORD id = WORD(wParam);
  223.   HWND focus = GetFocus();
  224.   if (GetDlgItem(id) != focus && GetDlgItem(IDCANCEL) != focus &&
  225.       GetDlgItem(IDD_DEFAULT) != focus && GetActiveWindow() == HWindow)
  226.     GetColorValue(id);
  227.   return 0;
  228. }
  229.  
  230. LPARAM
  231. TPieceValueDialog::EvCommand(UINT id, HWND hWndCtl, UINT notifyCode)
  232. {
  233.   if (hWndCtl && notifyCode == EN_KILLFOCUS) {
  234.     if (::SendMessage(hWndCtl, EM_GETMODIFY, 0, 0))
  235.       PostMessage(PV_KILLFOCUS, id);
  236.     return 1;
  237.   }
  238.   return TDialog::EvCommand(id, hWndCtl, notifyCode);
  239. }
  240.