home *** CD-ROM | disk | FTP | other *** search
/ Multi-CD Magazin 1993 January / MultiCDMagazin0193_2ndEd.bin / cdplayer / cddialog.pas < prev    next >
Pascal/Delphi Source File  |  1993-08-06  |  22KB  |  704 lines

  1. UNIT CDDIALOG;
  2.  
  3. INTERFACE
  4.  
  5.  
  6. USES WINTYPES,WINPROCS,WIN31,OWINDOWS,STRINGS,BWCC,ODIALOGS,MMSYSTEM,
  7.      CDISC,COMMON,ABOUTDLG;
  8.  
  9.  
  10. Const     MAXTRACKS           =  20;
  11.  
  12.          { DISC CONTENTS }
  13.           IDB_DISC_HDR        = 501;
  14.           IDB_MAX_TRCK        = 502;
  15.           IDB_DISC_LEN        = 503;
  16.  
  17.          { CURRENT TRACK (CT) }
  18.           IDB_CURR_HDR        = 511;
  19.           IDB_CURR_TRCK       = 512;
  20.           IDB_CURR_TIME       = 513;
  21.           IDB_CURR_LEN        = 514;
  22.  
  23.          { TRACK SELECTION }
  24.           IDB_TRACKMIN        = 101;
  25.           IDB_TRACKMAX        = 120;
  26.  
  27.          { CONTROL BUTTONS }
  28.           IDB_EJECT           = 805;
  29.           IDB_PREV            = 801;
  30.           IDB_NEXT            = 802;
  31.           IDB_STOP            = 803;
  32.           IDB_OFF             = IDOK;
  33.           IDB_HELP            = IDHELP;
  34.  
  35.          { PROGRAM BUTTON }
  36.           IDB_WIPE            = 806;
  37.           IDB_BACK            = 807;
  38.           IDB_PLAY            = 808;
  39.  
  40.          { OPTIONS }
  41.           IDCB_PROGRAM        = 201;
  42.           IDCB_REPEAT         = 202;
  43.  
  44.          {PROGRAM ITEMS }
  45.          IDSTC_ITEM01         = 401;
  46.          IDSTC_ITEM24         = 424;
  47.  
  48.          { TIMER INTERVAL }
  49.           ST_TIMER            = 200;
  50.  
  51.          { PROGRAM MODES }
  52.           PRG_OFF             = 0;      { NOT IN PROGRAM MODE }
  53.           PRG_FIRST           = 1;      { JUST STARTED THE FIRST TRACK }
  54.           PRG_NEXT            = 2;      { ANY OTHER TRACK }
  55.  
  56.           TRK_PREV            = -1;     { FIND PREVIOUS PROGRAMMED TRACK }
  57.           TRK_NEXT            = +1;     { FIND NEXT PROGRAMMED TRACK }
  58.  
  59.          { SYSTEM MENU EXTENSIONS }
  60.           IDM_HELP            = 150;
  61.           IDM_ABOUT           = 151;
  62.           IDM_ONTOP           = 152;
  63.  
  64.  
  65. Type      PDlgCD = ^TDlgCD;
  66.           TDlgCD = Object (TDlgWindow)
  67.                      szCurrTrck, szPrevTrck : TCharArray;
  68.                      szCurrTime, szPrevTime, szCurrLen : TCharArray;
  69.                      szMaxTrack, szDiscLen : TCharArray;
  70.                      pICD : PCompactDisc;
  71.                      fDiscReachedEnd:Boolean;
  72.                      wProgram:Word;
  73.                      iPrgItem:Integer;
  74.                      hSysMenu:HMENU;
  75.                      Procedure SetupWindow; VIRTUAL;
  76.                      Destructor Done; VIRTUAL;
  77.                      Function GetClassName:pChar; VIRTUAL;
  78.                      Procedure GetWindowClass (VAR AWndClass:TWndClass); VIRTUAL;
  79.                      Procedure WMCommand (VAR Msg:TMessage); VIRTUAL WM_FIRST+WM_COMMAND;
  80.                      Procedure WMTimer (VAR Msg:TMessage); VIRTUAL WM_FIRST+WM_TIMER;
  81.                      Procedure WMDrawItem (VAR Msg:TMessage); VIRTUAL WM_FIRST+WM_DRAWITEM;
  82.                      Procedure WMCtlColor (VAR Msg:TMessage); VIRTUAL WM_FIRST+WM_CTLCOLOR;
  83.                      Procedure MMMciNotify (VAR Msg:TMessage); VIRTUAL WM_FIRST+MM_MCINOTIFY;
  84.                      Procedure EnableTrackButtons;
  85.                      Procedure EnableSkipButtons (fPrev,fNext:Boolean);
  86.                      Function HasTrackChanged:Boolean;
  87.                      Procedure MsgBox (pMsg:pChar);
  88.                      Procedure Stop;
  89.                     { BUTTONS }
  90.                      Procedure BtnHelp (VAR Msg:TMessage); VIRTUAL ID_FIRST+IDB_HELP;
  91.                      Procedure BtnPrev (VAR Msg:TMessage); VIRTUAL ID_FIRST+IDB_PREV;
  92.                      Procedure BtnNext (VAR Msg:TMessage); VIRTUAL ID_FIRST+IDB_NEXT;
  93.                      Procedure BtnStop (VAR Msg:TMessage); VIRTUAL ID_FIRST+IDB_STOP;
  94.                      Procedure BtnEject (VAR Msg:TMessage); VIRTUAL ID_FIRST+IDB_EJECT;
  95.                     { PROGRAM }
  96.                      Function GetProgramTrack (VAR iID:Integer; iDir:Integer):pChar;
  97.                      Procedure ClearProgramItems;
  98.                      Procedure UpdateItemColors;
  99.                      Procedure StartProgram;
  100.                      Procedure BtnWipe (VAR Msg:TMessage); VIRTUAL ID_FIRST+IDB_WIPE;
  101.                      Procedure BtnBack (VAR Msg:TMessage); VIRTUAL ID_FIRST+IDB_BACK;
  102.                      Procedure BtnPlay (VAR Msg:TMessage); VIRTUAL ID_FIRST+IDB_PLAY;
  103.                     { 7 SEGMENT }
  104.                      Procedure Draw7Seg (DC:HDC; Rect:TRECT; szBuf:TCharArray; iZoom:Integer);
  105.                      Procedure Update7Seg (ID:Integer);
  106.                     { SYSTEM MENU EXTENSIONS }
  107.                      Procedure WMSysCommand (Var Msg:TMessage); VIRTUAL WM_FIRST+WM_SYSCOMMAND;
  108.                      Procedure MnuHelp;
  109.                      Procedure MnuAbout;
  110.                      Procedure MnuOnTop;
  111.                    End;
  112.  
  113.  
  114.  
  115. IMPLEMENTATION
  116.  
  117.  
  118.  
  119. Var hMainWindow:HWND;
  120.  
  121.  
  122.  
  123. Procedure FailProc (dwRC:LongInt; pRC:pChar);FAR;
  124. Begin;
  125.   MessageBeep (MB_ICONEXCLAMATION);
  126.   BWCCMessageBox (hMainWindow,pRC,'CD Player - Error',MB_OK OR MB_ICONEXCLAMATION);
  127. End;
  128.  
  129.  
  130.  
  131. Procedure TDlgCD.Stop;
  132. Begin;
  133.   pICD^.Stop;
  134.   StrCopy (szCurrTrck,'00');
  135.   StrCopy (szCurrTime,'00:00');
  136.   StrCopy (szCurrLen,'00:00');
  137.   Update7Seg(IDB_CURR_TRCK);
  138.   Update7Seg(IDB_CURR_TIME);
  139.   Update7Seg(IDB_CURR_LEN);
  140.   EnableSkipButtons (FALSE,FALSE);
  141.   wProgram:=PRG_OFF;
  142.   UpdateItemColors;
  143. End;
  144.  
  145.  
  146. Procedure TDlgCD.MsgBox (pMsg:pChar);
  147. Begin;
  148.   MessageBeep (MB_ICONINFORMATION);
  149.   BWCCMessageBox (HWindow,pMsg,'CD Player',MB_OK OR MB_ICONINFORMATION);
  150. End;
  151.  
  152.  
  153. Function TDlgCD.GetClassName:pChar;
  154. Begin;
  155.   GetClassName:='BORDLG_CDPLAYER';
  156. End;
  157.  
  158.  
  159. Procedure TDlgCD.GetWindowClass (VAR AWndClass:TWndClass);
  160. Begin;
  161.   TDlgWindow.GetWindowClass (AWndClass);
  162.   AWndClass.hIcon:=LoadIcon (hInstance,'CDPLAYER');
  163.   AWndClass.lpfnWndProc:=@BWCCDefDlgProc;
  164. End;
  165.  
  166.  
  167.  
  168. Procedure TDlgCD.Update7Seg (ID:Integer);
  169. Begin;
  170.   RedrawWindow (GetItemHandle(ID),NIL,0,RDW_INVALIDATE OR RDW_UPDATENOW);
  171. End;
  172.  
  173.  
  174. Procedure TDlgCD.Draw7Seg (DC:HDC; Rect:TRECT; szBuf:TCharArray; iZoom:Integer);
  175.  Var hBMP : HBITMAP;
  176.       DCx : HDC;
  177.      TBMP : TBITMAP;
  178.     iW,iH,
  179.   iR,iX,i : Integer;
  180.  xbuf,buf : TCharArray;
  181. Begin;
  182.   iX:=0;
  183.  { GET TOTAL WIDTH OF BITMAPS }
  184.   For i:=0 To (StrLen(szBuf)-1) Do Begin;
  185.    { SELECT BITMAP }
  186.     StrCopy (buf,'7SEG_');
  187.     FillChar (xbuf,(sizeof(xbuf)-1),0);
  188.     If (szBuf[i] IN ['0'..'9']) Then xbuf[0]:=szBuf[i];
  189.     If (szBuf[i] = ':') Then StrCopy (xbuf,'COLON');
  190.     If (szBuf[i] = ' ') Then StrCopy (xbuf,'BLANK');
  191.     If (szBuf[i] = '-') Then StrCopy (xbuf,'DASH');
  192.     StrCat (buf,xbuf);
  193.    { BITMAP INFO }
  194.     hBMP:=LoadBitmap(hInstance,buf);
  195.     GetObject (hBMP,sizeof(TBMP),@TBMP);
  196.     DeleteObject (hBMP);
  197.     Inc (iX,(TBMP.BMWIDTH*iZoom));
  198.   End;
  199.  { LINKE ECKE BERECHNEN, UM BITMAPS ZU ZENTRIEREN }
  200.   iX:=((Rect.RIGHT-Rect.LEFT) DIV 2) - (iX DIV 2);
  201.   iR:=Rect.RIGHT; Rect.RIGHT:=iX;
  202.   FillRect (DC,Rect,GetStockObject(BLACK_BRUSH));
  203.  { WALK THE BUFFER }
  204.   For i:=0 To (StrLen(szBuf)-1) Do Begin;
  205.    { SELECT BITMAP }
  206.     StrCopy (buf,'7SEG_');
  207.     FillChar (xbuf,(sizeof(xbuf)-1),0);
  208.     If (szBuf[i] IN ['0'..'9']) Then xbuf[0]:=szBuf[i];
  209.     If (szBuf[i] = ':') Then StrCopy (xbuf,'COLON');
  210.     If (szBuf[i] = ' ') Then StrCopy (xbuf,'BLANK');
  211.     If (szBuf[i] = '-') Then StrCopy (xbuf,'DASH');
  212.     StrCat (buf,xbuf);
  213.    { DRAW BITMAP }
  214.     hBMP:=LoadBitmap(hInstance,buf);
  215.     DCx:=CreateCompatibleDC (DC);
  216.     SelectObject (DCX,hBMP);
  217.     GetObject (hBMP,sizeof(TBMP),@TBMP);
  218.     iW:=TBMP.BMWIDTH;
  219.     iH:=TBMP.BMHEIGHT;
  220.     StretchBlt (DC,iX,0,iW*iZoom,iH*iZoom,DCx,0,0,iW,iH,SRCCOPY);
  221.     DeleteDC (DCx);
  222.     DeleteObject (hBMP);
  223.    { ADVANCE }
  224.     Inc (iX,(TBMP.BMWIDTH*iZoom));
  225.   End;
  226.   Rect.LEFT:=iX; Rect.RIGHT:=iR;
  227.   FillRect (DC,Rect,GetStockObject(BLACK_BRUSH));
  228. End;
  229.  
  230.  
  231.  
  232. Procedure TDlgCD.WMCtlColor (VAR Msg:TMessage);
  233.   Var hChild,
  234.        hItem : HWND;
  235.     hDCChild : HDC;
  236.     iID,iCtl : Integer;
  237.          buf : TCharArray;
  238. Begin;
  239.   TDlgWindow.DefWndProc (Msg);
  240.   hDCChild:=HDC(Msg.wParam);
  241.   hChild:=HWND(LOWORD(Msg.lParam));
  242.   iCtl:=Integer(HIWORD(Msg.lParam));
  243.   If (iCtl=CTLCOLOR_STATIC) Then Begin;
  244.     SetBkMode (hDCChild,TRANSPARENT);
  245.    { DEFAULT ITEM COLOR: BLUE }
  246.     SetTextColor (hDCChild,RGB(0,0,255));
  247.     For iID:=IDSTC_ITEM01 To IDSTC_ITEM24 Do Begin;
  248.       hItem:=GetItemHandle(iID);
  249.       GetDlgItemText (HWindow,iID,buf,sizeof(buf)-1);
  250.      { PLAYING PROGRAM ITEM: RED }
  251.       If (hItem=hChild) AND (wProgram<>PRG_OFF) AND
  252.          (iPrgItem=iID) AND (StrComp(buf,szCurrTrck)=0) Then SetTextColor (hDCChild,RGB(255,0,0))
  253.     End;
  254.     Msg.Result:=GetStockObject(LTGRAY_BRUSH);
  255.   End;
  256. End;
  257.  
  258.  
  259. Procedure TDlgCD.WMDrawItem (VAR Msg:TMessage);
  260.  Var pDIS : PDRAWITEMSTRUCT;
  261.       Wnd : HWND;
  262.      hFnt,
  263.  hPrevFnt : HFONT;
  264.    DC,DCx : HDC;
  265.      hBMP : HBITMAP;
  266.      TBMP : TBITMAP;
  267.        ID : Integer;
  268.      Rect : TRECT;
  269.       buf,
  270.      xbuf : TCharArray;
  271. Begin;
  272.   pDIS:=PDRAWITEMSTRUCT(Msg.lParam);
  273.   TDlgWindow.DefWndProc(Msg);
  274.   Rect:=pDIS^.RCITEM;
  275.   Wnd:=pDIS^.HWNDITEM;
  276.   DC:=pDIS^.HDC;
  277.   ID:=pDIS^.CtlID;
  278.  { 7-SEGMENT DISPLAYS }
  279.   If (ID=IDB_CURR_TRCK) Then Begin; Draw7Seg (DC,Rect,szCurrTrck,4); EXIT; End;
  280.   If (ID=IDB_CURR_TIME) Then Begin; Draw7Seg (DC,Rect,szCurrTime,1); EXIT; End;
  281.   If (ID=IDB_CURR_LEN)  Then Begin; Draw7Seg (DC,Rect,szCurrLen,1);  EXIT; End;
  282.   If (ID=IDB_MAX_TRCK)  Then Begin; Draw7Seg (DC,Rect,szMaxTrack,4); EXIT; End;
  283.   If (ID=IDB_DISC_LEN)  Then Begin; Draw7Seg (DC,Rect,szDiscLen,1);  EXIT; End;
  284.  { GET THE BUTTON TO DRAW }
  285.   If (ID=IDB_OFF) Then StrCopy (buf,'OFF_');
  286.   If (ID=IDB_HELP) Then StrCopy (buf,'HELP_');
  287.   If (ID=IDB_STOP) Then StrCopy (buf,'STOP_');
  288.   If (ID=IDB_WIPE) Then StrCopy (buf,'WIPE_');
  289.   If (ID=IDB_BACK) Then StrCopy (buf,'BACK_');
  290.   If (ID=IDB_PLAY) Then StrCopy (buf,'PLAY_');
  291.   If (ID=IDB_PREV) Then StrCopy (buf,'PREV_');
  292.   If (ID=IDB_NEXT) Then StrCopy (buf,'NEXT_');
  293.   If (ID=IDB_EJECT) Then StrCopy (buf,'EJECT_');
  294.   If (ID>=IDB_TRACKMIN) AND (ID<=IDB_TRACKMAX) Then StrCopy (buf,'TRACK_');
  295.  { BUTTON STATES }
  296.   StrCopy (xbuf,'NOFOCUS');
  297.   If ((pDIS^.ITEMSTATE AND ODS_FOCUS)<>0) Then StrCopy (xbuf,'FOCUS');
  298.   If ((pDIS^.ITEMSTATE AND ODS_SELECTED)<>0) Then StrCopy (xbuf,'SELECTED');
  299.   If ((pDIS^.ITEMSTATE AND ODS_DISABLED)<>0) Then StrCopy (xbuf,'DISABLED');
  300.   StrCat (buf,xbuf);
  301.  { SPECIAL BUTTONS }
  302.   If (ID=IDB_DISC_HDR) Then StrCopy (buf,'DISCTRACKS_HDR');
  303.   If (ID=IDB_CURR_HDR) Then StrCopy (buf,'CURRTRACK_HDR');
  304.   hBMP:=LoadBitmap(hInstance,buf);
  305.   DCx:=CreateCompatibleDC (DC);
  306.   SelectObject (DCX,hBMP);
  307.   GetObject (hBMP,sizeof(TBMP),@TBMP);
  308.   BitBlt (DC,0,0,TBMP.BMWIDTH,TBMP.BMHEIGHT,DCx,0,0,SRCCOPY);
  309.   DeleteDC (DCx);
  310.   DeleteObject (hBMP);
  311.  { TRACK BUTTONS ? - PRINT THE TRACK NUMBER ON THE BITMAP-BUTTON }
  312.   If (ID>=IDB_TRACKMIN) AND (ID<=IDB_TRACKMAX) Then Begin;
  313.     hFnt:=CreateFont (6,0,0,0,400,0,0,0,0,0,0,0,0,'MS Sans Serif');
  314.     hPrevFnt:=SelectObject (DC,hFnt);
  315.     Str ((ID-100):2,buf); If (buf[0]=' ') Then buf[0]:='0';
  316.     SetTextColor (DC,RGB(255,255,255));
  317.     If ((pDIS^.ITEMSTATE AND ODS_FOCUS)<>0) Then SetTextColor (DC,RGB(255,255,0));
  318.     If ((pDIS^.ITEMSTATE AND ODS_DISABLED)<>0) Then SetTextColor (DC,RGB(096,096,096));
  319.     If ((pDIS^.ITEMSTATE AND ODS_SELECTED)<>0) Then SetTextColor (DC,RGB(255,0,0));
  320.     TextOut (DC,3,3,buf,strlen(buf));
  321.     DeleteObject (hFnt);
  322.     SelectObject (DC,hPrevFnt);
  323.   End;
  324. End;
  325.  
  326.  
  327.  
  328. Procedure TDlgCD.WMCommand (VAR Msg:TMessage);
  329.  Var buf:TCharArray;
  330.      wID,wProg:Word;
  331.      rc:Integer;
  332. Begin;
  333.   TDlgWindow.WMCommand (Msg);
  334.   wID:=Msg.wParam;
  335.   If (Msg.lParamHi=BN_CLICKED) AND (wID>=IDB_TRACKMIN) AND (wID<=IDB_TRACKMAX) Then Begin;
  336.     Case (IsDlgButtonChecked(hWindow,IDCB_PROGRAM)=BF_UNCHECKED) Of
  337.        TRUE : If (wProgram = PRG_OFF) Then Begin;
  338.                 Str ((wID-IDB_TRACKMIN)+1,buf);
  339.                 pICD^.Play (buf);
  340.                 EnableSkipButtons (TRUE,TRUE);
  341.               End Else MsgBox ('Es wird gerade das Programm abgespielt.');
  342.       FALSE : Begin;
  343.                 wProg:=IDSTC_ITEM01;
  344.                { FIND NEXT FREE ITEM }
  345.                 Repeat;
  346.                   GetDlgItemText (hWindow,wProg,buf,SizeOf(buf)-1);
  347.                   If (StrLen(buf)<>0) Then Inc(wProg);
  348.                 Until (StrLen(buf)=0) OR (wProg>IDSTC_ITEM24);
  349.                 If (wProg>IDSTC_ITEM24) Then Begin;
  350.                   MsgBox ('Der gesamte Speicherplatz ist belegt.'); EXIT;
  351.                 End;
  352.                 GetDlgItemText (hWindow,wID,buf,SizeOf(buf)-1);
  353.                 SetDlgItemText (hWindow,wProg,buf);
  354.                 UpdateItemColors;
  355.               End;
  356.     End;
  357.   End;
  358. End;
  359.  
  360.  
  361. Procedure TDlgCD.EnableSkipButtons (fPrev,fNext:Boolean);
  362. Begin;
  363.   EnableWindow (GetItemHandle(IDB_PREV),fPrev);
  364.   EnableWindow (GetItemHandle(IDB_NEXT),fNext);
  365. End;
  366.  
  367.  
  368. Procedure TDlgCD.EnableTrackButtons;
  369.  Var wMax,wTrck,wID:Word;
  370. Begin;
  371.   Val (szMaxTrack,wMax,wID);
  372.   For wTrck:=1 To MAXTRACKS Do Begin;
  373.     wID:=(IDB_TRACKMIN+wTrck)-1;
  374.     EnableWindow (GetItemHandle(wID),(wTrck<=wMax));
  375.   End;
  376. End;
  377.  
  378.  
  379.  
  380. Procedure TDlgCD.BtnEject (VAR Msg:TMessage);
  381. Begin;
  382.   Stop;
  383.   pICD^.Eject;
  384. End;
  385.  
  386.  
  387.  
  388. Procedure TDlgCD.BtnHelp (VAR Msg:TMessage);
  389. Begin;
  390.   MnuHelp;
  391. End;
  392.  
  393.  
  394.  
  395. Procedure TDlgCD.BtnPrev (VAR Msg:TMessage);
  396.  Var wTrck,wMax:Word;
  397.         rc:Integer;
  398.        buf:TCharArray;
  399. Begin;
  400.   pICD^.Stop;
  401.   Case (wProgram=PRG_OFF) Of
  402.      TRUE : Begin;
  403.               Val (szCurrTrck,wTrck,rc);
  404.               Val (szMaxTrack,wMax,rc);
  405.               Dec (wTrck); If (wTrck<1) Then wTrck:=wMax;
  406.               Str (wTrck,buf);
  407.               pICD^.Play(buf);
  408.             End;
  409.     FALSE : Begin;
  410.               StrCopy (buf,GetProgramTrack (iPrgItem,TRK_PREV));
  411.               If (StrLen(buf)<>0) Then Begin;
  412.                 pICD^.Play(buf); wProgram:=PRG_FIRST;
  413.               End Else Stop;
  414.             End;
  415.   End;
  416. End;
  417.  
  418.  
  419. Procedure TDlgCD.BtnNext (VAR Msg:TMessage);
  420.  Var wTrck,wMax:Word;
  421.         rc:Integer;
  422.        buf:TCharArray;
  423. Begin;
  424.   pICD^.Stop;
  425.   Case (wProgram=PRG_OFF) Of
  426.      TRUE : Begin;
  427.               Val (szCurrTrck,wTrck,rc);
  428.               Val (szMaxTrack,wMax,rc);
  429.               Inc (wTrck); If (wTrck>wMax) Then wTrck:=1;
  430.               Str (wTrck,buf);
  431.               pICD^.Play(buf);
  432.             End;
  433.     FALSE : Begin;
  434.               StrCopy (buf,GetProgramTrack (iPrgItem,TRK_NEXT));
  435.               If (StrLen(buf)<>0) Then Begin;
  436.                 pICD^.Play(buf); wProgram:=PRG_FIRST;
  437.               End Else Stop;
  438.             End;
  439.   End;
  440. End;
  441.  
  442.  
  443. Procedure TDlgCD.BtnStop (VAR Msg:TMessage);
  444. Begin;
  445.   Stop;
  446. End;
  447.  
  448.  
  449. Procedure TDlgCD.UpdateItemColors;
  450.  Var iID:Integer;
  451. Begin;
  452.   For iID:=IDSTC_ITEM01 To IDSTC_ITEM24 Do
  453.     RedrawWindow (GetItemHandle(iID),NIL,0,RDW_INVALIDATE OR RDW_UPDATENOW);
  454. End;
  455.  
  456.  
  457. Function TDlgCD.HasTrackChanged:Boolean;
  458.  Var fChanged:Boolean;
  459. Begin;
  460.   StrCopy (szPrevTrck,szCurrTrck);
  461.   StrCopy (szCurrTrck,pICD^.GetCurrentTrack);
  462.   fChanged:=(StrComp(szCurrTrck,szPrevTrck)<>0);
  463.   If (fChanged) Then Begin;
  464.     StrCopy (szCurrLen,pICD^.GetTrackLength(szCurrTrck));
  465.     Update7Seg (IDB_CURR_TRCK);
  466.     Update7Seg (IDB_CURR_LEN);
  467.   End;
  468.   HasTrackChanged:=fChanged;
  469. End;
  470.  
  471.  
  472.  
  473. Procedure TDlgCD.MMMciNotify (VAR Msg:TMessage);
  474. Begin;
  475.   fDiscReachedEnd:=(Msg.wParam=MCI_NOTIFY_SUCCESSFUL);
  476. End;
  477.  
  478.  
  479. Procedure TDlgCD.WMTimer (VAR Msg:TMessage);
  480.  Var       wID : Word;
  481.             rc : Integer;
  482.  szID,buf,xbuf : TCharArray;
  483.   fDiscPresent,
  484.       fChanged,
  485.        fRepeat : Boolean;
  486. Begin;
  487.   TDlgWindow.DefWndProc (Msg);
  488.   KillTimer (hWindow,10);
  489.   fDiscPresent:=pICD^.IsPresent;
  490.  { PRESENCE STATUS CHANGED ? }
  491.   Case (fDiscPresent) Of
  492.      TRUE : If (StrComp(szDiscLen,'00:00')=0) Then Begin;
  493.               StrCopy (szMaxTrack,pICD^.GetTrackCount);
  494.               StrCopy (szDiscLen,pICD^.GetDiscLength);
  495.               EnableSkipButtons (FALSE,FALSE);
  496.               EnableTrackButtons;
  497.               RedrawWindow (hWindow,NIL,0,RDW_INVALIDATE OR RDW_UPDATENOW OR RDW_ALLCHILDREN);
  498.             End;
  499.     FALSE : If (StrComp(szDiscLen,'00:00')<>0) Then Begin;
  500.               wProgram:=PRG_OFF;
  501.               StrCopy (szCurrTrck,'00');
  502.               StrCopy (szCurrTime,'00:00');
  503.               StrCopy (szCurrLen,'00:00');
  504.               StrCopy (szMaxTrack,'00');
  505.               StrCopy (szDiscLen,'00:00');
  506.               EnableSkipButtons (FALSE,FALSE);
  507.               EnableTrackButtons;
  508.               RedrawWindow (hWindow,NIL,0,RDW_INVALIDATE OR RDW_UPDATENOW OR RDW_ALLCHILDREN);
  509.             End;
  510.   End;
  511.  
  512.  { PRESENT & PLAYING ? }
  513.   If (fDiscPresent) Then If ((pICD^.IsPlaying) OR (fDiscReachedEnd)) Then Begin;
  514.    { TIME CHANGED ? }
  515.     StrCopy (szPrevTime,szCurrTime);
  516.     StrCopy (szCurrTime,pICD^.GetCurrentTrackTime);
  517.     If (StrComp(szCurrTime,szPrevTime)<>0) Then Update7Seg (IDB_CURR_TIME);
  518.    { TRACK CHANGED }
  519.     fChanged:=HasTrackChanged OR fDiscReachedEnd;
  520.     fRepeat:=IsDlgButtonChecked(hWindow,IDCB_REPEAT)=BF_CHECKED;
  521.    { PLAY MODE - TRACK CHANGED }
  522.     If (wProgram=PRG_OFF) AND (fDiscReachedEnd) AND (fRepeat) Then Begin;
  523.       Stop;
  524.       pICD^.Play('01');
  525.       HasTrackChanged;
  526.     End;
  527.    { PROGRAM MODE - GET NEXT ITEM IF TRACK HAS CHANGED }
  528.     If (wProgram<>PRG_OFF) AND (fChanged) Then Begin;
  529.       If (wProgram=PRG_NEXT) Then Begin;
  530.         StrCopy(buf,GetProgramTrack (iPrgItem,TRK_NEXT));
  531.         If (StrLen(buf)<>0) Then pICD^.Play(buf)
  532.         Else Begin; Stop; If (fRepeat) Then StartProgram; End;
  533.       End;
  534.       If (wProgram=PRG_FIRST) Then wProgram:=PRG_NEXT;
  535.       HasTrackChanged; UpdateItemColors;
  536.     End;
  537.     fDiscReachedEnd:=FALSE;
  538.   End;
  539.  { RE-ENABLE TIMER }
  540.   SetTimer (hWindow,10,ST_TIMER,NIL);
  541. End;
  542.  
  543.  
  544.  
  545. Procedure TDlgCD.SetupWindow;
  546. Begin;
  547.   wProgram:=PRG_OFF;
  548.   TDlgWindow.SetupWindow;
  549.   hMainWindow:=hWindow;
  550.  { UPDATE SYSTEM-MENU }
  551.   hSysMenu:=GetSystemMenu(hWindow,FALSE);
  552.   AppendMenu (hSysMenu,MF_SEPARATOR,0,NIL);
  553.   AppendMenu (hSysMenu,MF_STRING,IDM_HELP,'&Hilfe...');
  554.   AppendMenu (hSysMenu,MF_STRING,IDM_ABOUT,'&▄ber CD Player...');
  555.   AppendMenu (hSysMenu,MF_SEPARATOR,0,NIL);
  556.   AppendMenu (hSysMenu,MF_STRING,IDM_ONTOP,'Immer im &Vordergrund');
  557.  { CREATE DISC-OBJECT }
  558.   pICD:=New(PCompactDisc,Init(hWindow));
  559.   pICD^.SetFailProc (FailProc);
  560.   fDiscReachedEnd:=FALSE;
  561.   StrCopy (szCurrTrck,'00');
  562.   StrCopy (szPrevTrck,'00');
  563.   StrCopy (szCurrTime,'00:00');
  564.   StrCopy (szCurrLen,'00:00');
  565.   StrCopy (szMaxTrack,'00');
  566.   StrCopy (szDiscLen,'00:00');
  567.   EnableTrackButtons;
  568.   EnableSkipButtons (FALSE,FALSE);
  569.   UpdateItemColors;
  570.   CheckDlgButton (hWindow,IDCB_PROGRAM,BF_UNCHECKED);
  571.   CheckDlgButton (hWindow,IDCB_REPEAT,BF_UNCHECKED);
  572.   SetTimer (hWindow,10,ST_TIMER,NIL);
  573. End;
  574.  
  575.  
  576. Destructor TDlgCD.Done;
  577. Begin;
  578.   KillTimer (hWindow,10);
  579.   WinHelp (hWindow,'CDPLAYER.HLP',HELP_QUIT,0);
  580.   piCD^.Stop;
  581.   pICD^.Eject;
  582.   Dispose (pICD,Done);
  583.   TDlgWindow.Done;
  584. End;
  585.  
  586.  
  587.  
  588.  
  589.  
  590. { PROGRAM }
  591. Function TDlgCD.GetProgramTrack (VAR iID:Integer; iDir:Integer):pChar;
  592.  Var  buf:TCharArray;
  593.      fOut:Boolean;
  594. Begin;
  595.   StrCopy (buf,'');
  596.   Repeat;
  597.     iID:=iID+iDir;
  598.     fOut:=(iID<IDSTC_ITEM01) OR (iID>IDSTC_ITEM24);
  599.     If (NOT fOut) Then GetDlgItemText (hWindow,iID,buf,sizeof(buf)-1);
  600.   Until (fOut) OR (StrLen(buf)<>0);
  601.   If (fOut) Then iID:=IDSTC_ITEM01;
  602.   UpdateItemColors;
  603.   GetProgramTrack:=buf;
  604. End;
  605.  
  606.  
  607. Procedure TDlgCD.ClearProgramItems;
  608.  Var iID:Word;
  609. Begin;
  610.   For iID:=IDSTC_ITEM01 To IDSTC_ITEM24 Do SetDlgItemText (hWindow,iID,'');
  611. End;
  612.  
  613.  
  614. Procedure TDlgCD.BtnWipe (VAR Msg:TMessage);
  615. Begin;
  616.   ClearProgramItems;
  617. End;
  618.  
  619.  
  620. Procedure TDlgCD.BtnBack (VAR Msg:TMessage);
  621.  Var buf:TCharArray;
  622.      iID:Integer;
  623. Begin;
  624.  { DEN LETZTEN BELEGTEN PROGRAMMPLATZ FINDEN & L╓SCHEN }
  625.   iID:=(IDSTC_ITEM24+1);
  626.   StrCopy (buf,GetProgramTrack(iID,TRK_PREV));
  627.   If (StrLen(buf)<>0) Then SetDlgItemText (hWindow,iID,'');
  628. End;
  629.  
  630.  
  631. Procedure TDlgCD.StartProgram;
  632.  Var buf:TCharArray;
  633. Begin;
  634.  { FANGE MIT DEM ERSTEN PROGRAMMPLATZ AN }
  635.   iPrgItem:=(IDSTC_ITEM01-1);
  636.   StrCopy (buf,GetProgramTrack (iPrgItem,TRK_NEXT));
  637.   If (StrLen(buf)>0) Then Begin;
  638.    { CD PRESENT ? }
  639.     If (NOT pICD^.IsPresent) Then Begin;
  640.       MsgBox ('Es befindet sich keine CD im Laufwerk.'); EXIT;
  641.     End;
  642.    { PLAY PROGRAM }
  643.     wProgram:=PRG_FIRST;
  644.     pICD^.Play(buf);
  645.     EnableSkipButtons (TRUE,TRUE);
  646.   End Else MsgBox ('Der Programmspeicher ist leer.');
  647. End;
  648.  
  649.  
  650. Procedure TDlgCD.BtnPlay (VAR Msg:TMessage);
  651. Begin;
  652.   StartProgram;
  653. End;
  654.  
  655.  
  656.  
  657. { SYSTEM MENU EXTANSIONS }
  658. Procedure TDlgCD.WMSysCommand (VAR Msg:TMessage);
  659. Begin;
  660.   TDlgWindow.DefWndProc (Msg);
  661.   Case (Msg.wParam) Of
  662.      IDM_HELP : MnuHelp;
  663.     IDM_ABOUT : MnuAbout;
  664.     IDM_ONTOP : MnuOnTop;
  665.   End;
  666. End;
  667.  
  668.  
  669. Procedure TDlgCD.MnuHelp;
  670. Begin;
  671.   WinHelp (hWindow,'CDPLAYER.HLP',HELP_CONTENTS,0);
  672. End;
  673.  
  674.  
  675. Procedure TDlgCD.MnuAbout;
  676.  Var DlgAbout : TDlgAbout;
  677. Begin;
  678.   DlgAbout.Init (@Self,'ABOUT');
  679.   DlgAbout.Execute;
  680.   DlgAbout.Done;
  681. End;
  682.  
  683.  
  684. Procedure TDlgCD.MnuOnTop;
  685.  Var fChecked:Boolean;
  686. Begin;
  687.   fChecked:=(GetMenuState(hSysMenu,IDM_ONTOP,MF_BYCOMMAND) AND MF_CHECKED)=MF_CHECKED;
  688.   Case (fChecked) Of
  689.     TRUE : Begin;
  690.              CheckMenuItem (hSysMenu,IDM_ONTOP,MF_BYCOMMAND OR MF_UNCHECKED);
  691.              SetWindowPos (hWindow,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE OR SWP_NOSIZE);
  692.            End;
  693.    FALSE : Begin;
  694.              CheckMenuItem (hSysMenu,IDM_ONTOP,MF_BYCOMMAND OR MF_CHECKED);
  695.              SetWindowPos (hWindow,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE OR SWP_NOSIZE);
  696.            End;
  697.   End;
  698. End;
  699.  
  700.  
  701.  
  702. END.
  703.  
  704.