home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / gamtlk11.zip / source.zip / BLACKJACK / MAINWINDOW.C < prev    next >
C/C++ Source or Header  |  1999-03-29  |  23KB  |  588 lines

  1. /************************************************************************
  2.  *
  3.  * File: MainWindow.C
  4.  *
  5.  * This contains function related to processing of the main window.
  6.  *
  7.  ************************************************************************/
  8. #define INCL_WINWINDOWMGR
  9. #define INCL_WINFRAMEMGR
  10. #define INCL_WINDIALOGS
  11. #define INCL_WINSTDSPIN
  12. #define INCL_WINMENUS
  13. #define INCL_DOSMODULEMGR
  14. #define INCL_DOSSEMAPHORES
  15. #define INCL_GPIPRIMITIVES
  16. #define INCL_GPIBITMAPS
  17. #define INCL_GPILCIDS
  18.  
  19. #include    "BlackJack.H"
  20. #include    "BlackJackRC.H"
  21. #include    <string.h>
  22. #include    <stdio.h>
  23.  
  24.     /* Optimal screen ratio as a function of number of hands */
  25.  
  26. const USHORT    Ratio[MAXHANDS+1][2]={3,3,3,3,6,3,9,3,12,3};
  27.  
  28. extern const char   valueofcard[];
  29.  
  30.     /* Functions contained in Dialogs.C */
  31.  
  32. MRESULT EXPENTRY SettingsDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
  33.  
  34.     /* Functions contained in this file */
  35.  
  36. MRESULT PaintClient(BJACK *BJack);
  37. MRESULT ResizeClient(BJACK *BJack, MPARAM mp1, MPARAM mp2);
  38.  
  39. /************************************************************************
  40.  *
  41.  * MainWindowProc()
  42.  *
  43.  * Procedure for the main window.
  44.  *
  45.  ************************************************************************/
  46. MRESULT EXPENTRY MainWindowProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  47. {
  48.     switch(msg) {
  49.     case MESS_CREATE:
  50.     {
  51.         SWP     DesktopSize;
  52.         BJACK   *BJack=(BJACK *)mp1;
  53.         HMODULE Deck;
  54.         char    Buffer[20], Temp, Temp2;
  55.         HPS     hps;
  56.         SPBCDATA    SpinData;
  57.         BITMAPINFOHEADER    BitmapInfo;
  58.  
  59.         /* Save the window pointer */
  60.         WinSetWindowPtr(BJack->hwndClient, 0, (PVOID)mp1);
  61.  
  62.         /* Show window */
  63.         WinQueryWindowPos(HWND_DESKTOP, &DesktopSize);
  64.  
  65.         DesktopSize.x=(DesktopSize.cx*BJack->xLeft)/65536;
  66.         DesktopSize.y=(DesktopSize.cy*BJack->yBottom)/65536;
  67.         DesktopSize.cx*=(double)(BJack->xRight-BJack->xLeft)/65536;
  68.         DesktopSize.cy*=(double)(BJack->yTop-BJack->yBottom)/65536;
  69.  
  70.         /* Load deck bitmaps */
  71.         if(DosLoadModule(Buffer, sizeof(Buffer), DECKNAME, &Deck))
  72.         {
  73.             WinSendMsg(BJack->hwndFrame, WM_CLOSE, 0, 0);
  74.         }
  75.  
  76.         hps=WinBeginPaint(hwnd, NULLHANDLE, NULL);
  77.  
  78.         BJack->Card[0]=GpiLoadBitmap(hps, Deck, BACK_INDEX, 0, 0);
  79.  
  80.         for(Temp=1;Temp<=NUMCARDS;Temp++)
  81.             if(!(BJack->Card[Temp]=GpiLoadBitmap(hps, Deck, Temp, 0, 0)))
  82.                 BJack->Card[Temp]=BJack->Card[0];
  83.  
  84.         /* Get size parameters from the two of clubs */
  85.         GpiQueryBitmapParameters(BJack->Card[1], &BitmapInfo);
  86.         for(Temp2=0;Temp2<MAXHANDSIZE;Temp2++)
  87.         {
  88.             BJack->DealerHand.Card[Temp2][2].x=0;
  89.             BJack->DealerHand.Card[Temp2][2].y=0;
  90.             BJack->DealerHand.Card[Temp2][3].x=BitmapInfo.cx;
  91.             BJack->DealerHand.Card[Temp2][3].y=BitmapInfo.cy;
  92.  
  93.             for(Temp=0;Temp<MAXHANDS;Temp++)
  94.             {
  95.                 BJack->PlayerHand[Temp].Card[Temp2][2].x=0;
  96.                 BJack->PlayerHand[Temp].Card[Temp2][2].y=0;
  97.                 BJack->PlayerHand[Temp].Card[Temp2][3].x=BitmapInfo.cx;
  98.                 BJack->PlayerHand[Temp].Card[Temp2][3].y=BitmapInfo.cy;
  99.             }
  100.         }
  101.  
  102.         DosFreeModule(Deck);
  103.  
  104.         /* Load chips */
  105.         for(Temp=0;Temp<NUMCHIPS;Temp++)
  106.             BJack->Chip[Temp]=GpiLoadBitmap(hps, (HMODULE)0, CHIP_INDEX, 0, 0);
  107.  
  108.         WinEndPaint(hps);
  109.  
  110.         /* Create buttons */
  111.         WinCreateWindow(hwnd, WC_BUTTON, BJack->Prompt[PMT_HIT], WS_VISIBLE | WS_DISABLED,
  112.             DesktopSize.cx/10, DesktopSize.cy/10, DesktopSize.cx/10, DesktopSize.cy/10, hwnd,
  113.             HWND_TOP, MainHit, NULL, NULL);
  114.  
  115.         WinCreateWindow(hwnd, WC_BUTTON, BJack->Prompt[PMT_STAND], WS_VISIBLE | WS_DISABLED,
  116.             3*DesktopSize.cx/10, DesktopSize.cy/10, DesktopSize.cx/10, DesktopSize.cy/10, hwnd,
  117.             HWND_TOP, MainStand, NULL, NULL);
  118.  
  119.         WinCreateWindow(hwnd, WC_BUTTON, BJack->Prompt[PMT_DOUBLE], WS_VISIBLE | WS_DISABLED,
  120.             5*DesktopSize.cx/10, DesktopSize.cy/10, DesktopSize.cx/10, DesktopSize.cy/10, hwnd,
  121.             HWND_TOP, MainDouble, NULL, NULL);
  122.  
  123.         WinCreateWindow(hwnd, WC_BUTTON, BJack->Prompt[PMT_SPLIT], WS_VISIBLE | WS_DISABLED,
  124.             7*DesktopSize.cx/10, DesktopSize.cy/10, DesktopSize.cx/10, DesktopSize.cy/10, hwnd,
  125.             HWND_TOP, MainSplit, NULL, NULL);
  126.  
  127.         WinCreateWindow(hwnd, WC_BUTTON, BJack->Prompt[PMT_DEAL], WS_VISIBLE,
  128.             9*DesktopSize.cx/10, DesktopSize.cy/10, DesktopSize.cx/10, DesktopSize.cy/10, hwnd,
  129.             HWND_TOP, MainDeal, NULL, NULL);
  130.  
  131.         /* Create bet spin field */
  132.         memset(&SpinData, 0, sizeof(SpinData));
  133.         SpinData.cbSize=sizeof(SpinData);
  134.         SpinData.ulTextLimit=3;
  135.         SpinData.lLowerLimit=5;
  136.         SpinData.lUpperLimit=100;
  137.         WinCreateWindow(hwnd, WC_SPINBUTTON, "5", WS_VISIBLE | SPBS_MASTER | SPBS_NUMERICONLY,
  138.             0.1*DesktopSize.cx/10, DesktopSize.cy/10, DesktopSize.cx/10, DesktopSize.cy/10, hwnd,
  139.             HWND_TOP, MainWager, &SpinData,NULL);
  140.  
  141.         WinSendMsg(WinWindowFromID(hwnd, MainWager), SPBM_SETCURRENTVALUE,
  142.             MPFROMLONG(BJack->Wager), MPFROMLONG(0));
  143.  
  144.         /* Create bank string */
  145.         sprintf(BJack->BankStr, "%s: $%.2f", BJack->Prompt[PMT_BANK], BJack->Bank);
  146.  
  147.         /* Set sound menu check button */
  148.         if(BJack->Flags & FLAG_SOUND)
  149.             WinSendMsg(WinWindowFromID(BJack->hwndFrame, FID_MENU), MM_SETITEMATTR,
  150.                 MPFROM2SHORT(MainSoundOn, TRUE), MPFROM2SHORT(MIA_CHECKED, MIA_CHECKED));
  151.         else WinSendMsg(WinWindowFromID(BJack->hwndFrame, FID_MENU), MM_SETITEMATTR,
  152.                 MPFROM2SHORT(MainSoundOff, TRUE), MPFROM2SHORT(MIA_CHECKED, MIA_CHECKED));
  153.  
  154.         WinSetWindowPos(BJack->hwndFrame, HWND_TOP, DesktopSize.x, DesktopSize.y,
  155.             DesktopSize.cx, DesktopSize.cy, SWP_SIZE | SWP_MOVE | (BJack->SizeFlags & SWP_MAXIMIZE) | SWP_SHOW);
  156.     }   
  157.         break;
  158.      case MESS_DEALT:
  159.         {
  160.             BJACK   *BJack=WinQueryWindowPtr(hwnd, 0);
  161.  
  162.             /* Act based on animation action */
  163.             switch(BJack->AnimateAction) {
  164.             case ANIMATE_DEAL:
  165.                 break;
  166.             default: 
  167.                 return WinDefWindowProc(hwnd, msg, mp1, mp2);
  168.                 break;
  169.             }
  170.         }
  171.         break;
  172.     case WM_PAINT:
  173.         return PaintClient(WinQueryWindowPtr(hwnd, 0));
  174.         break;
  175.     case WM_SIZE:
  176.         return ResizeClient(WinQueryWindowPtr(hwnd, 0), mp1, mp2);
  177.         break;
  178.     case WM_COMMAND:
  179.     {
  180.         BJACK   *BJack=WinQueryWindowPtr(hwnd, 0);
  181.         ULONG  Temp;
  182.  
  183.         switch(SHORT1FROMMP(mp1)) {
  184.         case MainGameAdd100:
  185.             BJack->AnimateAction=ANIMATE_ADD100;
  186.             DosPostEventSem(BJack->AnimateSem);
  187.             break;
  188.         case MainGameExit:
  189.             WinSendMsg(hwnd, WM_CLOSE, 0, 0);
  190.             break;
  191.          case MainSoundOff:
  192.             BJack->Flags&=~FLAG_SOUND;
  193.             WinSendMsg(WinWindowFromID(BJack->hwndFrame, FID_MENU), MM_SETITEMATTR,
  194.                 MPFROM2SHORT(MainSoundOff, TRUE), MPFROM2SHORT(MIA_CHECKED, MIA_CHECKED));
  195.             WinSendMsg(WinWindowFromID(BJack->hwndFrame, FID_MENU), MM_SETITEMATTR,
  196.                 MPFROM2SHORT(MainSoundOn, TRUE), MPFROM2SHORT(MIA_CHECKED, 0));
  197.             break;
  198.         case MainSoundOn:
  199.             BJack->Flags|=FLAG_SOUND;
  200.             WinSendMsg(WinWindowFromID(BJack->hwndFrame, FID_MENU), MM_SETITEMATTR,
  201.                 MPFROM2SHORT(MainSoundOn, TRUE), MPFROM2SHORT(MIA_CHECKED, MIA_CHECKED));
  202.             WinSendMsg(WinWindowFromID(BJack->hwndFrame, FID_MENU), MM_SETITEMATTR,
  203.                 MPFROM2SHORT(MainSoundOff, TRUE), MPFROM2SHORT(MIA_CHECKED, 0));
  204.             break;
  205.         case MainOptionsRules:
  206.             WinDlgBox(HWND_DESKTOP, hwnd, (PFNWP)SettingsDlgProc, BJack->Module,
  207.                 SettingsDlg, (BJack));
  208.             break;
  209.          case MainDeal:
  210.             /* Refuse if the bet cannot be covered */
  211.             WinSendMsg(WinWindowFromID(hwnd, MainWager), SPBM_QUERYVALUE, &Temp,
  212.                 MPFROM2SHORT(0, SPBQ_DONOTUPDATE));
  213.  
  214.             if(BJack->Bank>=Temp)
  215.             {
  216.                 /* Disable the deal window */
  217.                 WinEnableWindow(WinWindowFromID(hwnd, MainDeal), FALSE);
  218.                 WinEnableWindow(WinWindowFromID(hwnd, MainWager), FALSE);
  219.                 BJack->AnimateAction=ANIMATE_DEAL;
  220.                 DosPostEventSem(BJack->AnimateSem);
  221.             }
  222.             break;
  223.          case MainHit:
  224.             /* Take a card */
  225.             BJack->AnimateAction=ANIMATE_HIT;
  226.             DosPostEventSem(BJack->AnimateSem);
  227.             break;
  228.          case MainStand:
  229.             /* Stand */
  230.             BJack->AnimateAction=ANIMATE_STAND;
  231.             DosPostEventSem(BJack->AnimateSem);
  232.             break;
  233.          case MainSplit:
  234.             /* Split the cards */
  235.             BJack->AnimateAction=ANIMATE_SPLIT;
  236.             DosPostEventSem(BJack->AnimateSem);
  237.             break;
  238.          case MainDouble:
  239.             /* Double down */
  240.             BJack->AnimateAction=ANIMATE_DOUBLE;
  241.             DosPostEventSem(BJack->AnimateSem);
  242.             break;
  243.         default: 
  244.             return WinDefWindowProc(hwnd, msg, mp1, mp2);
  245.             break;
  246.         }
  247.     }
  248.         break;
  249.      case WM_CLOSE:
  250.      {
  251.         BJACK   *BJack=WinQueryWindowPtr(hwnd, 0);
  252.         SWP     Position, DesktopSize;
  253.         LONG    Temp;
  254.  
  255.         /* Terminate the animation thread */
  256.         BJack->AnimateAction=ANIMATE_EXIT;
  257.         DosPostEventSem(BJack->AnimateSem);
  258.  
  259.         /* Get window size and save it */
  260.         WinQueryWindowPos(HWND_DESKTOP, &DesktopSize);
  261.         WinQueryWindowPos(BJack->hwndFrame, &Position);
  262.  
  263.         BJack->xLeft=65536*Position.x/DesktopSize.cx;
  264.         BJack->yBottom=65536*Position.y/DesktopSize.cy;
  265.         BJack->xRight=BJack->xLeft+65536*Position.cx/DesktopSize.cx;
  266.         BJack->yTop=BJack->yBottom+65536*Position.cy/DesktopSize.cy;
  267.  
  268.         WinSendMsg(WinWindowFromID(BJack->hwndClient, MainWager),SPBM_QUERYVALUE, &Temp,
  269.             MPFROM2SHORT(0, SPBQ_DONOTUPDATE));
  270.  
  271.         BJack->Wager=Temp;
  272.  
  273.         WinPostMsg(hwnd, WM_QUIT, 0, 0);
  274.     }
  275.         break;
  276.     default: 
  277.         return WinDefWindowProc(hwnd, msg, mp1, mp2);
  278.         break;
  279.     }
  280.     return (MRESULT)FALSE;
  281. }
  282.  
  283. /************************************************************************
  284.  *
  285.  * MRESULT PaintClient(BJACK *BJack)
  286.  *
  287.  * Called whenever the client requires repainting.
  288.  *
  289.  ************************************************************************/
  290. MRESULT PaintClient(BJACK *BJack)
  291. {
  292.     RECTL   Rectl;
  293.     ARCPARAMS   ArcParms={1,1,0,0};
  294.     char    Temp, Temp2, Buffer[16];
  295.     POINTL  Position, TempPos[4];
  296.     SIZEF   Size;
  297.     HPS     hps=WinBeginPaint(BJack->hwndClient, NULLHANDLE, &Rectl);
  298.     FATTRS  FontAttrs;
  299.  
  300.     /* For now, just give us a green background */
  301.     WinFillRect(hps, &Rectl, CLR_DARKGREEN);
  302.  
  303.     GpiSetArcParams(hps, &ArcParms);
  304.     GpiSetLineWidth(hps,LINEWIDTH_THICK);
  305.     Temp=0;
  306.  
  307.     /* Create fonts */
  308.     memset(&FontAttrs, 0, sizeof(FontAttrs));
  309.     FontAttrs.usRecordLength=sizeof(FontAttrs);
  310.     strcpy(FontAttrs.szFacename, BETFONT);
  311.     FontAttrs.fsFontUse=FATTR_FONTUSE_OUTLINE | FATTR_FONTUSE_TRANSFORMABLE;
  312.  
  313.     GpiCreateLogFont(hps, NULL, BETFONTID, &FontAttrs);
  314.  
  315.     strcpy(FontAttrs.szFacename, BANKFONT);
  316.     GpiCreateLogFont(hps, NULL, BANKFONTID, &FontAttrs);
  317.  
  318.     strcpy(FontAttrs.szFacename, HANDFONT);
  319.     GpiCreateLogFont(hps, NULL, HANDFONTID, &FontAttrs);
  320.  
  321.     GpiSetCharSet(hps, BETFONTID);
  322.     Size.cx=MAKEFIXED(BJack->PlayerHand[0].Chip[1].x-BJack->PlayerHand[0].Chip[0].x,0);
  323.     Size.cy=MAKEFIXED(BJack->PlayerHand[0].Chip[1].y-BJack->PlayerHand[0].Chip[0].y,0);
  324.     GpiSetCharBox(hps, &Size);
  325.  
  326.     do
  327.     {
  328.         if(Temp==BJack->HandNum && BJack->NumHands)
  329.             GpiSetColor(hps, CLR_RED);
  330.         else GpiSetColor(hps, CLR_WHITE);
  331.  
  332.         GpiMove(hps, &BJack->PlayerHand[Temp].BetCircle);
  333.         GpiFullArc(hps,DRO_OUTLINE, MAKEFIXED(BJack->PlayerHand[Temp].CircleDiameter,0));
  334.  
  335.         /* Draw player's cards */
  336.         for(Temp2=0;BJack->PlayerHand[Temp].Hand[Temp2];Temp2++)
  337.         {
  338.             memcpy(TempPos, BJack->PlayerHand[Temp].Card[Temp2], sizeof(TempPos));
  339.  
  340.             GpiWCBitBlt(hps, BJack->Card[BJack->PlayerHand[Temp].Hand[Temp2]],
  341.                 4, TempPos, ROP_SRCCOPY, BBO_IGNORE);
  342.         }
  343.  
  344.         /* Fill wager circles */
  345.         GpiCharStringAt(hps, &BJack->PlayerHand[Temp].Chip[0], strlen(BJack->PlayerHand[Temp].BetStr),
  346.             BJack->PlayerHand[Temp].BetStr);
  347.  
  348.         Temp++;
  349.     } while(Temp<BJack->NumHands);
  350.  
  351.     /* Draw dealer's cards */
  352.     for(Temp2=0;BJack->DealerHand.Hand[Temp2];Temp2++)
  353.     {
  354.         memcpy(TempPos, BJack->DealerHand.Card[Temp2], sizeof(TempPos));
  355.  
  356.         GpiWCBitBlt(hps, BJack->Card[(Temp2 || BJack->HandNum>MAXHANDS)?BJack->DealerHand.Hand[Temp2]:0],
  357.             4, TempPos, ROP_SRCCOPY, BBO_IGNORE);
  358.     }
  359.     /* Indicate value of dealer's cards */
  360.     GpiSetCharSet(hps, HANDFONTID);
  361.     Size.cx=MAKEFIXED(BJack->DealerHand.ValuePos[1].y-BJack->DealerHand.ValuePos[0].y,0);
  362.     Size.cy=Size.cx;
  363.     GpiSetCharBox(hps, &Size);
  364.     GpiSetColor(hps, CLR_DARKBLUE);
  365.     GpiCharStringAt(hps, BJack->DealerHand.ValuePos, strlen(BJack->DealerHand.ValueStr),
  366.         BJack->DealerHand.ValueStr);
  367.  
  368.     /* Draw player hand value(s) */
  369.     for(Temp=0;BJack->PlayerHand[Temp].Hand[0];Temp++)
  370.         GpiCharStringAt(hps, BJack->PlayerHand[Temp].ValuePos, strlen(BJack->PlayerHand[Temp].ValueStr),
  371.             BJack->PlayerHand[Temp].ValueStr);
  372.  
  373.     /* Show bank */
  374.     GpiSetCharSet(hps, BANKFONTID);
  375.     Size.cx=MAKEFIXED(BJack->BankPos[1].y-BJack->BankPos[0].y,0);
  376.     Size.cy=Size.cx;
  377.     GpiSetCharBox(hps, &Size);
  378.     GpiSetColor(hps, CLR_WHITE);
  379.     GpiCharStringAt(hps, BJack->BankPos, strlen(BJack->BankStr), BJack->BankStr);
  380.  
  381.     /* Draw shoe */
  382.     GpiSetColor(hps, CLR_BLACK);
  383.     GpiMove(hps, &BJack->ShoePosition[0]);
  384.     Position.x=BJack->ShoePosition[1].x;
  385.     Position.y=BJack->ShoePosition[0].y+BJack->ShoeBorderY;
  386.     GpiBox(hps, DRO_OUTLINEFILL, &Position, BJack->ShoeBorderX, BJack->ShoeBorderY);
  387.     GpiMove(hps, &BJack->ShoePosition[0]);
  388.     Position.x=BJack->ShoePosition[0].x+BJack->ShoeBorderX;
  389.     Position.y=BJack->ShoePosition[1].y;
  390.     GpiBox(hps, DRO_OUTLINEFILL, &Position, BJack->ShoeBorderX, BJack->ShoeBorderY);
  391.     GpiMove(hps, &BJack->ShoePosition[1]);
  392.     Position.x=BJack->ShoePosition[0].x;
  393.     Position.y=BJack->ShoePosition[1].y-BJack->ShoeBorderY;
  394.     GpiBox(hps, DRO_OUTLINEFILL, &Position, BJack->ShoeBorderX, BJack->ShoeBorderY);
  395.     GpiMove(hps, &BJack->ShoePosition[1]);
  396.     Position.x=BJack->ShoePosition[1].x-BJack->ShoeBorderX;
  397.     Position.y=BJack->ShoePosition[0].y;
  398.     GpiBox(hps, DRO_OUTLINEFILL, &Position, BJack->ShoeBorderX, BJack->ShoeBorderY);
  399.     GpiSetColor(hps, CLR_DARKRED);
  400.     Position.x=BJack->ShoePosition[2].x;
  401.     Position.y=BJack->ShoePosition[2].y+(BJack->ShoeIndex)
  402.         *(BJack->ShoePosition[1].y-BJack->ShoePosition[0].y-2*BJack->ShoeBorderY)/
  403.         (NUMCARDS*BJack->Rules.NumDecks);
  404.     GpiMove(hps, &Position);
  405.     GpiBox(hps, DRO_OUTLINEFILL, &BJack->ShoePosition[3], 0, 0);
  406.  
  407.     WinEndPaint(hps);
  408.  
  409.     return (MRESULT)FALSE;
  410. }
  411.  
  412. /************************************************************************
  413.  *
  414.  * MRESULT ResizeClient(BJACK *BJack, MPARAM mp1, MPARAM mp2)
  415.  *
  416.  * Called when client window is resized
  417.  *
  418.  ************************************************************************/
  419. MRESULT ResizeClient(BJACK *BJack, MPARAM mp1, MPARAM mp2)
  420. {
  421.     POINTL      Corner, Size, BetCorner, BetSize, TempPoint, CardSize;
  422.     USHORT  Temp, Temp2;
  423.  
  424.     if(SHORT1FROMMP(mp2)*Ratio[BJack->NumHands][1]>
  425.         SHORT2FROMMP(mp2)*Ratio[BJack->NumHands][0])
  426.     {
  427.         /* Window is wider than tall */
  428.         Corner.y=0;
  429.         Size.y=SHORT2FROMMP(mp2);
  430.         Size.x=SHORT2FROMMP(mp2)*Ratio[BJack->NumHands][0]/Ratio[BJack->NumHands][1];
  431.         Corner.x=(SHORT1FROMMP(mp2)-Size.x)/2;
  432.         BetCorner.x=Corner.x+Size.y/6;
  433.         BetCorner.y=Size.y/10;
  434.         if(BJack->NumHands)
  435.             BetSize.x=(Size.x-Size.y/6)/BJack->NumHands;
  436.         else BetSize.x=Size.x-Size.y/6;
  437.         BetSize.y=Size.y/2;
  438.     } else
  439.     {
  440.         /* Window is taller than wide */
  441.         Corner.x=0;
  442.         Size.x=SHORT1FROMMP(mp2);
  443.         Size.y=SHORT1FROMMP(mp2)*Ratio[BJack->NumHands][1]/Ratio[BJack->NumHands][0];
  444.         Corner.y=(SHORT2FROMMP(mp2)-Size.y)/2;
  445.         BetCorner.x=Size.y/6;
  446.         BetCorner.y=Corner.y+Size.y/10;
  447.         if(BJack->NumHands)
  448.             BetSize.x=(Size.x-Size.y/6)/BJack->NumHands;
  449.         else BetSize.x=Size.x-Size.y/6;
  450.         BetSize.y=Size.y/2;
  451.     }
  452.  
  453.     Temp=0;
  454.     TempPoint.x=BetCorner.x;
  455.     TempPoint.y=BetCorner.y;
  456.     CardSize.y=0.55*BetSize.y;
  457.     CardSize.x=CardSize.y*BJack->DealerHand.Card[0][3].x/BJack->DealerHand.Card[0][3].y;
  458.     BJack->DealerHand.ValuePos[0].x=Corner.x+Size.x/10;
  459.     BJack->DealerHand.ValuePos[0].y=BetCorner.y+BetSize.y+0.05*Size.y;
  460.     BJack->DealerHand.ValuePos[1].x=Corner.x+Size.x/3;
  461.     BJack->DealerHand.ValuePos[1].y=BetCorner.y+BetSize.y+0.1*Size.y;
  462.     do
  463.     {
  464.         BJack->PlayerHand[Temp].BetCircle.x=TempPoint.x+BetSize.x/2;
  465.  
  466.         BJack->PlayerHand[Temp].BetCircle.y=0.2*BetSize.y+TempPoint.y;
  467.  
  468.         BJack->PlayerHand[Temp].CircleDiameter=BetSize.y/5;
  469.  
  470.         BJack->PlayerHand[Temp].Chip[0].x=BJack->PlayerHand[Temp].BetCircle.x-BetSize.y/10;
  471.         BJack->PlayerHand[Temp].Chip[0].y=BJack->PlayerHand[Temp].BetCircle.y-BetSize.y/10;
  472.         BJack->PlayerHand[Temp].Chip[1].x=BJack->PlayerHand[Temp].Chip[0].x+BetSize.y/5;
  473.         BJack->PlayerHand[Temp].Chip[1].y=BJack->PlayerHand[Temp].Chip[0].y+BetSize.y/5;
  474.  
  475.         for(Temp2=0;Temp2<MAXHANDSIZE;Temp2++)
  476.         {
  477.             BJack->PlayerHand[Temp].Card[Temp2][0].x=TempPoint.x+
  478.                 Temp2*BetSize.x/MAXHANDSIZE;
  479.             BJack->PlayerHand[Temp].Card[Temp2][0].y=TempPoint.y+0.5*BetSize.y;
  480.  
  481.             BJack->PlayerHand[Temp].Card[Temp2][1].x=BJack->PlayerHand[Temp].Card[Temp2][0].x
  482.                 +CardSize.x;
  483.             BJack->PlayerHand[Temp].Card[Temp2][1].y=BJack->PlayerHand[Temp].Card[Temp2][0].y
  484.                 +CardSize.y;
  485.         }
  486.         BJack->PlayerHand[Temp].ValuePos[0].x=TempPoint.x+BetSize.x/MAXHANDSIZE;
  487.         BJack->PlayerHand[Temp].ValuePos[0].y=TempPoint.y+0.4*BetSize.y;
  488.         BJack->PlayerHand[Temp].ValuePos[1].x=TempPoint.x+BetSize.x*(MAXHANDSIZE-1)/MAXHANDSIZE;
  489.         BJack->PlayerHand[Temp].ValuePos[1].y=TempPoint.y+0.5*BetSize.y;
  490.  
  491.         TempPoint.x+=BetSize.x;
  492.         Temp++;
  493.     } while(Temp<BJack->NumHands);
  494.  
  495.     TempPoint.x=Corner.x;
  496.     TempPoint.y=BetCorner.y+BetSize.y+0.1*Size.y;
  497.  
  498.     for(Temp2=0;Temp2<MAXHANDSIZE;Temp2++)
  499.     {
  500.         BJack->DealerHand.Card[Temp2][0].x=TempPoint.x;
  501.         BJack->DealerHand.Card[Temp2][0].y=TempPoint.y;
  502.         BJack->DealerHand.Card[Temp2][1].x=BJack->DealerHand.Card[Temp2][0].x
  503.             +CardSize.x;
  504.         BJack->DealerHand.Card[Temp2][1].y=BJack->DealerHand.Card[Temp2][0].y
  505.             +CardSize.y;
  506.         TempPoint.x+=Size.x/10;
  507.     }
  508.  
  509.     /* Position shoe */
  510.     BJack->ShoePosition[0].y=0.7*Size.y+Corner.y;
  511.     BJack->ShoePosition[1].x=0.9*Size.x+Corner.x;
  512.     BJack->ShoePosition[1].y=Size.y+Corner.y;
  513.     BJack->ShoePosition[0].x=BJack->ShoePosition[1].x-0.2*BetSize.x;
  514.     BJack->ShoeBorderX=0.02*Size.x;
  515.     BJack->ShoeBorderY=0.02*Size.y;
  516.     BJack->ShoePosition[2].x=BJack->ShoePosition[0].x+BJack->ShoeBorderX;
  517.     BJack->ShoePosition[2].y=BJack->ShoePosition[0].y+BJack->ShoeBorderY;
  518.     BJack->ShoePosition[3].x=BJack->ShoePosition[1].x-BJack->ShoeBorderX;
  519.     BJack->ShoePosition[3].y=BJack->ShoePosition[1].y-BJack->ShoeBorderY;
  520.  
  521.     /* Position bank */
  522.     BJack->BankPos[0].x=Corner.x+0.02*Size.x;
  523.     BJack->BankPos[0].y=Corner.y+0.22*Size.y;
  524.     BJack->BankPos[1].x=BJack->BankPos[0].x+0.4*Size.x;
  525.     BJack->BankPos[1].y=BJack->BankPos[0].y+0.05*Size.y;
  526.  
  527.     /* Resize buttons */
  528.     WinSetWindowPos(WinWindowFromID(BJack->hwndClient, MainHit), HWND_TOP,
  529.         Corner.x+0.02*Size.x, Corner.y+0.01*Size.y, 0.1*Size.x,
  530.         0.05*Size.y, SWP_SIZE | SWP_MOVE);
  531.  
  532.     WinSetWindowPos(WinWindowFromID(BJack->hwndClient, MainStand), HWND_TOP,
  533.         Corner.x+0.22*Size.x, Corner.y+0.01*Size.y, 0.1*Size.x,
  534.         0.05*Size.y, SWP_SIZE | SWP_MOVE);
  535.  
  536.     WinSetWindowPos(WinWindowFromID(BJack->hwndClient, MainDouble), HWND_TOP,
  537.         Corner.x+0.42*Size.x, Corner.y+0.01*Size.y, 0.1*Size.x,
  538.         0.05*Size.y, SWP_SIZE | SWP_MOVE);
  539.  
  540.     WinSetWindowPos(WinWindowFromID(BJack->hwndClient, MainSplit), HWND_TOP,
  541.         Corner.x+0.62*Size.x, Corner.y+0.01*Size.y, 0.1*Size.x,
  542.         0.05*Size.y, SWP_SIZE | SWP_MOVE);
  543.  
  544.     WinSetWindowPos(WinWindowFromID(BJack->hwndClient, MainDeal), HWND_TOP,
  545.         Corner.x+0.02*Size.x, Corner.y+0.1*Size.y, 0.1*Size.x,
  546.         0.05*Size.y, SWP_SIZE | SWP_MOVE);
  547.  
  548.     WinSetWindowPos(WinWindowFromID(BJack->hwndClient, MainWager), HWND_TOP,
  549.         Corner.x+0.02*Size.x, Corner.y+0.16*Size.y, 0.1*Size.x,
  550.         0.05*Size.y, SWP_SIZE | SWP_MOVE);
  551.  
  552.     return (MRESULT)TRUE;
  553. }
  554.  
  555. /************************************************************************
  556.  *
  557.  * BOOL RatioSize(BJACK *BJack)
  558.  *
  559.  * Sizes the window based on the desired ratio and the present
  560.  * height of the window.
  561.  *
  562.  ************************************************************************/
  563. BOOL RatioSize(BJACK *BJack)
  564. {
  565.     SWP     Position, Desktop, NewPos;
  566.  
  567.     WinQueryWindowPos(BJack->hwndFrame, &Position);
  568.     WinQueryWindowPos(HWND_DESKTOP, &Desktop);
  569.  
  570.     NewPos.cy=Position.cy;
  571.     NewPos.y=Position.y;
  572.     NewPos.cx=Position.cy*Ratio[BJack->NumHands][0]/Ratio[BJack->NumHands][1];
  573.  
  574.     if(NewPos.cx>Desktop.cx)
  575.     {
  576.         NewPos.cy=NewPos.cy*Desktop.cx/NewPos.cx;
  577.         NewPos.cx=Desktop.cx;
  578.         NewPos.y=Position.y+(Position.cy-NewPos.cy)/2;
  579.     }
  580.  
  581.     NewPos.x=Position.x+(Position.cx-NewPos.cx)/2;
  582.  
  583.     WinSetWindowPos(BJack->hwndFrame, HWND_TOP, NewPos.x, NewPos.y,
  584.         NewPos.cx, NewPos.cy, SWP_SIZE | SWP_MOVE);
  585.  
  586.     return TRUE;
  587. }
  588.