home *** CD-ROM | disk | FTP | other *** search
/ Computer Installation Guide - Dragon Clan Series / CD1.iso / MPEG / WFSMP11 / SDK / WINDOWS / WINMOVIE.C < prev    next >
Encoding:
C/C++ Source or Header  |  1995-04-06  |  70.7 KB  |  2,108 lines

  1. #include <windows.h>
  2. #include <commdlg.h>
  3. #include <stdio.h>
  4. #include "winmovie.h"
  5. #include "winmovie.rch"
  6. #include "mpgmovie.h"
  7.  
  8. #ifdef USE_CTL3D
  9. #include "ctl3ds.h"
  10. #endif
  11.  
  12. /*
  13.         Names
  14. */
  15. #define IconName        "MPGMovieICON"
  16. #define ClassName       "MPGMovieCLASS"
  17. #define CaptionName     "MPEG Player"
  18.  
  19. #define Section         "Setting"
  20.  
  21. #define TEXT_WIDTH      140
  22. #define FRAME_WIDTH     10
  23. #define FRAME_HEIGHT    10
  24.  
  25. #define COLOR           RGB(192,192,192)
  26. /*
  27.         Global Variables
  28. */
  29. HANDLE  MainInst        = NULL;
  30. HANDLE  MainAccel;
  31. HWND    MainWnd         = NULL;
  32. HWND    LeftChannelWnd  = NULL;
  33. HWND    RightChannelWnd = NULL;
  34. HWND    WndDisplayX     = NULL;
  35. HWND    WndDisplayY     = NULL;
  36. HBRUSH  MainBrush       = NULL;
  37. WORD    DisplayX        = 15;
  38. WORD    DisplayY        = 5;
  39. int     DefaultX        = 15;
  40. int     DefaultY        = 5;
  41. WORD    LeftChannel     = 50;
  42. WORD    RightChannel    = 50;
  43. #define MaxVolume       63
  44. #define MinVolume       0
  45. int     WinWidth,WinHeight;
  46. int     factor = 3;
  47. int     Frequency = 3;
  48. int     CheckMediaChanged = 0;
  49. WORD    ColorR;
  50. WORD    ColorG;
  51. WORD    ColorB;
  52. BOOL    CmdFile = 0;
  53. int     VGAStatus = 1;
  54. int     PTSFlag = 0;
  55. int     InternalMode = 0;
  56. char    MOVIEINI[] = "MPMOVIE.INI";
  57.  
  58. /*
  59. */
  60. char    CurTitle[256];
  61. void NewSetWindowText(HWND wnd,LPSTR lsptr)
  62. {
  63.     lstrcpy(CurTitle,lsptr);
  64.     SetWindowText(wnd,CurTitle);
  65. }
  66.  
  67. /*
  68.         Common Dialog Variables
  69. */
  70. #define MAXFILENAME   256
  71. #define MAXCUSTFILTER 40
  72. OPENFILENAME  OpenOfn;
  73. char          szTitle[] = "Open a MPEG file";
  74. char          szOpenFilterSpec[] =
  75. "ISO CD 11172 MPEG\0*.mpg\0\
  76. MPEG Video bitstream\0*.vbs\0\
  77. MPEG Audio bitstream\0*.abs\0\
  78. All files\0*.*\0\0";
  79. char          szFileTitle[MAXFILENAME] = "";
  80. char          szOpenFileName[MAXFILENAME] = "";
  81. char          szCustFilterSpec[MAXCUSTFILTER] = "";
  82. char          PathName[MAXFILENAME] = "";
  83.  
  84. /*
  85.         Status
  86. */
  87. int     SaveOnExit    = 1;
  88. int     HasCDROM      = 0;
  89. WORD    PlayMode      = 0;
  90. int     FileOpened    = 0;             /* 1:File, 2:CD */
  91. int     FileType      = 0;
  92. int     VideoFrequency= MOVIE_60HZ;    /* 0:50Hz,  1:60Hz */
  93. BYTE    StartTrack    = 0;
  94. BYTE    EndTrack      = 0;
  95. BYTE    Track         = 0;
  96. BYTE    CurTrack      = 0;
  97. HCURSOR hCursorArrow;
  98. HCURSOR hCursorWait;
  99.  
  100. /*
  101.         Button Variables
  102. */
  103.  
  104. #ifdef  FIXBUGS
  105. #define BUTTON_WIDTH    32
  106. #define BUTTON_HEIGHT   32
  107. #define MAX_BUTTON      12
  108. int     ButtonStatus[MAX_BUTTON] = { 0,-1,-1,-1,-1,-1,-1,-1,0,-1,0,0, };
  109. char    *UpButtonName[MAX_BUTTON] =
  110. {
  111.         "BMP_UP_FILE",
  112.         "BMP_UP_CD",
  113.         "BMP_UP_STOP",
  114.         "BMP_UP_PLAY",
  115.         "BMP_UP_FAST",
  116.         "BMP_UP_SLOW",
  117.         "BMP_UP_STEP",
  118.         "BMP_UP_PAUSE",
  119.         "BMP_UP_AUTO",
  120.         "BMP_UP_MUTE",
  121.         "BMP_UP_PUSH",
  122.         "BMP_UP_TOP",
  123. };
  124.  
  125. char    *DownButtonName[MAX_BUTTON] =
  126. {
  127.         "BMP_DN_FILE",
  128.         "BMP_DN_CD",
  129.         "BMP_DN_STOP",
  130.         "BMP_DN_PLAY",
  131.         "BMP_DN_FAST",
  132.         "BMP_DN_SLOW",
  133.         "BMP_DN_STEP",
  134.         "BMP_DN_PAUSE",
  135.         "BMP_DN_AUTO",
  136.         "BMP_DN_MUTE",
  137.         "BMP_DN_PUSH",
  138.         "BMP_DN_TOP",
  139. };
  140.  
  141. char    *GrayButtonName[MAX_BUTTON] =
  142. {
  143.         "BMP_GRAY_FILE",
  144.         "BMP_GRAY_CD",
  145.         "BMP_GRAY_STOP",
  146.         "BMP_GRAY_PLAY",
  147.         "BMP_GRAY_FAST",
  148.         "BMP_GRAY_SLOW",
  149.         "BMP_GRAY_STEP",
  150.         "BMP_GRAY_PAUSE",
  151.         "BMP_GRAY_AUTO",
  152.         "BMP_GRAY_MUTE",
  153.         "BMP_GRAY_PUSH",
  154.         "BMP_GRAY_TOP",
  155. };
  156.  
  157. HBITMAP UpButtonBitmap[MAX_BUTTON] =
  158. {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,};
  159. HBITMAP DownButtonBitmap[MAX_BUTTON] =
  160. {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,};
  161. HBITMAP GrayButtonBitmap[MAX_BUTTON] =
  162. {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,};
  163. #else
  164. #define BUTTON_WIDTH    32
  165. #define BUTTON_HEIGHT   32
  166. #define MAX_BUTTON      9
  167. int     ButtonStatus[MAX_BUTTON] = { 0,-1,-1,-1,-1,0,-1,0,0, };
  168. char    *UpButtonName[MAX_BUTTON] =
  169. {
  170.         "BMP_UP_FILE",
  171.         "BMP_UP_CD",
  172.         "BMP_UP_STOP",
  173.         "BMP_UP_PLAY",
  174.         "BMP_UP_PAUSE",
  175.         "BMP_UP_AUTO",
  176.         "BMP_UP_MUTE",
  177.         "BMP_UP_PUSH",
  178.         "BMP_UP_TOP",
  179. };
  180.  
  181. char    *DownButtonName[MAX_BUTTON] =
  182. {
  183.         "BMP_DN_FILE",
  184.         "BMP_DN_CD",
  185.         "BMP_DN_STOP",
  186.         "BMP_DN_PLAY",
  187.         "BMP_DN_PAUSE",
  188.         "BMP_DN_AUTO",
  189.         "BMP_DN_MUTE",
  190.         "BMP_DN_PUSH",
  191.         "BMP_DN_TOP",
  192. };
  193.  
  194. char    *GrayButtonName[MAX_BUTTON] =
  195. {
  196.         "BMP_GRAY_FILE",
  197.         "BMP_GRAY_CD",
  198.         "BMP_GRAY_STOP",
  199.         "BMP_GRAY_PLAY",
  200.         "BMP_GRAY_PAUSE",
  201.         "BMP_GRAY_AUTO",
  202.         "BMP_GRAY_MUTE",
  203.         "BMP_GRAY_PUSH",
  204.         "BMP_GRAY_TOP",
  205. };
  206.  
  207. HBITMAP UpButtonBitmap[MAX_BUTTON] =
  208. {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,};
  209. HBITMAP DownButtonBitmap[MAX_BUTTON] =
  210. {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,};
  211. HBITMAP GrayButtonBitmap[MAX_BUTTON] =
  212. {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,};
  213. #endif
  214.  
  215. HBITMAP VolBitmapUp = NULL;
  216. HBITMAP VolBitmapDn0 = NULL;
  217. HBITMAP VolBitmapDn1 = NULL;
  218. int     VolStatus = 0;
  219.  
  220. HBITMAP SongBitmapGy = NULL;
  221. HBITMAP SongBitmapUp = NULL;
  222. HBITMAP SongBitmapDn0 = NULL;
  223. HBITMAP SongBitmapDn1 = NULL;
  224. int     SongStatus = -1;
  225.  
  226. /*
  227.         Internal Functions
  228. */
  229. void SetTopMost(HWND wnd,int fTop)
  230. {
  231.     RECT rect;
  232.     int  w,h;
  233.  
  234.     GetWindowRect(wnd,&rect);
  235.     w = rect.right - rect.left;
  236.     h = rect.bottom - rect.top;
  237.     if (fTop)
  238.         SetWindowPos(wnd,HWND_TOPMOST,rect.left,rect.top,w,h,SWP_SHOWWINDOW);
  239.     else
  240.         SetWindowPos(wnd,HWND_NOTOPMOST,rect.left,rect.top,w,h,SWP_SHOWWINDOW);
  241. }
  242.  
  243. int  AllocateResources(HWND wnd,HANDLE Inst)
  244. {
  245.     RECT        rect;
  246.     int         idx,Width,XX,X,limit;
  247.  
  248.     if ( (SongBitmapGy=LoadBitmap(Inst,"BMP_GY_SONG")) == NULL)
  249.     {
  250.         return 0;
  251.     }
  252.     if ( (SongBitmapUp=LoadBitmap(Inst,"BMP_UP_SONG")) == NULL)
  253.     {
  254.         return 0;
  255.     }
  256.     if ( (SongBitmapDn0=LoadBitmap(Inst,"BMP_DN0_SONG")) == NULL)
  257.     {
  258.         return 0;
  259.     }
  260.     if ( (SongBitmapDn1=LoadBitmap(Inst,"BMP_DN1_SONG")) == NULL)
  261.     {
  262.         return 0;
  263.     }
  264.  
  265.     if ( (VolBitmapUp=LoadBitmap(Inst,"BMP_UP_VOL")) == NULL)
  266.     {
  267.         return 0;
  268.     }
  269.     if ( (VolBitmapDn0=LoadBitmap(Inst,"BMP_DN0_VOL")) == NULL)
  270.     {
  271.         return 0;
  272.     }
  273.     if ( (VolBitmapDn1=LoadBitmap(Inst,"BMP_DN1_VOL")) == NULL)
  274.     {
  275.         return 0;
  276.     }
  277.  
  278.     for (idx=0;idx<MAX_BUTTON;idx++)
  279.     {
  280.         if ( (UpButtonBitmap[idx]=LoadBitmap(Inst,UpButtonName[idx]))
  281.              == NULL)
  282.         {
  283.             return 0;
  284.         }
  285.     }
  286.     for (idx=0;idx<MAX_BUTTON;idx++)
  287.     {
  288.         if ( (DownButtonBitmap[idx]=LoadBitmap(Inst,DownButtonName[idx]))
  289.              == NULL)
  290.         {
  291.             return 0;
  292.         }
  293.  
  294.     }
  295.     for (idx=0;idx<MAX_BUTTON;idx++)
  296.     {
  297.         if ( (GrayButtonBitmap[idx]=LoadBitmap(Inst,GrayButtonName[idx]))
  298.              == NULL)
  299.         {
  300.             return 0;
  301.         }
  302.  
  303.     }
  304.     Width = GetSystemMetrics(SM_CXBORDER);
  305.     for (idx=0;idx<MAX_BUTTON;idx++)
  306.     {
  307.         if (CreateWindow("BUTTON",NULL,
  308.                      WS_CHILD|WS_VISIBLE|BS_OWNERDRAW|WS_TABSTOP,
  309.                      Width+idx*BUTTON_WIDTH,0,BUTTON_WIDTH,BUTTON_HEIGHT,
  310.                      wnd,IDM_START+idx,Inst,NULL) == NULL)
  311.         {
  312.             return 0;
  313.         }
  314.     }
  315.  
  316.     if (CreateWindow("BUTTON",NULL,
  317.                      WS_CHILD|WS_VISIBLE|BS_OWNERDRAW|WS_TABSTOP,
  318.                      Width+MAX_BUTTON*BUTTON_WIDTH,0,BUTTON_WIDTH,BUTTON_HEIGHT,
  319.                      wnd,IDM_VOL,Inst,NULL) == NULL)
  320.     {
  321.         return 0;
  322.     }
  323.  
  324.     if (CreateWindow("BUTTON",NULL,
  325.                      WS_CHILD|WS_VISIBLE|BS_OWNERDRAW|WS_TABSTOP,
  326.                      Width+((MAX_BUTTON+1)*BUTTON_WIDTH),0,BUTTON_WIDTH,BUTTON_HEIGHT,
  327.                      wnd,IDM_SONG,Inst,NULL) == NULL)
  328.     {
  329.         return 0;
  330.     }
  331.  
  332.     if (CreateWindow("STATIC","Left Channel:",
  333.                      WS_CHILD|WS_VISIBLE,
  334.                      Width+FRAME_WIDTH,BUTTON_HEIGHT+FRAME_HEIGHT,TEXT_WIDTH,20,
  335.                      wnd,(WORD)-1,Inst,NULL) == NULL)
  336.     {
  337.         return 0;
  338.     }
  339.     if (CreateWindow("STATIC","",
  340.                      WS_CHILD|WS_VISIBLE,
  341.                      Width+20+TEXT_WIDTH,BUTTON_HEIGHT+FRAME_HEIGHT,30,20,
  342.                      wnd,TXT_LEFTCHANNEL,Inst,NULL) == NULL)
  343.     {
  344.         return 0;
  345.     }
  346.     if (CreateWindow("STATIC","Right Channel:",
  347.                      WS_CHILD|WS_VISIBLE,
  348.                      Width+FRAME_WIDTH,BUTTON_HEIGHT+25+FRAME_HEIGHT,TEXT_WIDTH,20,
  349.                      wnd,(WORD)-1,Inst,NULL) == NULL)
  350.     {
  351.         return 0;
  352.     }
  353.     if (CreateWindow("STATIC","",
  354.                      WS_CHILD|WS_VISIBLE,
  355.                      Width+20+TEXT_WIDTH,BUTTON_HEIGHT+25+FRAME_HEIGHT,30,20,
  356.                      wnd,TXT_RIGHTCHANNEL,Inst,NULL) == NULL)
  357.     {
  358.         return 0;
  359.     }
  360.     GetClientRect(wnd,&rect);
  361.     X  = rect.right - rect.left;
  362.     XX = Width + 55 + TEXT_WIDTH;
  363.     limit = X - XX - 70;
  364.     if ((LeftChannelWnd=CreateWindow("SCROLLBAR",NULL,
  365.                      WS_CHILD|WS_VISIBLE|WS_TABSTOP,
  366.                      XX,BUTTON_HEIGHT+2+FRAME_HEIGHT,limit,14,
  367.                      wnd,IDM_LEFTCHANNEL,Inst,NULL)) == NULL)
  368.     {
  369.         return 0;
  370.     }
  371.     if ((RightChannelWnd=CreateWindow("SCROLLBAR",NULL,
  372.                      WS_CHILD|WS_VISIBLE|WS_TABSTOP,
  373.                      XX,BUTTON_HEIGHT+27+FRAME_HEIGHT,limit,14,
  374.                      wnd,IDM_RIGHTCHANNEL,Inst,NULL)) == NULL)
  375.     {
  376.         return 0;
  377.     }
  378.     if ((WndDisplayX=CreateWindow("SCROLLBAR",NULL,
  379.                      WS_CHILD|WS_VISIBLE|WS_TABSTOP,
  380.                      XX,BUTTON_HEIGHT+50+FRAME_HEIGHT,limit,14,
  381.                      wnd,IDM_DISPLAY_X,Inst,NULL)) == NULL)
  382.     {
  383.         return 0;
  384.     }
  385.     if ((WndDisplayY=CreateWindow("SCROLLBAR",NULL,
  386.                      WS_CHILD|WS_VISIBLE|WS_TABSTOP,
  387.                      XX,BUTTON_HEIGHT+75+FRAME_HEIGHT,limit,14,
  388.                      wnd,IDM_DISPLAY_Y,Inst,NULL)) == NULL)
  389.     {
  390.         return 0;
  391.     }
  392.  
  393.     if (CreateWindow("STATIC","Horizontal Align:",
  394.                      WS_CHILD|WS_VISIBLE,
  395.                      Width+FRAME_WIDTH,BUTTON_HEIGHT+50+FRAME_HEIGHT,TEXT_WIDTH,20,
  396.                      wnd,(WORD)-1,Inst,NULL) == NULL)
  397.     {
  398.             return 0;
  399.     }
  400.     if (CreateWindow("STATIC","",
  401.                      WS_CHILD|WS_VISIBLE,
  402.                      Width+20+TEXT_WIDTH,BUTTON_HEIGHT+50+FRAME_HEIGHT,30,20,
  403.                      wnd,TXT_DISPLAY_X,Inst,NULL) == NULL)
  404.     {
  405.         return 0;
  406.     }
  407.     if (CreateWindow("STATIC","Vertical Align:",
  408.                      WS_CHILD|WS_VISIBLE,
  409.                      Width+FRAME_WIDTH,BUTTON_HEIGHT+75+FRAME_HEIGHT,TEXT_WIDTH,20,
  410.                      wnd,(WORD)-1,Inst,NULL) == NULL)
  411.     {
  412.             return 0;
  413.     }
  414.     if (CreateWindow("STATIC","",
  415.                      WS_CHILD|WS_VISIBLE,
  416.                      Width+20+TEXT_WIDTH,BUTTON_HEIGHT+75+FRAME_HEIGHT,30,20,
  417.                      wnd,TXT_DISPLAY_Y,Inst,NULL) == NULL)
  418.     {
  419.         return 0;
  420.     }
  421.  
  422.     if (CreateWindow("STATIC","Video Frequency:",
  423.                      WS_CHILD|WS_VISIBLE,
  424.                      Width+FRAME_WIDTH,BUTTON_HEIGHT+100+FRAME_HEIGHT,TEXT_WIDTH,20,
  425.                      wnd,(WORD)-1,Inst,NULL) == NULL)
  426.     {
  427.             return 0;
  428.     }
  429.     if (CreateWindow("BUTTON","60 Hz",
  430.                      WS_CHILD|WS_VISIBLE|BS_RADIOBUTTON|WS_TABSTOP,
  431.                      Width+20+TEXT_WIDTH,BUTTON_HEIGHT+100+FRAME_HEIGHT,70,20,
  432.                      wnd,IDM_60HZ,Inst,NULL) == NULL)
  433.     {
  434.             return 0;
  435.     }
  436.     if (CreateWindow("BUTTON","50 Hz",
  437.                      WS_CHILD|WS_VISIBLE|BS_RADIOBUTTON|WS_TABSTOP,
  438.                      Width+250,BUTTON_HEIGHT+100+FRAME_HEIGHT,70,20,
  439.                      wnd,IDM_50HZ,Inst,NULL) == NULL)
  440.     {
  441.             return 0;
  442.     }
  443.     if (CreateWindow("BUTTON","Reset",
  444.                      WS_CHILD|WS_VISIBLE|WS_TABSTOP,
  445.                      X-65,BUTTON_HEIGHT+2+FRAME_HEIGHT,55,25,
  446.                      wnd,IDM_RESET,Inst,NULL) == NULL)
  447.     {
  448.             return 0;
  449.     }
  450.  
  451.     if (CreateWindow("BUTTON","OK",
  452.                      WS_CHILD|WS_VISIBLE|WS_TABSTOP,
  453.                      X-65,BUTTON_HEIGHT+50+FRAME_HEIGHT,55,25,
  454.                      wnd,IDM_OK,Inst,NULL) == NULL)
  455.     {
  456.             return 0;
  457.     }
  458.  
  459.     OpenOfn.lStructSize       = sizeof(OPENFILENAME);
  460.     OpenOfn.hwndOwner         = NULL;
  461.     OpenOfn.lpstrFilter       = szOpenFilterSpec;
  462.     OpenOfn.lpstrCustomFilter = szCustFilterSpec;
  463.     OpenOfn.nMaxCustFilter    = MAXCUSTFILTER;
  464.     OpenOfn.nFilterIndex      = 1;
  465.     OpenOfn.lpstrFile         = szOpenFileName;
  466.     OpenOfn.nMaxFile          = MAXFILENAME;
  467.     OpenOfn.lpstrInitialDir   = PathName;
  468.     OpenOfn.lpstrFileTitle    = szFileTitle;
  469.     OpenOfn.nMaxFileTitle     = MAXFILENAME;
  470.     OpenOfn.lpstrTitle        = szTitle;
  471.     OpenOfn.lpstrDefExt       = "*";
  472.     OpenOfn.Flags             = OFN_HIDEREADONLY|OFN_PATHMUSTEXIST;
  473.  
  474.     HasCDROM = MOVIE_CDROM_Installed();
  475.     if (HasCDROM) ButtonStatus[1] = 0;
  476.     return 1;
  477. }
  478.  
  479. void ReleaseResources(void)
  480. {
  481.     int         idx;
  482.  
  483.     if (SongBitmapGy != NULL) DeleteObject(SongBitmapGy);
  484.     if (SongBitmapUp != NULL) DeleteObject(SongBitmapUp);
  485.     if (SongBitmapDn0 != NULL) DeleteObject(SongBitmapDn0);
  486.     if (SongBitmapDn1 != NULL) DeleteObject(SongBitmapDn1);
  487.  
  488.     if (VolBitmapUp != NULL) DeleteObject(VolBitmapUp);
  489.     if (VolBitmapDn0 != NULL) DeleteObject(VolBitmapDn0);
  490.     if (VolBitmapDn1 != NULL) DeleteObject(VolBitmapDn1);
  491.     for (idx=0;idx<MAX_BUTTON;idx++)
  492.     {
  493.         if (UpButtonBitmap[idx] != NULL) DeleteObject(UpButtonBitmap[idx]);
  494.     }
  495.     for (idx=0;idx<MAX_BUTTON;idx++)
  496.     {
  497.         if (DownButtonBitmap[idx] != NULL) DeleteObject(DownButtonBitmap[idx]);
  498.     }
  499.     for (idx=0;idx<MAX_BUTTON;idx++)
  500.     {
  501.         if (GrayButtonBitmap[idx] != NULL) DeleteObject(GrayButtonBitmap[idx]);
  502.     }
  503. }
  504.  
  505. long MyCtlColor(WORD wParam,LONG lParam)
  506. {
  507.     switch (HIWORD(lParam))
  508.     {
  509.         case CTLCOLOR_STATIC:
  510.              SetBkColor(wParam,COLOR);
  511.              return MainBrush;
  512.         case CTLCOLOR_BTN:
  513.              SetBkColor(wParam,COLOR);
  514.              return MainBrush;
  515.     }
  516.     return 0L;
  517. }
  518.  
  519. void DrawVolButton2(HWND wnd,int Choice)
  520. {
  521.     HDC         MemDC;
  522.     HDC         dc;
  523.  
  524.     dc = GetDC(wnd);
  525.     MemDC = CreateCompatibleDC(dc);
  526.     if (Choice)
  527.         SelectObject(MemDC,VolBitmapDn1);
  528.     else
  529.         SelectObject(MemDC,VolBitmapDn0);
  530.     BitBlt(dc,BUTTON_WIDTH*MAX_BUTTON,0,BUTTON_WIDTH,BUTTON_HEIGHT,MemDC,0,0,SRCCOPY);
  531.     DeleteDC(MemDC);
  532.     ReleaseDC(wnd,dc);
  533. }
  534.  
  535. void DrawVolButton(HWND wnd)
  536. {
  537.     HDC         MemDC;
  538.     HDC         dc;
  539.  
  540.     dc = GetDC(wnd);
  541.     MemDC = CreateCompatibleDC(dc);
  542.     SelectObject(MemDC,VolBitmapUp);
  543.     BitBlt(dc,BUTTON_WIDTH*MAX_BUTTON,0,BUTTON_WIDTH,BUTTON_HEIGHT,MemDC,0,0,SRCCOPY);
  544.     DeleteDC(MemDC);
  545.     ReleaseDC(wnd,dc);
  546. }
  547.  
  548. void DrawSongButton2(HWND wnd,int Choice)
  549. {
  550.     HDC         MemDC;
  551.     HDC         dc;
  552.  
  553.     dc = GetDC(wnd);
  554.     MemDC = CreateCompatibleDC(dc);
  555.     if (Choice)
  556.         SelectObject(MemDC,SongBitmapDn1);
  557.     else
  558.         SelectObject(MemDC,SongBitmapDn0);
  559.     BitBlt(dc,BUTTON_WIDTH*(MAX_BUTTON+1),0,BUTTON_WIDTH,BUTTON_HEIGHT,MemDC,0,0,SRCCOPY);
  560.     DeleteDC(MemDC);
  561.     ReleaseDC(wnd,dc);
  562. }
  563.  
  564. void DrawSongButton(HWND wnd)
  565. {
  566.     HDC         MemDC;
  567.     HDC         dc;
  568.  
  569.     dc = GetDC(wnd);
  570.     MemDC = CreateCompatibleDC(dc);
  571.     if (SongStatus == -1)
  572.         SelectObject(MemDC,SongBitmapGy);
  573.     else
  574.         SelectObject(MemDC,SongBitmapUp);
  575.     BitBlt(dc,BUTTON_WIDTH*(MAX_BUTTON+1),0,BUTTON_WIDTH,BUTTON_HEIGHT,MemDC,0,0,SRCCOPY);
  576.     DeleteDC(MemDC);
  577.     ReleaseDC(wnd,dc);
  578. }
  579.  
  580. void DrawItems(HWND wnd)
  581. {
  582.     HDC         MemDC;
  583.     HDC         dc;
  584.     int         idx;
  585.  
  586.     dc = GetDC(wnd);
  587.     MemDC = CreateCompatibleDC(dc);
  588.     for (idx=0;idx<MAX_BUTTON;idx++)
  589.     {
  590.         if (ButtonStatus[idx] == 1)
  591.         {
  592.             SelectObject(MemDC,DownButtonBitmap[idx]);
  593.         }
  594.         else if (ButtonStatus[idx] == 0)
  595.         {
  596.             SelectObject(MemDC,UpButtonBitmap[idx]);
  597.         }
  598.         else if (ButtonStatus[idx] == -1)
  599.         {
  600.             SelectObject(MemDC,GrayButtonBitmap[idx]);
  601.         }
  602.         BitBlt(dc,BUTTON_WIDTH*idx,0,BUTTON_WIDTH,BUTTON_HEIGHT,MemDC,0,0,SRCCOPY);
  603.     }
  604.     DeleteDC(MemDC);
  605.     ReleaseDC(wnd,dc);
  606. }
  607.  
  608. void DrawItem(HWND wnd,int index)
  609. {
  610.     HDC         MemDC;
  611.     HDC         dc;
  612.  
  613.     dc = GetDC(wnd);
  614.     MemDC = CreateCompatibleDC(dc);
  615.     if (ButtonStatus[index] == 1)
  616.     {
  617.         SelectObject(MemDC,DownButtonBitmap[index]);
  618.     }
  619.     else if (ButtonStatus[index] == 0)
  620.     {
  621.         SelectObject(MemDC,UpButtonBitmap[index]);
  622.     }
  623.     else if (ButtonStatus[index] == -1)
  624.     {
  625.         SelectObject(MemDC,GrayButtonBitmap[index]);
  626.     }
  627.     BitBlt(dc,BUTTON_WIDTH*index,0,BUTTON_WIDTH,BUTTON_HEIGHT,MemDC,0,0,SRCCOPY);
  628.     DeleteDC(MemDC);
  629.     ReleaseDC(wnd,dc);
  630. }
  631.  
  632. int     SongNo  = 0;
  633. void ConfigSongComboBox(HWND dlg)
  634. {
  635.     HWND        wnd;
  636.     int         limit;
  637.     int         idx;
  638.     char        temp[80];
  639.  
  640.     wnd = GetDlgItem(dlg,ID_SONG);
  641.     limit = (int)(EndTrack - StartTrack);
  642.     for (idx=1;idx<=limit;idx++)
  643.     {
  644.         wsprintf(temp,"Song %d",idx);
  645.         SendMessage(wnd,LB_ADDSTRING,0,(LONG)((LPSTR)&temp[0]));
  646.         SendMessage(wnd,LB_SETCURSEL,SongNo,0L);
  647.     }
  648. }
  649.  
  650. BOOL FAR PASCAL SongDlgProc(HWND dlg,WORD message,WORD wParam,LONG lParam)
  651. {
  652.     HWND        wnd;
  653.  
  654.     switch (message)
  655.     {
  656.         case WM_COMMAND:
  657.             switch (wParam)
  658.             {
  659.                 case ID_SONG:
  660.                      if (HIWORD(lParam) != LBN_DBLCLK) break;
  661.                 case IDOK:
  662.                      wnd = GetDlgItem(dlg,ID_SONG);
  663.                      SongNo = (int)SendMessage(wnd,LB_GETCURSEL,0,0L);
  664.                      if (SongNo < 0)
  665.                      {
  666.                          CurTrack = 0;
  667.                          EndDialog(dlg,FALSE);
  668.                          return(TRUE);
  669.                      }
  670.                      CurTrack = (BYTE)SongNo + 2;
  671.                      EndDialog(dlg,TRUE);
  672.                      return(TRUE);
  673.                 case IDCANCEL:
  674.                      CurTrack = 0;
  675.                      EndDialog(dlg,FALSE);
  676.                      return(TRUE);
  677.             }
  678.             break;
  679.         case WM_INITDIALOG:
  680.             CurTrack = 0;
  681.             ConfigSongComboBox(dlg);
  682.             return TRUE;
  683.     }
  684.     return FALSE;
  685. }
  686.  
  687. int SelectSong(HWND wnd)
  688. {
  689.     FARPROC     lpProcTemp;
  690.  
  691.     lpProcTemp = MakeProcInstance(SongDlgProc,MainInst);
  692.     DialogBox(MainInst,"SONGSELDLG",wnd,lpProcTemp);
  693.     FreeProcInstance(lpProcTemp);
  694.     return CurTrack;
  695. }
  696.  
  697. BOOL WritePrivateProfileInt(LPSTR section,LPSTR item,int Value,LPSTR profile)
  698. {
  699.     char        buffer[80];
  700.  
  701.     wsprintf(buffer,"%d",Value);
  702.     return WritePrivateProfileString(section,item,(LPSTR)buffer,profile);
  703. }
  704.  
  705. BOOL FAR PASCAL BorderDlgProc(HWND dlg,WORD message,WORD wParam,LONG lParam)
  706. {
  707.     static HWND WndR;
  708.     static HWND WndG;
  709.     static HWND WndB;
  710.     static WORD OldR;
  711.     static WORD OldG;
  712.     static WORD OldB;
  713.     WORD * NewValue;
  714.     int    temp;
  715.     BOOL   flag;
  716.     HWND   hScrollBar;
  717.  
  718.  
  719.     switch (message)
  720.     {
  721.         case WM_HSCROLL:
  722.              if ((HWND)HIWORD(lParam)==WndR)
  723.              {
  724.                  NewValue = &ColorR;
  725.              }
  726.              else if ((HWND)HIWORD(lParam)==WndG)
  727.              {
  728.                  NewValue = &ColorG;
  729.              }
  730.              else if ((HWND)HIWORD(lParam)==WndB)
  731.              {
  732.                  NewValue = &ColorB;
  733.              }
  734.              else break;
  735.              switch (wParam)
  736.              {
  737.                 case SB_RIGHT:
  738.                      *NewValue = 31;
  739.                      break;
  740.                 case SB_LEFT:
  741.                      *NewValue = 0;
  742.                      break;
  743.                 case SB_PAGEUP:
  744.                 case SB_LINEUP:
  745.                      if (*NewValue > 0) *NewValue -= 1;
  746.                      break;
  747.                 case SB_LINEDOWN:
  748.                 case SB_PAGEDOWN:
  749.                      if (*NewValue < 31) *NewValue += 1;
  750.                      break;
  751.                 case SB_THUMBPOSITION:
  752.                 case SB_THUMBTRACK:
  753.                      *NewValue = LOWORD(lParam);
  754.                      break;
  755.                 default:
  756.                      break;
  757.              }
  758.              SetScrollPos(HIWORD(lParam),SB_CTL,*NewValue,TRUE);
  759.              if ((HWND)HIWORD(lParam)==WndR)
  760.              {
  761.                 SetDlgItemInt(dlg,IDEDIT_RED,*NewValue,FALSE);
  762.              }
  763.              else if ((HWND)HIWORD(lParam)==WndG)
  764.              {
  765.                 SetDlgItemInt(dlg,IDEDIT_GREEN,*NewValue,FALSE);
  766.              }
  767.              else if ((HWND)HIWORD(lParam)==WndB)
  768.              {
  769.                 SetDlgItemInt(dlg,IDEDIT_BLUE,*NewValue,FALSE);
  770.              }
  771.              MOVIE_SetBorder(ColorR,ColorG,ColorB);
  772.              break;
  773.         case WM_COMMAND:
  774.             switch (wParam)
  775.             {
  776.                 case IDEDIT_RED:
  777.                 case IDEDIT_GREEN:
  778.                 case IDEDIT_BLUE:
  779.                     if (wParam == IDEDIT_RED)
  780.                     {
  781.                         NewValue = &ColorR;
  782.                         hScrollBar = WndR;
  783.                     }
  784.                     else if (wParam == IDEDIT_GREEN)
  785.                     {
  786.                         NewValue = &ColorG;
  787.                         hScrollBar = WndG;
  788.                     }
  789.                     else if (wParam == IDEDIT_BLUE)
  790.                     {
  791.                         NewValue = &ColorB;
  792.                         hScrollBar = WndB;
  793.                     }
  794.                     temp = GetDlgItemInt(dlg,wParam,&flag,FALSE);
  795.                     if ( (!flag) || (temp < 0) || (temp > 31) )
  796.                     {
  797.                         SetDlgItemInt(dlg,wParam,*NewValue,FALSE);
  798.                     }
  799.                     else
  800.                     {
  801.                         *NewValue = temp;
  802.                         SetScrollPos(hScrollBar,SB_CTL,*NewValue,TRUE);
  803.                     }
  804.                     MOVIE_SetBorder(ColorR,ColorG,ColorB);
  805.                     break;
  806.                 case IDOK:
  807.                      WritePrivateProfileInt(Section,"BorderR",ColorR,MOVIEINI);
  808.                      WritePrivateProfileInt(Section,"BorderG",ColorG,MOVIEINI);
  809.                      WritePrivateProfileInt(Section,"BorderB",ColorB,MOVIEINI);
  810.                      if (!ButtonStatus[IDM_PUSH-IDM_START]) MOVIE_SetBorder(0,0,0);
  811.                      else MOVIE_SetBorder(ColorR,ColorG,ColorB);
  812.                      EndDialog(dlg,TRUE);
  813.                      return(TRUE);
  814.                 case IDCANCEL:
  815.                      ColorR = OldR;
  816.                      ColorG = OldG;
  817.                      ColorB = OldB;
  818.                      if (!ButtonStatus[IDM_PUSH-IDM_START]) MOVIE_SetBorder(0,0,0);
  819.                      else MOVIE_SetBorder(ColorR,ColorG,ColorB);
  820.                      EndDialog(dlg,FALSE);
  821.                      return(TRUE);
  822.             }
  823.             break;
  824.         case WM_INITDIALOG:
  825.             OldR = ColorR;
  826.             OldG = ColorG;
  827.             OldB = ColorB;
  828.             SetDlgItemInt(dlg,IDEDIT_RED,  ColorR,FALSE);
  829.             SetDlgItemInt(dlg,IDEDIT_GREEN,ColorG,FALSE);
  830.             SetDlgItemInt(dlg,IDEDIT_BLUE ,ColorB,FALSE);
  831.             WndR = GetDlgItem(dlg,IDSCROLL_RED);
  832.             WndG = GetDlgItem(dlg,IDSCROLL_GREEN);
  833.             WndB = GetDlgItem(dlg,IDSCROLL_BLUE);
  834.             SetScrollRange(WndR,SB_CTL,0,31,FALSE);
  835.             SetScrollPos  (WndR,SB_CTL,ColorR,TRUE);
  836.             SetScrollRange(WndG,SB_CTL,0,31,FALSE);
  837.             SetScrollPos  (WndG,SB_CTL,ColorG,TRUE);
  838.             SetScrollRange(WndB,SB_CTL,0,31,FALSE);
  839.             SetScrollPos  (WndB,SB_CTL,ColorB,TRUE);
  840.             MOVIE_SetBorder(ColorR,ColorG,ColorB);
  841.             return TRUE;
  842.     }
  843.     return FALSE;
  844. }
  845.  
  846. void DefineBorder(HWND wnd)
  847. {
  848.     FARPROC     lpProcTemp;
  849.  
  850.     lpProcTemp = MakeProcInstance(BorderDlgProc,MainInst);
  851.     DialogBox(MainInst,"BORDERDLG",wnd,lpProcTemp);
  852.     FreeProcInstance(lpProcTemp);
  853. }
  854.  
  855. void ResetAllButton(HWND wnd)
  856. {
  857.     if (FileOpened == 1) MOVIE_CloseFile();
  858.     FileOpened = 0;
  859.     FileType = 0;
  860.     SongStatus = -1;
  861.     ButtonStatus[IDM_STOP-IDM_START]        = -1;
  862.     ButtonStatus[IDM_PLAY-IDM_START]        = -1;
  863. #ifdef  FIXBUGS
  864.     ButtonStatus[IDM_SLOWPLAY-IDM_START]    = -1;
  865.     ButtonStatus[IDM_FASTPLAY-IDM_START]    = -1;
  866.     ButtonStatus[IDM_NEXT_FRAME-IDM_START]  = -1;
  867. #endif
  868.     ButtonStatus[IDM_PAUSE-IDM_START]       = -1;
  869.     ButtonStatus[IDM_MUTE-IDM_START]        = -1;
  870.     DrawItems(wnd);
  871.     DrawSongButton(wnd);
  872.     NewSetWindowText(wnd,CaptionName);
  873. }
  874.  
  875. int CheckCD(HWND wnd)
  876. {
  877.     if (FileOpened != 2) return 1;
  878.     SetCursor(hCursorWait);
  879.     if (MOVIE_CDROM_IsDiscChanged())
  880.     {
  881.         SetCursor(hCursorArrow);
  882.         if (!CheckMediaChanged) return 1;
  883.         if (MessageBox(wnd,"Compact disc is changed. Stop playing now ?",CaptionName,MB_YESNO|MB_ICONQUESTION)
  884.             == IDYES)
  885.         {
  886.             ResetAllButton(wnd);
  887.             return 0;
  888.         }
  889.     }
  890.     SetCursor(hCursorArrow);
  891.     return 1;
  892. }
  893.  
  894. int CheckCD2(HWND wnd)
  895. {
  896.     SetCursor(hCursorWait);
  897.     if (MOVIE_CDROM_IsDiscChanged())
  898.     {
  899.         SetCursor(hCursorArrow);
  900.         if (!CheckMediaChanged) return 1;
  901.         if (MessageBox(wnd,"Compact disc is changed. Stop playing now ?",CaptionName,MB_YESNO|MB_ICONQUESTION)
  902.             == IDYES)
  903.         {
  904.             ResetAllButton(wnd);
  905.             return 0;
  906.         }
  907.     }
  908.     SetCursor(hCursorArrow);
  909.     return 1;
  910. }
  911.  
  912. void HelpInfo(HWND wnd)
  913. {
  914.     static char HelpMsg[] =
  915. "Ctrl+O : Open MPEG file\n\
  916. Ctrl+C : Select Video CD\n\
  917. Ctrl+P : Play\n\
  918. Ctrl+S : Pause\n\
  919. Ctrl+R : Rewind\n\
  920. F2 : Configuration\n\
  921. ";
  922.  
  923.     MessageBox(wnd,HelpMsg,"Hot Keys",MB_OK|MB_ICONINFORMATION);
  924.  
  925. }
  926.  
  927. void  SetVGAOutput(int flag)
  928. {
  929.     if (VGAStatus == 0)
  930.     {
  931.         //SendMessage(MainWnd,WM_COMMAND,IDM_PAUSE,0L);
  932.     }
  933.     VGAStatus = flag;
  934.     MOVIE_VGA_Output(VGAStatus);
  935. }
  936.  
  937. void ProcessCommand(HWND wnd,WORD wParam,LONG lParam)
  938. {
  939.     char  Title[80];
  940.     RECT  rect;
  941.     BYTE  NewTrack;
  942.     BOOL  Status;
  943.  
  944.     switch (wParam)
  945.     {
  946.         case IDM_FILE:
  947.              if (HasCDROM) CheckCD2(wnd);
  948.              SetVGAOutput(1);
  949.              if (PlayMode) SendMessage(wnd,WM_COMMAND,IDM_STOP,0L);
  950.              if (CmdFile)
  951.              {
  952.                 Status = TRUE;
  953.                 CmdFile = 0;
  954.              }
  955.              else
  956.              {
  957.                 szOpenFileName[0] = 0;
  958.                 OpenOfn.hwndOwner = wnd;
  959.                 Status = GetOpenFileName((LPOPENFILENAME)&OpenOfn);
  960.              }
  961.              if (!Status) break;
  962.              {
  963.                  if (FileOpened == 1) MOVIE_CloseFile();
  964.                  SetCursor(hCursorWait);
  965.                  FileType = MOVIE_OpenFile(szOpenFileName);
  966.                  SetCursor(hCursorArrow);
  967.                  if (FileType == MOVIE_AUDIO_FILE)
  968.                  {
  969.                      NewSetWindowText(wnd,szOpenFileName);
  970.                      FileOpened = 1;
  971.                      ButtonStatus[IDM_STOP-IDM_START]        = 0;
  972.                      ButtonStatus[IDM_PLAY-IDM_START]        = 0;
  973. #ifdef  FIXBUGS
  974.                      ButtonStatus[IDM_SLOWPLAY-IDM_START]    = -1;
  975.                      ButtonStatus[IDM_FASTPLAY-IDM_START]    = -1;
  976.                      ButtonStatus[IDM_NEXT_FRAME-IDM_START]  = -1;
  977. #endif
  978.                      ButtonStatus[IDM_PAUSE-IDM_START]       = -1;
  979.                      ButtonStatus[IDM_MUTE-IDM_START]        = 0;
  980.                      DrawItems(wnd);
  981.                      MOVIE_Mute(ButtonStatus[IDM_MUTE-IDM_START]);
  982.                  }
  983.                  else if (FileType > 0)
  984.                  {
  985.                      NewSetWindowText(wnd,szOpenFileName);
  986.                      FileOpened = 1;
  987.                      ButtonStatus[IDM_STOP-IDM_START]        = 0;
  988.                      ButtonStatus[IDM_PLAY-IDM_START]        = 0;
  989. #ifdef  FIXBUGS
  990.                      ButtonStatus[IDM_SLOWPLAY-IDM_START]    = 0;
  991.                      ButtonStatus[IDM_FASTPLAY-IDM_START]    = 0;
  992.                      ButtonStatus[IDM_NEXT_FRAME-IDM_START]  = 0;
  993. #endif
  994.                      ButtonStatus[IDM_PAUSE-IDM_START]       = -1;
  995.                      ButtonStatus[IDM_MUTE-IDM_START]        = 0;
  996.                      DrawItems(wnd);
  997.                      MOVIE_Mute(ButtonStatus[IDM_MUTE-IDM_START]);
  998.                  }
  999.                  else
  1000.                  {
  1001.                      NewSetWindowText(wnd,CaptionName);
  1002.                      FileOpened = 0;
  1003.                      ButtonStatus[IDM_STOP-IDM_START]        = -1;
  1004.                      ButtonStatus[IDM_PLAY-IDM_START]        = -1;
  1005. #ifdef  FIXBUGS
  1006.                      ButtonStatus[IDM_SLOWPLAY-IDM_START]    = -1;
  1007.                      ButtonStatus[IDM_FASTPLAY-IDM_START]    = -1;
  1008.                      ButtonStatus[IDM_NEXT_FRAME-IDM_START]  = -1;
  1009. #endif
  1010.                      ButtonStatus[IDM_PAUSE-IDM_START]       = -1;
  1011.                      ButtonStatus[IDM_MUTE-IDM_START]        = -1;
  1012.                      DrawItems(wnd);
  1013.                      if (FileType == 0)
  1014.                          MessageBox(wnd,"Invalid file format",CaptionName,MB_OK|MB_ICONSTOP);
  1015.                      else
  1016.                          MessageBox(wnd,"File not found",CaptionName,MB_OK|MB_ICONSTOP);
  1017.                  }
  1018.              }
  1019.              PostMessage(MainWnd,WM_COMMAND,IDM_PLAY,0L);
  1020.              SongStatus = -1;
  1021.              break;
  1022.         case IDM_CD:
  1023.              if (CmdFile) CmdFile = 0;
  1024.              if (HasCDROM) CheckCD2(wnd);
  1025.              else break;
  1026.              SetVGAOutput(1);
  1027.              if (PlayMode) SendMessage(wnd,WM_COMMAND,IDM_STOP,0L);
  1028.              SetCursor(hCursorWait);
  1029.              SongStatus = -1;
  1030.              if (!MOVIE_CDROM_HasDisc())
  1031.              {
  1032.                  SetCursor(hCursorArrow);
  1033.                  MessageBox(wnd,"CD-ROM drive empty",CaptionName,MB_OK|MB_ICONSTOP);
  1034.                  if (FileOpened == 2) ResetAllButton(wnd);
  1035.                  break;
  1036.              }
  1037.              if (!MOVIE_CDROM_GetCDITitle((char far *)&Title[0]))
  1038.              {
  1039.                  if (!MOVIE_CDROM_GetTrackNo(&StartTrack,&EndTrack))
  1040.                  {
  1041.                      SetCursor(hCursorArrow);
  1042.                      MessageBox(wnd,"Cannot retrieve the number of tracks on the compact disc",CaptionName,MB_OK|MB_ICONSTOP);
  1043.                      if (FileOpened == 2) ResetAllButton(wnd);
  1044.                      break;
  1045.                  }
  1046.                  if ( ((EndTrack - StartTrack) < 1) && (StartTrack == 1))
  1047.                  {
  1048.                      SetCursor(hCursorArrow);
  1049.                      MessageBox(wnd,"Compact disc not a Karaoke CD or Video CD",CaptionName,MB_OK|MB_ICONSTOP);
  1050.                      if (FileOpened == 2) ResetAllButton(wnd);
  1051.                      break;
  1052.                  }
  1053.                  SetCursor(hCursorArrow);
  1054.                  if ( (EndTrack - StartTrack) <= 1 )
  1055.                      NewTrack = EndTrack;
  1056.                  else
  1057.                      NewTrack = SelectSong(wnd);
  1058.                  if (NewTrack != 0)
  1059.                  {
  1060.                      char temp[80];
  1061.  
  1062.                      Track = NewTrack;
  1063.                      if (FileOpened == 1) MOVIE_CloseFile();
  1064.                      SetCursor(hCursorWait);
  1065.                      if (!MOVIE_CDROM_SeekTrack(Track))
  1066.                      {
  1067.                         SetCursor(hCursorArrow);
  1068.                         NewSetWindowText(wnd,CaptionName);
  1069.                         ResetAllButton(wnd);
  1070.                         wsprintf(temp,"Error seeking song %d",Track-1);
  1071.                         MessageBox(wnd,temp,CaptionName,MB_OK|MB_ICONSTOP);
  1072.                         break;
  1073.                      }
  1074.                      SetCursor(hCursorArrow);
  1075.                      if ( (EndTrack - StartTrack) <= 1 )
  1076.                      {
  1077.                          NewSetWindowText(wnd,"VIDEO CD");
  1078.                      }
  1079.                      else
  1080.                      {
  1081.                          wsprintf(temp,"Karaoke CD: Song %d",Track-1);
  1082.                          NewSetWindowText(wnd,temp);
  1083.                      }
  1084.                      SongStatus = 1;
  1085.                      FileType = MOVIE_SYSTEM_LAYER;
  1086.                      FileOpened = 2;
  1087.                      ButtonStatus[IDM_STOP-IDM_START]        = 0;
  1088.                      ButtonStatus[IDM_PLAY-IDM_START]        = 0;
  1089. #ifdef  FIXBUGS
  1090.                      ButtonStatus[IDM_SLOWPLAY-IDM_START]    = 0;
  1091.                      ButtonStatus[IDM_FASTPLAY-IDM_START]    = 0;
  1092.                      ButtonStatus[IDM_NEXT_FRAME-IDM_START]  = 0;
  1093. #endif
  1094.                      ButtonStatus[IDM_PAUSE-IDM_START]       = -1;
  1095.                      ButtonStatus[IDM_MUTE-IDM_START]        = 0;
  1096.                      DrawItems(wnd);
  1097.                      DrawSongButton(wnd);
  1098.                      MOVIE_Mute(ButtonStatus[IDM_MUTE-IDM_START]);
  1099.                  }
  1100.                  else break;
  1101.              }
  1102.              else
  1103.              {
  1104.                  int status;
  1105.  
  1106.                  if (FileOpened == 1) MOVIE_CloseFile();
  1107.                  SetCursor(hCursorWait);
  1108.                  status = MOVIE_CDROM_SeekCDI();
  1109.                  if (status != 0)
  1110.                  {
  1111.                     char temp[80];
  1112.  
  1113.                     SetCursor(hCursorArrow);
  1114.                     NewSetWindowText(wnd,CaptionName);
  1115.                     ResetAllButton(wnd);
  1116.                     wsprintf(temp,"Error seeking Video CD.Error code %d.",status);
  1117.                     MessageBox(wnd,temp,CaptionName,MB_OK|MB_ICONSTOP);
  1118.                     break;
  1119.                  }
  1120.                  SetCursor(hCursorArrow);
  1121.                  NewSetWindowText(wnd,Title);
  1122.                  FileType = MOVIE_SYSTEM_LAYER;
  1123.                  FileOpened = 2;
  1124.                  ButtonStatus[IDM_STOP-IDM_START]        = 0;
  1125.                  ButtonStatus[IDM_PLAY-IDM_START]        = 0;
  1126. #ifdef  FIXBUGS
  1127.                  ButtonStatus[IDM_SLOWPLAY-IDM_START]    = 0;
  1128.                  ButtonStatus[IDM_FASTPLAY-IDM_START]    = 0;
  1129.                  ButtonStatus[IDM_NEXT_FRAME-IDM_START]  = 0;
  1130. #endif
  1131.                  ButtonStatus[IDM_PAUSE-IDM_START]       = -1;
  1132.                  ButtonStatus[IDM_MUTE-IDM_START]        = 0;
  1133.                  DrawItems(wnd);
  1134.                  MOVIE_Mute(ButtonStatus[IDM_MUTE-IDM_START]);
  1135.              }
  1136.              /* else if (FileOpened == 2) ResetAllButton(wnd); */
  1137.              SetCursor(hCursorArrow);
  1138.              PostMessage(MainWnd,WM_COMMAND,IDM_PLAY,0L);
  1139.              break;
  1140.         case IDM_STOP:
  1141.         {
  1142.              int DoStop;
  1143.  
  1144.              if (PlayMode==0) break;
  1145.              if (!FileOpened) break;
  1146.              if (ButtonStatus[IDM_PAUSE-IDM_START]==1)
  1147.                 DoStop = 0;
  1148.              else
  1149.                 DoStop = 1;
  1150.              PlayMode = 0;
  1151.              ButtonStatus[IDM_PLAY-IDM_START]       = 0;
  1152.              ButtonStatus[IDM_PAUSE-IDM_START]      = -1;
  1153.              if (FileType != MOVIE_AUDIO_FILE)
  1154.              {
  1155. #ifdef  FIXBUGS
  1156.                  ButtonStatus[IDM_SLOWPLAY-IDM_START]   = 0;
  1157.                  ButtonStatus[IDM_FASTPLAY-IDM_START]   = 0;
  1158.                  ButtonStatus[IDM_NEXT_FRAME-IDM_START] = 0;
  1159. #endif
  1160.              }
  1161.              DrawItems(wnd);
  1162.              if (DoStop) MOVIE_Stop();
  1163.              MOVIE_SetBorder(ColorR,ColorG,ColorB);
  1164.              if (!InternalMode) SetVGAOutput(1);
  1165.              SetWindowText(wnd,CurTitle);
  1166.              break;
  1167.         }
  1168.         case IDM_PLAY:
  1169.              if (!FileOpened) break;
  1170.              if (!CheckCD(wnd)) break;
  1171.              if ((ButtonStatus[IDM_PAUSE-IDM_START]==0)&&(PlayMode==wParam))
  1172.              {
  1173.                  if (!InternalMode)
  1174.                  {
  1175.                      if (ButtonStatus[IDM_TOP-IDM_START])
  1176.                          SetVGAOutput(1);
  1177.                      else
  1178.                          SetVGAOutput(0);
  1179.                 }
  1180.                 break;
  1181.              }
  1182.              PlayMode = wParam;
  1183.              ButtonStatus[IDM_PLAY-IDM_START]       = 1;
  1184.              ButtonStatus[IDM_PAUSE-IDM_START]      = 0;
  1185.              if (FileType != MOVIE_AUDIO_FILE)
  1186.              {
  1187. #ifdef  FIXBUGS
  1188.                  ButtonStatus[IDM_SLOWPLAY-IDM_START]   = 0;
  1189.                  ButtonStatus[IDM_FASTPLAY-IDM_START]   = 0;
  1190.                  ButtonStatus[IDM_NEXT_FRAME-IDM_START] = 0;
  1191. #endif
  1192.              }
  1193.              DrawItems(wnd);
  1194.              if (ButtonStatus[IDM_PUSH-IDM_START])
  1195.                  MOVIE_SetBorder(ColorR,ColorG,ColorB);
  1196.              else
  1197.                  MOVIE_SetBorder(0,0,0);
  1198.              MOVIE_Play();
  1199.              if (!InternalMode)
  1200.              {
  1201.                  if (ButtonStatus[IDM_TOP-IDM_START])
  1202.                      SetVGAOutput(1);
  1203.                  else
  1204.                      SetVGAOutput(0);
  1205.              }
  1206.              break;
  1207. #ifdef  FIXBUGS
  1208.         case IDM_SLOWPLAY:
  1209.              if (!FileOpened) break;
  1210.              if (FileType == MOVIE_AUDIO_FILE) break;
  1211.              if ((ButtonStatus[IDM_PAUSE-IDM_START]==0)&&(PlayMode==wParam)) break;
  1212.              if (!CheckCD(wnd)) break;
  1213.              PlayMode = wParam;
  1214.              ButtonStatus[IDM_PLAY-IDM_START]       = 0;
  1215.              ButtonStatus[IDM_SLOWPLAY-IDM_START]   = 1;
  1216.              ButtonStatus[IDM_FASTPLAY-IDM_START]   = 0;
  1217.              ButtonStatus[IDM_PAUSE-IDM_START]      = 0;
  1218.              ButtonStatus[IDM_NEXT_FRAME-IDM_START] = 0;
  1219.              DrawItems(wnd);
  1220.              MOVIE_SlowPlay(factor);
  1221.              break;
  1222.         case IDM_FASTPLAY:
  1223.              if (!FileOpened) break;
  1224.              if (FileType == MOVIE_AUDIO_FILE) break;
  1225.              if ((ButtonStatus[IDM_PAUSE-IDM_START]==0)&&(PlayMode==wParam)) break;
  1226.              if (!CheckCD(wnd)) break;
  1227.              PlayMode = wParam;
  1228.              ButtonStatus[IDM_PLAY-IDM_START]       = 0;
  1229.              ButtonStatus[IDM_SLOWPLAY-IDM_START]   = 0;
  1230.              ButtonStatus[IDM_FASTPLAY-IDM_START]   = 1;
  1231.              ButtonStatus[IDM_PAUSE-IDM_START]      = 0;
  1232.              ButtonStatus[IDM_NEXT_FRAME-IDM_START] = 0;
  1233.              DrawItems(wnd);
  1234.              MOVIE_FastPlay();
  1235.              break;
  1236.         case IDM_NEXT_FRAME:
  1237.              if (!FileOpened) break;
  1238.              if (FileType == MOVIE_AUDIO_FILE) break;
  1239.              if ((ButtonStatus[IDM_PAUSE-IDM_START]==0)&&(PlayMode==wParam)) break;
  1240.              if (!CheckCD(wnd)) break;
  1241.              PlayMode = wParam;
  1242.              ButtonStatus[IDM_PLAY-IDM_START]       = 0;
  1243.              ButtonStatus[IDM_SLOWPLAY-IDM_START]   = 0;
  1244.              ButtonStatus[IDM_FASTPLAY-IDM_START]   = 0;
  1245.              ButtonStatus[IDM_PAUSE-IDM_START]      = 0;
  1246.              ButtonStatus[IDM_NEXT_FRAME-IDM_START] = 1;
  1247.              DrawItems(wnd);
  1248.              MOVIE_StepPlay();
  1249.              break;
  1250. #endif
  1251.         case IDM_PAUSE:
  1252.              if (!FileOpened) break;
  1253.              if (PlayMode==0) break;
  1254.              if (ButtonStatus[IDM_PAUSE-IDM_START]) break;
  1255.              if (PlayMode==wParam) break;
  1256.              ButtonStatus[wParam-IDM_START]         = 1;
  1257.              ButtonStatus[IDM_PLAY-IDM_START]       = 0;
  1258.              if (FileType != MOVIE_AUDIO_FILE)
  1259.              {
  1260. #ifdef  FIXBUGS
  1261.                  ButtonStatus[IDM_SLOWPLAY-IDM_START]   = 0;
  1262.                  ButtonStatus[IDM_FASTPLAY-IDM_START]   = 0;
  1263.                  ButtonStatus[IDM_NEXT_FRAME-IDM_START] = 0;
  1264. #endif
  1265.              }
  1266.              DrawItems(wnd);
  1267.              MOVIE_Pause();
  1268.              break;
  1269.         case IDM_AUTO_REWIND:
  1270.              ButtonStatus[wParam-IDM_START] ^= 1;
  1271.              DrawItem(wnd,wParam-IDM_START);
  1272.              break;
  1273.         case IDM_MUTE:
  1274.              if (FileType <= 0) break;
  1275.              ButtonStatus[wParam-IDM_START] ^= 1;
  1276.              DrawItem(wnd,wParam-IDM_START);
  1277.              MOVIE_Mute(ButtonStatus[IDM_MUTE-IDM_START]);
  1278.              break;
  1279.         case IDM_PUSH:
  1280.              GetWindowRect(wnd,&rect);
  1281.              ButtonStatus[wParam-IDM_START] ^= 1;
  1282.              DrawItem(wnd,wParam-IDM_START);
  1283.              if (ButtonStatus[IDM_PUSH-IDM_START])
  1284.              {
  1285.                  MoveWindow(wnd,rect.left,rect.top,WinWidth,WinHeight+140,TRUE);
  1286.                  MOVIE_SetBorder(ColorR,ColorG,ColorB);
  1287.              }
  1288.              else
  1289.              {
  1290.                  MoveWindow(wnd,rect.left,rect.top,WinWidth,WinHeight,TRUE);
  1291.                  MOVIE_SetBorder(0,0,0);
  1292.              }
  1293.              InvalidateRect(wnd,NULL,FALSE);
  1294.              break;
  1295.         case IDM_TOP:
  1296.              ButtonStatus[wParam-IDM_START] ^= 1;
  1297.              SetTopMost(wnd,ButtonStatus[wParam-IDM_START]);
  1298.              DrawItem(wnd,wParam-IDM_START);
  1299.              break;
  1300.         case IDM_60HZ:
  1301.              VideoFrequency = MOVIE_60HZ;
  1302.              MOVIE_SetVideoFrequency(VideoFrequency);
  1303.              CheckRadioButton(wnd,IDM_50HZ,IDM_60HZ,wParam);
  1304.              break;
  1305.         case IDM_50HZ:
  1306.              VideoFrequency = MOVIE_50HZ;
  1307.              MOVIE_SetVideoFrequency(VideoFrequency);
  1308.              CheckRadioButton(wnd,IDM_50HZ,IDM_60HZ,wParam);
  1309.              break;
  1310.         case IDM_RESET:
  1311.              DisplayX = DefaultX;
  1312.              DisplayY = DefaultY;
  1313.              SetScrollPos(WndDisplayX,SB_CTL,DisplayX,TRUE);
  1314.              SetDlgItemInt(wnd,TXT_DISPLAY_X,DisplayX,FALSE);
  1315.              SetScrollPos(WndDisplayY,SB_CTL,DisplayY,TRUE);
  1316.              SetDlgItemInt(wnd,TXT_DISPLAY_Y,DisplayY,FALSE);
  1317.              MOVIE_SetDisplayPosition(DisplayX,DisplayY);
  1318.              break;
  1319.         case IDM_OK:
  1320.              PostMessage(wnd,WM_COMMAND,IDM_PUSH,0L);
  1321.              break;
  1322.         case IDM_PTSNOTIFY:
  1323.              if (PTSFlag)
  1324.              {
  1325.                 int     Second;
  1326.                 int     Minute;
  1327.                 int     Hour;
  1328.                 char    temp[80];
  1329.  
  1330.                 Second = (int)(lParam/90000L);
  1331.                 Hour   = Second / 3600;
  1332.                 Second = Second % 3600;
  1333.                 Minute = Second / 60;
  1334.                 Second = Second % 60;
  1335.                 wsprintf(temp,"%s[%2.2d:%2.2d:%2.2d]",(LPSTR)CurTitle,Hour,Minute,Second);
  1336.                 SetWindowText(wnd,temp);
  1337.              }
  1338.              break;
  1339.         case IDM_NOTIFY:
  1340.              if (lParam == MOVIE_NOTIFY_EOF)
  1341.              {
  1342.                  WORD    SaveMode;
  1343.                  int     SaveStatus;
  1344.  
  1345.                  SaveMode = PlayMode;
  1346.                  SaveStatus = VGAStatus;
  1347.                  InternalMode = 1;
  1348.                  SendMessage(wnd,WM_COMMAND,IDM_STOP,0L);
  1349.                  InternalMode = 0;
  1350.                  if (ButtonStatus[IDM_AUTO_REWIND-IDM_START])
  1351.                  {
  1352.                      InternalMode = 1;
  1353.                      SendMessage(wnd,WM_COMMAND,SaveMode,0L);
  1354.                      InternalMode = 0;
  1355.                  }
  1356.                  else if (SongStatus == 1)
  1357.                  {
  1358.                      if (EndTrack != Track)
  1359.                      {
  1360.                          InternalMode = 1;
  1361.                          SendMessage(wnd,WM_COMMAND,IDM_NEXTSONG,0L);
  1362.                          //SendMessage(wnd,WM_COMMAND,IDM_PLAY,0L);
  1363.                          InternalMode = 0;
  1364.                      }
  1365.                      else
  1366.                      {
  1367.                          Track = StartTrack + 1;
  1368.                          InternalMode = 1;
  1369.                          SendMessage(wnd,WM_COMMAND,IDM_PRESONG,0L);
  1370.                          SendMessage(wnd,WM_COMMAND,IDM_PLAY,0L);
  1371.                          InternalMode = 0;
  1372.                      }
  1373.                      //else
  1374.                      //{
  1375.                      //    SendMessage(wnd,WM_COMMAND,IDM_VGA,0L);
  1376.                      //}
  1377.                  }
  1378.                  else
  1379.                  {
  1380.                      SendMessage(wnd,WM_COMMAND,IDM_VGA,0L);
  1381.                  }
  1382.              }
  1383.              else
  1384.              {
  1385.                  int MsgStatus = IDYES;
  1386.  
  1387.                  SendMessage(wnd,WM_COMMAND,IDM_PAUSE,0L);
  1388.                  SetVGAOutput(1);
  1389.                  if (lParam == MOVIE_READING_ERROR)
  1390.                  {
  1391.                      MsgStatus = MessageBox(wnd,"Error reading data. Stop playing now ?",CaptionName,MB_YESNO|MB_ICONQUESTION);
  1392.                  }
  1393.                  else if (lParam == MOVIE_VIDEO_DECODE_ERROR)
  1394.                  {
  1395.                      MsgStatus = MessageBox(wnd,"Error decoding video. Stop playing now ?",CaptionName,MB_YESNO|MB_ICONQUESTION);
  1396.                  }
  1397.                  else if (lParam == MOVIE_VIDEO_FIFO_ERROR)
  1398.                  {
  1399.                      MsgStatus = MessageBox(wnd,"Video FIFO overflow or underflow. Stop playing now ?",CaptionName,MB_YESNO|MB_ICONQUESTION);
  1400.                  }
  1401.                  else if (lParam == MOVIE_VIDEO_ACCESS_ERROR)
  1402.                  {
  1403.                      MsgStatus = MessageBox(wnd,"Host access error. Stop playing now ?",CaptionName,MB_YESNO|MB_ICONQUESTION);
  1404.                  }
  1405.                  else if (lParam == MOVIE_VIDEO_BUS_ERROR)
  1406.                  {
  1407.                      MsgStatus = MessageBox(wnd,"System bus error. Stop playing now ?",CaptionName,MB_YESNO|MB_ICONQUESTION);
  1408.                  }
  1409.                  else if (lParam == MOVIE_AUDIO_CRC_ERROR)
  1410.                  {
  1411.                      MsgStatus = MessageBox(wnd,"Audio CRC error. Stop playing now ?",CaptionName,MB_YESNO|MB_ICONQUESTION);
  1412.                  }
  1413.                  else
  1414.                  {
  1415.                      MsgStatus = MessageBox(wnd,"Internal error. Stop playing now ?",CaptionName,MB_YESNO|MB_ICONQUESTION);
  1416.                  }
  1417.                  if (MsgStatus == IDYES)
  1418.                  {
  1419.                      SendMessage(wnd,WM_COMMAND,IDM_STOP,0L);
  1420.                      NewSetWindowText(wnd,CaptionName);
  1421.                      ResetAllButton(wnd);
  1422.                  }
  1423.              }
  1424.              break;
  1425.         case IDM_VOL:
  1426.              {
  1427.                  POINT pt;
  1428.  
  1429.                  GetCursorPos(&pt);
  1430.                  ScreenToClient(wnd,&pt);
  1431.                  DrawVolButton(wnd);
  1432.                  if (pt.y < 16)
  1433.                  {
  1434.                      if (LeftChannel < MaxVolume) LeftChannel ++;
  1435.                      if (RightChannel < MaxVolume) RightChannel ++;
  1436.                  }
  1437.                  else
  1438.                  {
  1439.                      if (LeftChannel > MinVolume) LeftChannel --;
  1440.                      if (RightChannel > MinVolume) RightChannel --;
  1441.                  }
  1442.                  SetScrollPos(LeftChannelWnd,SB_CTL,LeftChannel,TRUE);
  1443.                  SetDlgItemInt(wnd,TXT_LEFTCHANNEL,LeftChannel,FALSE);
  1444.                  SetScrollPos(RightChannelWnd,SB_CTL,RightChannel,TRUE);
  1445.                  SetDlgItemInt(wnd,TXT_RIGHTCHANNEL,RightChannel,FALSE);
  1446.                  MOVIE_SetChannels(MaxVolume-LeftChannel,MaxVolume-RightChannel);
  1447.              }
  1448.              break;
  1449.         case IDM_VOLUP:
  1450.         case IDM_VOLDOWN:
  1451.              if (wParam == IDM_VOLUP)
  1452.              {
  1453.                  if (LeftChannel < MaxVolume) LeftChannel ++;
  1454.                  if (RightChannel < MaxVolume) RightChannel ++;
  1455.              }
  1456.              else
  1457.              {
  1458.                  if (LeftChannel > MinVolume) LeftChannel --;
  1459.                  if (RightChannel > MinVolume) RightChannel --;
  1460.              }
  1461.              SetScrollPos(LeftChannelWnd,SB_CTL,LeftChannel,TRUE);
  1462.              SetDlgItemInt(wnd,TXT_LEFTCHANNEL,LeftChannel,FALSE);
  1463.              SetScrollPos(RightChannelWnd,SB_CTL,RightChannel,TRUE);
  1464.              SetDlgItemInt(wnd,TXT_RIGHTCHANNEL,RightChannel,FALSE);
  1465.              MOVIE_SetChannels(MaxVolume-LeftChannel,MaxVolume-RightChannel);
  1466.              break;
  1467.         case IDM_SONG:
  1468.              if (!CheckCD(wnd)) break;
  1469.              if (SongStatus == 1)
  1470.              {
  1471.                  POINT pt;
  1472.                  char  temp[80];
  1473.  
  1474.                  if (!HasCDROM) break;
  1475.                  if (PlayMode) SendMessage(wnd,WM_COMMAND,IDM_STOP,0L);
  1476.                  GetCursorPos(&pt);
  1477.                  ScreenToClient(wnd,&pt);
  1478.                  DrawSongButton(wnd);
  1479.                  if (pt.y < 16)
  1480.                  {
  1481.                      if (Track < EndTrack) Track++;
  1482.                  }
  1483.                  else
  1484.                  {
  1485.                      if (Track > (BYTE)(StartTrack+1U)) Track--;
  1486.                  }
  1487.                  SetCursor(hCursorWait);
  1488.                  if (!MOVIE_CDROM_SeekTrack(Track))
  1489.                  {
  1490.                     SetCursor(hCursorArrow);
  1491.                     NewSetWindowText(wnd,CaptionName);
  1492.                     ResetAllButton(wnd);
  1493.                     wsprintf(temp,"Error seeking song %d",Track-1);
  1494.                     MessageBox(wnd,temp,CaptionName,MB_OK|MB_ICONSTOP);
  1495.                     break;
  1496.                  }
  1497.                  wsprintf(temp,"Karaoke CD: Song %d",Track-1);
  1498.                  NewSetWindowText(wnd,temp);
  1499.                  SongStatus = 1;
  1500.                  FileType = MOVIE_SYSTEM_LAYER;
  1501.                  FileOpened = 2;
  1502.                  ButtonStatus[IDM_STOP-IDM_START]        = 0;
  1503.                  ButtonStatus[IDM_PLAY-IDM_START]        = 0;
  1504. #ifdef  FIXBUGS
  1505.                  ButtonStatus[IDM_SLOWPLAY-IDM_START]    = 0;
  1506.                  ButtonStatus[IDM_FASTPLAY-IDM_START]    = 0;
  1507.                  ButtonStatus[IDM_NEXT_FRAME-IDM_START]  = 0;
  1508. #endif
  1509.                  ButtonStatus[IDM_PAUSE-IDM_START]       = -1;
  1510.                  ButtonStatus[IDM_MUTE-IDM_START]        = 0;
  1511.                  DrawItems(wnd);
  1512.                  MOVIE_Mute(ButtonStatus[IDM_MUTE-IDM_START]);
  1513.              }
  1514.              break;
  1515.         case IDM_NEXTSONG:
  1516.         case IDM_PRESONG:
  1517.              if (!CheckCD(wnd)) break;
  1518.              if (SongStatus == 1)
  1519.              {
  1520.                  char  temp[80];
  1521.  
  1522.                  if (!HasCDROM) break;
  1523.                  InternalMode = 1;
  1524.                  if (PlayMode) SendMessage(wnd,WM_COMMAND,IDM_STOP,0L);
  1525.                  InternalMode = 0;
  1526.                  if (wParam == IDM_NEXTSONG)
  1527.                  {
  1528.                      if (Track < EndTrack) Track++;
  1529.                  }
  1530.                  else
  1531.                  {
  1532.                      if (Track > (BYTE)(StartTrack+1U)) Track--;
  1533.                  }
  1534.                  SetCursor(hCursorWait);
  1535.                  if (!MOVIE_CDROM_SeekTrack(Track))
  1536.                  {
  1537.                     SetCursor(hCursorArrow);
  1538.                     NewSetWindowText(wnd,CaptionName);
  1539.                     ResetAllButton(wnd);
  1540.                     wsprintf(temp,"Error seeking song %d",Track-1);
  1541.                     MessageBox(wnd,temp,CaptionName,MB_OK|MB_ICONSTOP);
  1542.                     break;
  1543.                  }
  1544.                  SetCursor(hCursorArrow);
  1545.                  wsprintf(temp,"Karaoke CD: Song %d",Track-1);
  1546.                  NewSetWindowText(wnd,temp);
  1547.                  SongStatus = 1;
  1548.                  FileType = MOVIE_SYSTEM_LAYER;
  1549.                  FileOpened = 2;
  1550.                  ButtonStatus[IDM_STOP-IDM_START]        = 0;
  1551.                  ButtonStatus[IDM_PLAY-IDM_START]        = 0;
  1552. #ifdef  FIXBUGS
  1553.                  ButtonStatus[IDM_SLOWPLAY-IDM_START]    = 0;
  1554.                  ButtonStatus[IDM_FASTPLAY-IDM_START]    = 0;
  1555.                  ButtonStatus[IDM_NEXT_FRAME-IDM_START]  = 0;
  1556. #endif
  1557.                  ButtonStatus[IDM_PAUSE-IDM_START]       = -1;
  1558.                  ButtonStatus[IDM_MUTE-IDM_START]        = 0;
  1559.                  DrawItems(wnd);
  1560.                  MOVIE_Mute(ButtonStatus[IDM_MUTE-IDM_START]);
  1561.                  InternalMode = 1;
  1562.                  SendMessage(wnd,WM_COMMAND,IDM_PLAY,0L);
  1563.                  InternalMode = 0;
  1564.              }
  1565.              break;
  1566.         case IDM_RESETVIDEO:
  1567.              MOVIE_ResetVideo();
  1568.              break;
  1569.         case IDM_BORDER:
  1570.              DefineBorder(wnd);
  1571.              break;
  1572.         case IDM_VGA:
  1573.              SetVGAOutput(1);
  1574.              break;
  1575.         case IDM_TOGGLEVIDEO:
  1576.              SetVGAOutput(VGAStatus^1);
  1577.              break;
  1578.         case IDM_UP:
  1579.              if (DisplayY>1)
  1580.              {
  1581.                  DisplayY --;
  1582.                  SetScrollPos(WndDisplayY,SB_CTL,DisplayY,TRUE);
  1583.                  SetDlgItemInt(wnd,TXT_DISPLAY_Y,DisplayY,FALSE);
  1584.                  MOVIE_SetDisplayPosition(DisplayX,DisplayY);
  1585.              }
  1586.              break;
  1587.         case IDM_DOWN:
  1588.              if (DisplayY<255)
  1589.              {
  1590.                  DisplayY ++;
  1591.                  SetScrollPos(WndDisplayY,SB_CTL,DisplayY,TRUE);
  1592.                  SetDlgItemInt(wnd,TXT_DISPLAY_Y,DisplayY,FALSE);
  1593.                  MOVIE_SetDisplayPosition(DisplayX,DisplayY);
  1594.              }
  1595.              break;
  1596.         case IDM_RIGHT:
  1597.              if (DisplayX<255)
  1598.              {
  1599.                  DisplayX ++;
  1600.                  SetScrollPos(WndDisplayX,SB_CTL,DisplayX,TRUE);
  1601.                  SetDlgItemInt(wnd,TXT_DISPLAY_X,DisplayX,FALSE);
  1602.                  MOVIE_SetDisplayPosition(DisplayX,DisplayY);
  1603.              }
  1604.              break;
  1605.         case IDM_LEFT:
  1606.              if (DisplayX>10)
  1607.              {
  1608.                  DisplayX --;
  1609.                  SetScrollPos(WndDisplayX,SB_CTL,DisplayX,TRUE);
  1610.                  SetDlgItemInt(wnd,TXT_DISPLAY_X,DisplayX,FALSE);
  1611.                  MOVIE_SetDisplayPosition(DisplayX,DisplayY);
  1612.              }
  1613.              break;
  1614.         case IDM_DEBUG:
  1615.              SetWindowText(wnd,CurTitle);
  1616.              MOVIE_DebugToggle();
  1617.              break;
  1618.         case IDM_HELP:
  1619.              PostMessage(MainWnd,WM_COMMAND,IDM_PAUSE,0L);
  1620.              HelpInfo(wnd);
  1621.              break;
  1622.         default:
  1623.              break;
  1624.     }
  1625. }
  1626.  
  1627. void RePaint(HWND wnd)
  1628. {
  1629.     HDC         dc;
  1630.     PAINTSTRUCT ps;
  1631.     RECT        rt;
  1632.     HPEN        pen;
  1633.     HANDLE      OldPen;
  1634.  
  1635.     GetClientRect(wnd,&rt);
  1636.     dc = BeginPaint(wnd,&ps);
  1637.     pen = CreatePen(PS_SOLID,2,RGB(128,128,128));
  1638.     OldPen = SelectObject(dc,pen);
  1639.     MoveTo(dc,rt.left, rt.top+BUTTON_HEIGHT);
  1640.     LineTo(dc,rt.right,rt.top+BUTTON_HEIGHT);
  1641.     SelectObject(dc,OldPen);
  1642.     DeleteObject(pen);
  1643.     EndPaint(wnd,&ps);
  1644. }
  1645.  
  1646. /*
  1647.         Main Window Procedure
  1648. */
  1649. long FAR PASCAL MainWndProc(HWND hWnd,unsigned message,WORD wParam,LONG lParam)
  1650. {
  1651.     int    OldStatus;
  1652.     WORD   id;
  1653.     WORD * NewValue;
  1654.     WORD   MinValue;
  1655.     WORD   MaxValue;
  1656.  
  1657.     switch (message)
  1658.     {
  1659.         case WM_COMMAND:
  1660.              ProcessCommand(hWnd,wParam,lParam);
  1661.              break;
  1662.         case WM_DRAWITEM:
  1663.              id = ((LPDRAWITEMSTRUCT)lParam)->CtlID;
  1664.              if ( (((LPDRAWITEMSTRUCT)lParam)->itemAction == ODA_FOCUS) &&
  1665.                   (((LPDRAWITEMSTRUCT)lParam)->itemState == ODS_FOCUS) )
  1666.              {
  1667.                  POINT pt;
  1668.  
  1669.                  pt.x = pt.y = 15;
  1670.                  ClientToScreen(((LPDRAWITEMSTRUCT)lParam)->hwndItem,&pt);
  1671.                  /* ??? Check Current Cursor Position */
  1672.                  // GetCursorPos(&pt2);
  1673.                  SetCursorPos(pt.x,pt.y);
  1674.              }
  1675.              switch (id)
  1676.              {
  1677.                  case IDM_SONG:
  1678.                       if ( (SongStatus != -1) &&
  1679.                          (((LPDRAWITEMSTRUCT)lParam)->itemState&ODS_SELECTED) )
  1680.                       {
  1681.                           POINT pt;
  1682.  
  1683.                           GetCursorPos(&pt);
  1684.                           ScreenToClient(hWnd,&pt);
  1685.                           if (pt.y < 16)
  1686.                               DrawSongButton2(hWnd,0);
  1687.                           else
  1688.                               DrawSongButton2(hWnd,1);
  1689.                       }
  1690.                       else DrawSongButton(hWnd);
  1691.                       return NULL;
  1692.                  case IDM_VOL:
  1693.                       if (((LPDRAWITEMSTRUCT)lParam)->itemState&ODS_SELECTED)
  1694.                       {
  1695.                           POINT pt;
  1696.  
  1697.                           GetCursorPos(&pt);
  1698.                           ScreenToClient(hWnd,&pt);
  1699.                           if (pt.y < 16)
  1700.                               DrawVolButton2(hWnd,0);
  1701.                           else
  1702.                               DrawVolButton2(hWnd,1);
  1703.                       }
  1704.                       else DrawVolButton(hWnd);
  1705.                       return NULL;
  1706.                  case IDM_STOP:
  1707.                       if (!FileOpened) break;
  1708.                  case IDM_FILE:
  1709.                       if (((LPDRAWITEMSTRUCT)lParam)->itemState&ODS_SELECTED)
  1710.                       {
  1711.                           ButtonStatus[id-IDM_START] = 1;
  1712.                           DrawItem(hWnd,id-IDM_START);
  1713.                           ButtonStatus[id-IDM_START] = 0;
  1714.                           return NULL;
  1715.                       }
  1716.                       break;
  1717.                  case IDM_PLAY:
  1718. #ifdef  FIXBUGS
  1719.                  case IDM_SLOWPLAY:
  1720.                  case IDM_FASTPLAY:
  1721.                  case IDM_NEXT_FRAME:
  1722. #endif
  1723.                       if (!FileOpened) break;
  1724.                       if (FileType == MOVIE_AUDIO_FILE) break;
  1725.                       if (((LPDRAWITEMSTRUCT)lParam)->itemState&ODS_SELECTED)
  1726.                       {
  1727.                           OldStatus = ButtonStatus[id-IDM_START];
  1728.                           ButtonStatus[id-IDM_START] = 1;
  1729.                           DrawItem(hWnd,id-IDM_START);
  1730.                           ButtonStatus[id-IDM_START] = OldStatus;
  1731.                       }
  1732.                       break;
  1733.                  case IDM_CD:
  1734.                       if (!HasCDROM) break;
  1735.                       if (((LPDRAWITEMSTRUCT)lParam)->itemState&ODS_SELECTED)
  1736.                       {
  1737.                           ButtonStatus[id-IDM_START] = 1;
  1738.                           DrawItem(hWnd,id-IDM_START);
  1739.                           ButtonStatus[id-IDM_START] = 0;
  1740.                           return NULL;
  1741.                       }
  1742.                       break;
  1743.                  case IDM_PAUSE:
  1744.                       if (PlayMode == 0) break;
  1745.                       if (ButtonStatus[IDM_PAUSE-IDM_START]) break;
  1746.                  case IDM_MUTE:
  1747.                       if (!FileOpened) break;
  1748.                  default:
  1749.                       if (((LPDRAWITEMSTRUCT)lParam)->itemState&ODS_SELECTED)
  1750.                       {
  1751.                           OldStatus = ButtonStatus[id-IDM_START];
  1752.                           ButtonStatus[id-IDM_START] = 1;
  1753.                           DrawItem(hWnd,id-IDM_START);
  1754.                           ButtonStatus[id-IDM_START] = OldStatus;
  1755.                           return NULL;
  1756.                       }
  1757.                       break;
  1758.              }
  1759.              DrawItem(hWnd,id-IDM_START);
  1760.              break;
  1761.         case WM_CTLCOLOR:
  1762.              return MyCtlColor(wParam,lParam);
  1763.         case WM_HSCROLL:
  1764.              if ((HWND)HIWORD(lParam)==LeftChannelWnd)
  1765.              {
  1766.                  NewValue = &LeftChannel;
  1767.                  MaxValue = MaxVolume;
  1768.                  MinValue = MinVolume;
  1769.              }
  1770.              else if ((HWND)HIWORD(lParam)==RightChannelWnd)
  1771.              {
  1772.                  NewValue = &RightChannel;
  1773.                  MaxValue = MaxVolume;
  1774.                  MinValue = MinVolume;
  1775.              }
  1776.              else if ((HWND)HIWORD(lParam)==WndDisplayX)
  1777.              {
  1778.                  NewValue = &DisplayX;
  1779.                  MaxValue = 255;
  1780.                  MinValue = 10;
  1781.              }
  1782.              else if ((HWND)HIWORD(lParam)==WndDisplayY)
  1783.              {
  1784.                  NewValue = &DisplayY;
  1785.                  MaxValue = 255;
  1786.                  MinValue = 1;
  1787.              }
  1788.              else
  1789.                  break;
  1790.              switch (wParam)
  1791.              {
  1792.                 case SB_RIGHT:
  1793.                      *NewValue = MaxVolume;
  1794.                      break;
  1795.                 case SB_LEFT:
  1796.                      *NewValue = MinVolume;
  1797.                      break;
  1798.                 case SB_PAGEUP:
  1799.                 case SB_LINEUP:
  1800.                      if (*NewValue > MinValue) *NewValue -= 1;
  1801.                      break;
  1802.                 case SB_LINEDOWN:
  1803.                 case SB_PAGEDOWN:
  1804.                      if (*NewValue < MaxValue) *NewValue += 1;
  1805.                      break;
  1806.                 case SB_THUMBPOSITION:
  1807.                 case SB_THUMBTRACK:
  1808.                      *NewValue = LOWORD(lParam);
  1809.                      break;
  1810.                 default:
  1811.                      break;
  1812.              }
  1813.              SetScrollPos(HIWORD(lParam),SB_CTL,*NewValue,TRUE);
  1814.              if ((HWND)HIWORD(lParam)==LeftChannelWnd)
  1815.              {
  1816.                 SetDlgItemInt(hWnd,TXT_LEFTCHANNEL,*NewValue,FALSE);
  1817.                 MOVIE_SetChannels(MaxVolume-LeftChannel,MaxVolume-RightChannel);
  1818.              }
  1819.              else if ((HWND)HIWORD(lParam)==RightChannelWnd)
  1820.              {
  1821.                 SetDlgItemInt(hWnd,TXT_RIGHTCHANNEL,*NewValue,FALSE);
  1822.                 MOVIE_SetChannels(MaxVolume-LeftChannel,MaxVolume-RightChannel);
  1823.              }
  1824.              else if ((HWND)HIWORD(lParam)==WndDisplayX)
  1825.              {
  1826.                 SetDlgItemInt(hWnd,TXT_DISPLAY_X,*NewValue,FALSE);
  1827.                 MOVIE_SetDisplayPosition(DisplayX,DisplayY);
  1828.              }
  1829.              else if ((HWND)HIWORD(lParam)==WndDisplayY)
  1830.              {
  1831.                 SetDlgItemInt(hWnd,TXT_DISPLAY_Y,*NewValue,FALSE);
  1832.                 MOVIE_SetDisplayPosition(DisplayX,DisplayY);
  1833.              }
  1834.              break;
  1835.         case WM_PAINT:
  1836.              RePaint(hWnd);
  1837.              break;
  1838.         case WM_RBUTTONDBLCLK:
  1839.         case WM_NCRBUTTONDBLCLK:
  1840.              SetVGAOutput(VGAStatus^1);
  1841.              break;
  1842.         case WM_ACTIVATEAPP:
  1843.              if (!wParam)
  1844.              {
  1845.                  SetVGAOutput(1);
  1846.              }
  1847.              break;
  1848.         case WM_KILLFOCUS:
  1849.              SetVGAOutput(1);
  1850.              break;
  1851. #ifdef USE_CTL3D
  1852.         case WM_SYSCOLORCHANGE:
  1853.              Ctl3dColorChange();
  1854.              break;
  1855. #endif
  1856.         case WM_DESTROY:
  1857.              ReleaseResources();
  1858.              DeleteObject(MainBrush);
  1859.              MOVIE_Exit(SaveOnExit);
  1860.              PostQuitMessage(0);
  1861.              break;
  1862.         case WM_CREATE:
  1863.              if (!AllocateResources(hWnd,MainInst))
  1864.              {
  1865.                 MessageBox(hWnd,"Cannot allocate resources",CaptionName,MB_OK|MB_ICONSTOP);
  1866.                 DestroyWindow(hWnd);
  1867.              }
  1868.              hCursorArrow = LoadCursor(NULL, IDC_ARROW);
  1869.              hCursorWait  = LoadCursor(NULL, IDC_WAIT);
  1870.              CheckMediaChanged = GetPrivateProfileInt(Section,"CheckMediaChanged",0,MOVIEINI);
  1871.              Frequency = GetPrivateProfileInt(Section,"Frequency",60,MOVIEINI);
  1872.              if (Frequency == 50)
  1873.                  VideoFrequency = MOVIE_50HZ;
  1874.              else
  1875.                  VideoFrequency = MOVIE_60HZ;
  1876.              LeftChannel  = MaxVolume-GetPrivateProfileInt(Section,"LeftChannel",10,MOVIEINI);
  1877.              if (LeftChannel>63) LeftChannel = 53;
  1878.              RightChannel = MaxVolume-GetPrivateProfileInt(Section,"RightChannel",10,MOVIEINI);
  1879.              if (RightChannel>63) RightChannel = 53;
  1880.              DefaultX = GetPrivateProfileInt("Default","VideoX",15,MOVIEINI);
  1881.              DefaultY = GetPrivateProfileInt("Default","VideoY",5,MOVIEINI);
  1882.              if ( (DisplayX < 10) || (DisplayX > 255) ) DefaultX = 15;
  1883.              if ( (DisplayY < 1)  || (DisplayY > 255) ) DefaultY = 5;
  1884.              DisplayX = GetPrivateProfileInt(Section,"VideoX",DefaultX,MOVIEINI);
  1885.              DisplayY = GetPrivateProfileInt(Section,"VideoY",DefaultY,MOVIEINI);
  1886.              if ( (DisplayX < 10) || (DisplayX > 255) ) DisplayX = DefaultX;
  1887.              if ( (DisplayY < 1)  || (DisplayY > 255) ) DisplayY = DefaultY;
  1888.              ColorR = GetPrivateProfileInt(Section,"BorderR",0,  MOVIEINI);
  1889.              ColorG = GetPrivateProfileInt(Section,"BorderG",0,  MOVIEINI);
  1890.              ColorB = GetPrivateProfileInt(Section,"BorderB",31,MOVIEINI);
  1891.              if (ColorR > 31) ColorR = 31;
  1892.              if (ColorG > 31) ColorG = 31;
  1893.              if (ColorB > 31) ColorB = 31;
  1894.              PTSFlag = GetPrivateProfileInt(Section,"PTSNotify",0,MOVIEINI);
  1895.              SetErrorMode(SEM_FAILCRITICALERRORS);
  1896.              CheckRadioButton(hWnd,IDM_50HZ,IDM_60HZ,(VideoFrequency)?IDM_60HZ:IDM_50HZ);
  1897.              SetScrollRange(LeftChannelWnd,SB_CTL,MinVolume,MaxVolume,FALSE);
  1898.              SetScrollPos(LeftChannelWnd,SB_CTL,LeftChannel,TRUE);
  1899.              SetDlgItemInt(hWnd,TXT_LEFTCHANNEL,LeftChannel,FALSE);
  1900.              SetScrollRange(RightChannelWnd,SB_CTL,MinVolume,MaxVolume,FALSE);
  1901.              SetScrollPos(RightChannelWnd,SB_CTL,RightChannel,TRUE);
  1902.              SetDlgItemInt(hWnd,TXT_RIGHTCHANNEL,RightChannel,FALSE);
  1903.              SetScrollRange(WndDisplayX,SB_CTL,10,255,FALSE);
  1904.              SetScrollPos(WndDisplayX,SB_CTL,DisplayX,TRUE);
  1905.              SetDlgItemInt(hWnd,TXT_DISPLAY_X,DisplayX,FALSE);
  1906.              SetScrollRange(WndDisplayY,SB_CTL,1,255,FALSE);
  1907.              SetScrollPos(WndDisplayY,SB_CTL,DisplayY,TRUE);
  1908.              SetDlgItemInt(hWnd,TXT_DISPLAY_Y,DisplayY,FALSE);
  1909.              SetVGAOutput(VGAStatus);
  1910.              MOVIE_SetChannels(MaxVolume-LeftChannel,MaxVolume-RightChannel);
  1911.              MOVIE_SetDisplayPosition(DisplayX,DisplayY);
  1912.              MOVIE_SetVideoFrequency(VideoFrequency);
  1913.              MOVIE_SetBorder(ColorR,ColorG,ColorB);
  1914.              MOVIE_MovieNotify(hWnd,IDM_NOTIFY);
  1915.              if (PTSFlag) MOVIE_PTSNotify(hWnd,IDM_PTSNOTIFY);
  1916.              break;
  1917.         default:
  1918.              return DefWindowProc(hWnd,message,wParam,lParam);
  1919.    }
  1920.    return NULL;
  1921. }
  1922.  
  1923. BOOL RegisterAllClass(HANDLE hInstance)
  1924. {
  1925.     WNDCLASS  wc;
  1926.  
  1927.     MainAccel = LoadAccelerators(MainInst,"MPGMovieAccel");
  1928.     MainBrush = CreateSolidBrush(COLOR);
  1929.     wc.style         = CS_DBLCLKS;
  1930. #ifndef _INC_WINDOWS    /* MSC 6.0 */
  1931.     wc.lpfnWndProc   = MainWndProc;
  1932. #else                   /* MSC 7.0 */
  1933.     wc.lpfnWndProc   = (WNDPROC)MainWndProc;
  1934. #endif
  1935.     wc.cbClsExtra    = 0;
  1936.     wc.cbWndExtra    = 0;
  1937.     wc.hInstance     = hInstance;
  1938.     wc.hIcon         = LoadIcon(hInstance,IconName);
  1939.     wc.hCursor       = LoadCursor(NULL,IDC_ARROW);
  1940.     wc.hbrBackground = MainBrush;
  1941.     wc.lpszMenuName  = NULL;
  1942.     wc.lpszClassName = ClassName;
  1943.     if(!RegisterClass(&wc)) return FALSE;
  1944.     return TRUE;
  1945. }
  1946.  
  1947. BOOL CreateWindows(HANDLE hInstance,int nCmdShow)
  1948. {
  1949.     WinWidth  = ((MAX_BUTTON+2) * BUTTON_WIDTH) + (2 * GetSystemMetrics(SM_CXBORDER));
  1950.     WinHeight = BUTTON_HEIGHT + GetSystemMetrics(SM_CYCAPTION) +
  1951.                 (2 * GetSystemMetrics(SM_CYBORDER));
  1952.     MainWnd = CreateWindow(ClassName,CaptionName,
  1953.                         DS_SYSMODAL|WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_BORDER,
  1954.                         CW_USEDEFAULT,CW_USEDEFAULT,
  1955.                         WinWidth,WinHeight,
  1956.                         NULL,NULL,hInstance,NULL);
  1957.     if (!MainWnd) return FALSE;
  1958.     ShowWindow(MainWnd,nCmdShow);
  1959.     UpdateWindow(MainWnd);
  1960.     return TRUE;
  1961. }
  1962.  
  1963. void ProcessCmdLine(HWND hWnd,LPSTR lpCmdLine)
  1964. {
  1965.     if ( (lpCmdLine != NULL) && (lstrlen(lpCmdLine)!=0) )
  1966.     {
  1967.         lstrcpy(szOpenFileName,lpCmdLine);
  1968.         CmdFile = 1;
  1969.         if (lstrcmp(szOpenFileName,"VIDEOCD")==0)
  1970.             SendMessage(hWnd,WM_COMMAND,IDM_CD,0L);
  1971.         else
  1972.             SendMessage(hWnd,WM_COMMAND,IDM_FILE,0L);
  1973.         SendMessage(hWnd,WM_COMMAND,IDM_PLAY,0L);
  1974.     }
  1975. }
  1976.  
  1977. /*
  1978.         Program Entry Point
  1979. */
  1980. int PASCAL WinMain(HANDLE hInstance,HANDLE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
  1981. {
  1982.     MSG  msg;
  1983.     HWND wnd;
  1984.     BOOL Quit;
  1985.  
  1986.     MainInst = hInstance;
  1987.     if (hPrevInstance)
  1988.     {
  1989.         if ( (wnd=FindWindow(ClassName,CaptionName)) != NULL)
  1990.         {
  1991.             BringWindowToTop(wnd);
  1992.             if (IsIconic(wnd)) ShowWindow(wnd,SW_RESTORE);
  1993.         }
  1994.         return FALSE;
  1995.     }
  1996.  
  1997. #ifdef USE_CTL3D
  1998.     Ctl3dRegister(hInstance);
  1999.     Ctl3dAutoSubclass(hInstance);
  2000. #endif
  2001.  
  2002.     if ( (GetWinFlags() & WF_ENHANCED) == 0)
  2003.     {
  2004.         MessageBox(NULL,"Please run Windows in 386 enhanced mode",CaptionName,MB_OK|MB_ICONSTOP);
  2005. #ifdef USE_CTL3D
  2006.     Ctl3dUnregister(hInstance);
  2007. #endif
  2008.         return FALSE;
  2009.     }
  2010.     switch (MOVIE_Initialize())
  2011.     {
  2012.         case 0:
  2013.              MessageBox(NULL,"Cannot detect MPEG Player hardware",CaptionName,MB_OK|MB_ICONSTOP);
  2014. #ifdef USE_CTL3D
  2015.     Ctl3dUnregister(hInstance);
  2016. #endif
  2017.              return FALSE;
  2018.         case -1:
  2019.              {
  2020.                 int DMAsize = 16;
  2021.  
  2022.                 DMAsize = GetPrivateProfileInt("386Enh","DMABUFFERSIZE",16,"SYSTEM.INI");
  2023.                 if (DMAsize < 60)
  2024.                 {
  2025.                     WritePrivateProfileInt("386Enh","DMABUFFERSIZE",60,"SYSTEM.INI");
  2026.                 }
  2027.                 MessageBox(NULL,"Please restart Windows and run the MPEG Player utility again",CaptionName,MB_OK|MB_ICONSTOP);
  2028.              }
  2029. #ifdef USE_CTL3D
  2030.     Ctl3dUnregister(hInstance);
  2031. #endif
  2032.              return FALSE;
  2033.         case -2:
  2034.              MessageBox(NULL,"Cannot allocate memory below 1MB. Plesae restart Windows or see the README.TXT.",CaptionName,MB_OK|MB_ICONSTOP);
  2035. #ifdef USE_CTL3D
  2036.     Ctl3dUnregister(hInstance);
  2037. #endif
  2038.              return FALSE;
  2039.         case -3:
  2040.              MessageBox(NULL,"Please run Windows in 386 enhanced mode",CaptionName,MB_OK|MB_ICONSTOP);
  2041. #ifdef USE_CTL3D
  2042.     Ctl3dUnregister(hInstance);
  2043. #endif
  2044.              return FALSE;
  2045.         case 1:
  2046.              break;
  2047.         default:
  2048.              MessageBox(NULL,"Initialization error",CaptionName,MB_OK|MB_ICONSTOP);
  2049. #ifdef USE_CTL3D
  2050.     Ctl3dUnregister(hInstance);
  2051. #endif
  2052.              return FALSE;
  2053.     }
  2054.     if (!RegisterAllClass(hInstance))
  2055.     {
  2056. #ifdef USE_CTL3D
  2057.     Ctl3dUnregister(hInstance);
  2058. #endif
  2059.         return FALSE;
  2060.     }
  2061.     if (!CreateWindows(hInstance,nCmdShow))
  2062.     {
  2063. #ifdef USE_CTL3D
  2064.     Ctl3dUnregister(hInstance);
  2065. #endif
  2066.         return FALSE;
  2067.     }
  2068.     ProcessCmdLine(MainWnd,lpCmdLine);
  2069. /*
  2070.     while (GetMessage(&msg,NULL,NULL,NULL))
  2071.     {
  2072.         if (!TranslateAccelerator(MainWnd,MainAccel,&msg))
  2073.         {
  2074.             if (!IsDialogMessage(MainWnd,&msg))
  2075.             {
  2076.                 TranslateMessage(&msg);
  2077.                 DispatchMessage(&msg);
  2078.             }
  2079.         }
  2080.     }
  2081. */
  2082.     for (Quit=FALSE;;)
  2083.     {
  2084.         while (PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE))
  2085.         {
  2086.             if (msg.message == WM_QUIT)
  2087.             {
  2088.                 Quit = TRUE;
  2089.                 break;
  2090.             }
  2091.             if (!TranslateAccelerator(MainWnd,MainAccel,&msg))
  2092.             {
  2093.                 if (!IsDialogMessage(MainWnd,&msg))
  2094.                 {
  2095.                     TranslateMessage(&msg);
  2096.                     DispatchMessage(&msg);
  2097.                 }
  2098.             }
  2099.         }
  2100.         if (Quit) break;
  2101.         MOVIE_SendData();
  2102.     }
  2103. #ifdef USE_CTL3D
  2104.     Ctl3dUnregister(hInstance);
  2105. #endif
  2106.     return (msg.wParam);
  2107. }
  2108.