home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Multi-CD Magazin 1993 January
/
MultiCDMagazin0193_2ndEd.bin
/
cdplayer
/
cddialog.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1993-08-06
|
22KB
|
704 lines
UNIT CDDIALOG;
INTERFACE
USES WINTYPES,WINPROCS,WIN31,OWINDOWS,STRINGS,BWCC,ODIALOGS,MMSYSTEM,
CDISC,COMMON,ABOUTDLG;
Const MAXTRACKS = 20;
{ DISC CONTENTS }
IDB_DISC_HDR = 501;
IDB_MAX_TRCK = 502;
IDB_DISC_LEN = 503;
{ CURRENT TRACK (CT) }
IDB_CURR_HDR = 511;
IDB_CURR_TRCK = 512;
IDB_CURR_TIME = 513;
IDB_CURR_LEN = 514;
{ TRACK SELECTION }
IDB_TRACKMIN = 101;
IDB_TRACKMAX = 120;
{ CONTROL BUTTONS }
IDB_EJECT = 805;
IDB_PREV = 801;
IDB_NEXT = 802;
IDB_STOP = 803;
IDB_OFF = IDOK;
IDB_HELP = IDHELP;
{ PROGRAM BUTTON }
IDB_WIPE = 806;
IDB_BACK = 807;
IDB_PLAY = 808;
{ OPTIONS }
IDCB_PROGRAM = 201;
IDCB_REPEAT = 202;
{PROGRAM ITEMS }
IDSTC_ITEM01 = 401;
IDSTC_ITEM24 = 424;
{ TIMER INTERVAL }
ST_TIMER = 200;
{ PROGRAM MODES }
PRG_OFF = 0; { NOT IN PROGRAM MODE }
PRG_FIRST = 1; { JUST STARTED THE FIRST TRACK }
PRG_NEXT = 2; { ANY OTHER TRACK }
TRK_PREV = -1; { FIND PREVIOUS PROGRAMMED TRACK }
TRK_NEXT = +1; { FIND NEXT PROGRAMMED TRACK }
{ SYSTEM MENU EXTENSIONS }
IDM_HELP = 150;
IDM_ABOUT = 151;
IDM_ONTOP = 152;
Type PDlgCD = ^TDlgCD;
TDlgCD = Object (TDlgWindow)
szCurrTrck, szPrevTrck : TCharArray;
szCurrTime, szPrevTime, szCurrLen : TCharArray;
szMaxTrack, szDiscLen : TCharArray;
pICD : PCompactDisc;
fDiscReachedEnd:Boolean;
wProgram:Word;
iPrgItem:Integer;
hSysMenu:HMENU;
Procedure SetupWindow; VIRTUAL;
Destructor Done; VIRTUAL;
Function GetClassName:pChar; VIRTUAL;
Procedure GetWindowClass (VAR AWndClass:TWndClass); VIRTUAL;
Procedure WMCommand (VAR Msg:TMessage); VIRTUAL WM_FIRST+WM_COMMAND;
Procedure WMTimer (VAR Msg:TMessage); VIRTUAL WM_FIRST+WM_TIMER;
Procedure WMDrawItem (VAR Msg:TMessage); VIRTUAL WM_FIRST+WM_DRAWITEM;
Procedure WMCtlColor (VAR Msg:TMessage); VIRTUAL WM_FIRST+WM_CTLCOLOR;
Procedure MMMciNotify (VAR Msg:TMessage); VIRTUAL WM_FIRST+MM_MCINOTIFY;
Procedure EnableTrackButtons;
Procedure EnableSkipButtons (fPrev,fNext:Boolean);
Function HasTrackChanged:Boolean;
Procedure MsgBox (pMsg:pChar);
Procedure Stop;
{ BUTTONS }
Procedure BtnHelp (VAR Msg:TMessage); VIRTUAL ID_FIRST+IDB_HELP;
Procedure BtnPrev (VAR Msg:TMessage); VIRTUAL ID_FIRST+IDB_PREV;
Procedure BtnNext (VAR Msg:TMessage); VIRTUAL ID_FIRST+IDB_NEXT;
Procedure BtnStop (VAR Msg:TMessage); VIRTUAL ID_FIRST+IDB_STOP;
Procedure BtnEject (VAR Msg:TMessage); VIRTUAL ID_FIRST+IDB_EJECT;
{ PROGRAM }
Function GetProgramTrack (VAR iID:Integer; iDir:Integer):pChar;
Procedure ClearProgramItems;
Procedure UpdateItemColors;
Procedure StartProgram;
Procedure BtnWipe (VAR Msg:TMessage); VIRTUAL ID_FIRST+IDB_WIPE;
Procedure BtnBack (VAR Msg:TMessage); VIRTUAL ID_FIRST+IDB_BACK;
Procedure BtnPlay (VAR Msg:TMessage); VIRTUAL ID_FIRST+IDB_PLAY;
{ 7 SEGMENT }
Procedure Draw7Seg (DC:HDC; Rect:TRECT; szBuf:TCharArray; iZoom:Integer);
Procedure Update7Seg (ID:Integer);
{ SYSTEM MENU EXTENSIONS }
Procedure WMSysCommand (Var Msg:TMessage); VIRTUAL WM_FIRST+WM_SYSCOMMAND;
Procedure MnuHelp;
Procedure MnuAbout;
Procedure MnuOnTop;
End;
IMPLEMENTATION
Var hMainWindow:HWND;
Procedure FailProc (dwRC:LongInt; pRC:pChar);FAR;
Begin;
MessageBeep (MB_ICONEXCLAMATION);
BWCCMessageBox (hMainWindow,pRC,'CD Player - Error',MB_OK OR MB_ICONEXCLAMATION);
End;
Procedure TDlgCD.Stop;
Begin;
pICD^.Stop;
StrCopy (szCurrTrck,'00');
StrCopy (szCurrTime,'00:00');
StrCopy (szCurrLen,'00:00');
Update7Seg(IDB_CURR_TRCK);
Update7Seg(IDB_CURR_TIME);
Update7Seg(IDB_CURR_LEN);
EnableSkipButtons (FALSE,FALSE);
wProgram:=PRG_OFF;
UpdateItemColors;
End;
Procedure TDlgCD.MsgBox (pMsg:pChar);
Begin;
MessageBeep (MB_ICONINFORMATION);
BWCCMessageBox (HWindow,pMsg,'CD Player',MB_OK OR MB_ICONINFORMATION);
End;
Function TDlgCD.GetClassName:pChar;
Begin;
GetClassName:='BORDLG_CDPLAYER';
End;
Procedure TDlgCD.GetWindowClass (VAR AWndClass:TWndClass);
Begin;
TDlgWindow.GetWindowClass (AWndClass);
AWndClass.hIcon:=LoadIcon (hInstance,'CDPLAYER');
AWndClass.lpfnWndProc:=@BWCCDefDlgProc;
End;
Procedure TDlgCD.Update7Seg (ID:Integer);
Begin;
RedrawWindow (GetItemHandle(ID),NIL,0,RDW_INVALIDATE OR RDW_UPDATENOW);
End;
Procedure TDlgCD.Draw7Seg (DC:HDC; Rect:TRECT; szBuf:TCharArray; iZoom:Integer);
Var hBMP : HBITMAP;
DCx : HDC;
TBMP : TBITMAP;
iW,iH,
iR,iX,i : Integer;
xbuf,buf : TCharArray;
Begin;
iX:=0;
{ GET TOTAL WIDTH OF BITMAPS }
For i:=0 To (StrLen(szBuf)-1) Do Begin;
{ SELECT BITMAP }
StrCopy (buf,'7SEG_');
FillChar (xbuf,(sizeof(xbuf)-1),0);
If (szBuf[i] IN ['0'..'9']) Then xbuf[0]:=szBuf[i];
If (szBuf[i] = ':') Then StrCopy (xbuf,'COLON');
If (szBuf[i] = ' ') Then StrCopy (xbuf,'BLANK');
If (szBuf[i] = '-') Then StrCopy (xbuf,'DASH');
StrCat (buf,xbuf);
{ BITMAP INFO }
hBMP:=LoadBitmap(hInstance,buf);
GetObject (hBMP,sizeof(TBMP),@TBMP);
DeleteObject (hBMP);
Inc (iX,(TBMP.BMWIDTH*iZoom));
End;
{ LINKE ECKE BERECHNEN, UM BITMAPS ZU ZENTRIEREN }
iX:=((Rect.RIGHT-Rect.LEFT) DIV 2) - (iX DIV 2);
iR:=Rect.RIGHT; Rect.RIGHT:=iX;
FillRect (DC,Rect,GetStockObject(BLACK_BRUSH));
{ WALK THE BUFFER }
For i:=0 To (StrLen(szBuf)-1) Do Begin;
{ SELECT BITMAP }
StrCopy (buf,'7SEG_');
FillChar (xbuf,(sizeof(xbuf)-1),0);
If (szBuf[i] IN ['0'..'9']) Then xbuf[0]:=szBuf[i];
If (szBuf[i] = ':') Then StrCopy (xbuf,'COLON');
If (szBuf[i] = ' ') Then StrCopy (xbuf,'BLANK');
If (szBuf[i] = '-') Then StrCopy (xbuf,'DASH');
StrCat (buf,xbuf);
{ DRAW BITMAP }
hBMP:=LoadBitmap(hInstance,buf);
DCx:=CreateCompatibleDC (DC);
SelectObject (DCX,hBMP);
GetObject (hBMP,sizeof(TBMP),@TBMP);
iW:=TBMP.BMWIDTH;
iH:=TBMP.BMHEIGHT;
StretchBlt (DC,iX,0,iW*iZoom,iH*iZoom,DCx,0,0,iW,iH,SRCCOPY);
DeleteDC (DCx);
DeleteObject (hBMP);
{ ADVANCE }
Inc (iX,(TBMP.BMWIDTH*iZoom));
End;
Rect.LEFT:=iX; Rect.RIGHT:=iR;
FillRect (DC,Rect,GetStockObject(BLACK_BRUSH));
End;
Procedure TDlgCD.WMCtlColor (VAR Msg:TMessage);
Var hChild,
hItem : HWND;
hDCChild : HDC;
iID,iCtl : Integer;
buf : TCharArray;
Begin;
TDlgWindow.DefWndProc (Msg);
hDCChild:=HDC(Msg.wParam);
hChild:=HWND(LOWORD(Msg.lParam));
iCtl:=Integer(HIWORD(Msg.lParam));
If (iCtl=CTLCOLOR_STATIC) Then Begin;
SetBkMode (hDCChild,TRANSPARENT);
{ DEFAULT ITEM COLOR: BLUE }
SetTextColor (hDCChild,RGB(0,0,255));
For iID:=IDSTC_ITEM01 To IDSTC_ITEM24 Do Begin;
hItem:=GetItemHandle(iID);
GetDlgItemText (HWindow,iID,buf,sizeof(buf)-1);
{ PLAYING PROGRAM ITEM: RED }
If (hItem=hChild) AND (wProgram<>PRG_OFF) AND
(iPrgItem=iID) AND (StrComp(buf,szCurrTrck)=0) Then SetTextColor (hDCChild,RGB(255,0,0))
End;
Msg.Result:=GetStockObject(LTGRAY_BRUSH);
End;
End;
Procedure TDlgCD.WMDrawItem (VAR Msg:TMessage);
Var pDIS : PDRAWITEMSTRUCT;
Wnd : HWND;
hFnt,
hPrevFnt : HFONT;
DC,DCx : HDC;
hBMP : HBITMAP;
TBMP : TBITMAP;
ID : Integer;
Rect : TRECT;
buf,
xbuf : TCharArray;
Begin;
pDIS:=PDRAWITEMSTRUCT(Msg.lParam);
TDlgWindow.DefWndProc(Msg);
Rect:=pDIS^.RCITEM;
Wnd:=pDIS^.HWNDITEM;
DC:=pDIS^.HDC;
ID:=pDIS^.CtlID;
{ 7-SEGMENT DISPLAYS }
If (ID=IDB_CURR_TRCK) Then Begin; Draw7Seg (DC,Rect,szCurrTrck,4); EXIT; End;
If (ID=IDB_CURR_TIME) Then Begin; Draw7Seg (DC,Rect,szCurrTime,1); EXIT; End;
If (ID=IDB_CURR_LEN) Then Begin; Draw7Seg (DC,Rect,szCurrLen,1); EXIT; End;
If (ID=IDB_MAX_TRCK) Then Begin; Draw7Seg (DC,Rect,szMaxTrack,4); EXIT; End;
If (ID=IDB_DISC_LEN) Then Begin; Draw7Seg (DC,Rect,szDiscLen,1); EXIT; End;
{ GET THE BUTTON TO DRAW }
If (ID=IDB_OFF) Then StrCopy (buf,'OFF_');
If (ID=IDB_HELP) Then StrCopy (buf,'HELP_');
If (ID=IDB_STOP) Then StrCopy (buf,'STOP_');
If (ID=IDB_WIPE) Then StrCopy (buf,'WIPE_');
If (ID=IDB_BACK) Then StrCopy (buf,'BACK_');
If (ID=IDB_PLAY) Then StrCopy (buf,'PLAY_');
If (ID=IDB_PREV) Then StrCopy (buf,'PREV_');
If (ID=IDB_NEXT) Then StrCopy (buf,'NEXT_');
If (ID=IDB_EJECT) Then StrCopy (buf,'EJECT_');
If (ID>=IDB_TRACKMIN) AND (ID<=IDB_TRACKMAX) Then StrCopy (buf,'TRACK_');
{ BUTTON STATES }
StrCopy (xbuf,'NOFOCUS');
If ((pDIS^.ITEMSTATE AND ODS_FOCUS)<>0) Then StrCopy (xbuf,'FOCUS');
If ((pDIS^.ITEMSTATE AND ODS_SELECTED)<>0) Then StrCopy (xbuf,'SELECTED');
If ((pDIS^.ITEMSTATE AND ODS_DISABLED)<>0) Then StrCopy (xbuf,'DISABLED');
StrCat (buf,xbuf);
{ SPECIAL BUTTONS }
If (ID=IDB_DISC_HDR) Then StrCopy (buf,'DISCTRACKS_HDR');
If (ID=IDB_CURR_HDR) Then StrCopy (buf,'CURRTRACK_HDR');
hBMP:=LoadBitmap(hInstance,buf);
DCx:=CreateCompatibleDC (DC);
SelectObject (DCX,hBMP);
GetObject (hBMP,sizeof(TBMP),@TBMP);
BitBlt (DC,0,0,TBMP.BMWIDTH,TBMP.BMHEIGHT,DCx,0,0,SRCCOPY);
DeleteDC (DCx);
DeleteObject (hBMP);
{ TRACK BUTTONS ? - PRINT THE TRACK NUMBER ON THE BITMAP-BUTTON }
If (ID>=IDB_TRACKMIN) AND (ID<=IDB_TRACKMAX) Then Begin;
hFnt:=CreateFont (6,0,0,0,400,0,0,0,0,0,0,0,0,'MS Sans Serif');
hPrevFnt:=SelectObject (DC,hFnt);
Str ((ID-100):2,buf); If (buf[0]=' ') Then buf[0]:='0';
SetTextColor (DC,RGB(255,255,255));
If ((pDIS^.ITEMSTATE AND ODS_FOCUS)<>0) Then SetTextColor (DC,RGB(255,255,0));
If ((pDIS^.ITEMSTATE AND ODS_DISABLED)<>0) Then SetTextColor (DC,RGB(096,096,096));
If ((pDIS^.ITEMSTATE AND ODS_SELECTED)<>0) Then SetTextColor (DC,RGB(255,0,0));
TextOut (DC,3,3,buf,strlen(buf));
DeleteObject (hFnt);
SelectObject (DC,hPrevFnt);
End;
End;
Procedure TDlgCD.WMCommand (VAR Msg:TMessage);
Var buf:TCharArray;
wID,wProg:Word;
rc:Integer;
Begin;
TDlgWindow.WMCommand (Msg);
wID:=Msg.wParam;
If (Msg.lParamHi=BN_CLICKED) AND (wID>=IDB_TRACKMIN) AND (wID<=IDB_TRACKMAX) Then Begin;
Case (IsDlgButtonChecked(hWindow,IDCB_PROGRAM)=BF_UNCHECKED) Of
TRUE : If (wProgram = PRG_OFF) Then Begin;
Str ((wID-IDB_TRACKMIN)+1,buf);
pICD^.Play (buf);
EnableSkipButtons (TRUE,TRUE);
End Else MsgBox ('Es wird gerade das Programm abgespielt.');
FALSE : Begin;
wProg:=IDSTC_ITEM01;
{ FIND NEXT FREE ITEM }
Repeat;
GetDlgItemText (hWindow,wProg,buf,SizeOf(buf)-1);
If (StrLen(buf)<>0) Then Inc(wProg);
Until (StrLen(buf)=0) OR (wProg>IDSTC_ITEM24);
If (wProg>IDSTC_ITEM24) Then Begin;
MsgBox ('Der gesamte Speicherplatz ist belegt.'); EXIT;
End;
GetDlgItemText (hWindow,wID,buf,SizeOf(buf)-1);
SetDlgItemText (hWindow,wProg,buf);
UpdateItemColors;
End;
End;
End;
End;
Procedure TDlgCD.EnableSkipButtons (fPrev,fNext:Boolean);
Begin;
EnableWindow (GetItemHandle(IDB_PREV),fPrev);
EnableWindow (GetItemHandle(IDB_NEXT),fNext);
End;
Procedure TDlgCD.EnableTrackButtons;
Var wMax,wTrck,wID:Word;
Begin;
Val (szMaxTrack,wMax,wID);
For wTrck:=1 To MAXTRACKS Do Begin;
wID:=(IDB_TRACKMIN+wTrck)-1;
EnableWindow (GetItemHandle(wID),(wTrck<=wMax));
End;
End;
Procedure TDlgCD.BtnEject (VAR Msg:TMessage);
Begin;
Stop;
pICD^.Eject;
End;
Procedure TDlgCD.BtnHelp (VAR Msg:TMessage);
Begin;
MnuHelp;
End;
Procedure TDlgCD.BtnPrev (VAR Msg:TMessage);
Var wTrck,wMax:Word;
rc:Integer;
buf:TCharArray;
Begin;
pICD^.Stop;
Case (wProgram=PRG_OFF) Of
TRUE : Begin;
Val (szCurrTrck,wTrck,rc);
Val (szMaxTrack,wMax,rc);
Dec (wTrck); If (wTrck<1) Then wTrck:=wMax;
Str (wTrck,buf);
pICD^.Play(buf);
End;
FALSE : Begin;
StrCopy (buf,GetProgramTrack (iPrgItem,TRK_PREV));
If (StrLen(buf)<>0) Then Begin;
pICD^.Play(buf); wProgram:=PRG_FIRST;
End Else Stop;
End;
End;
End;
Procedure TDlgCD.BtnNext (VAR Msg:TMessage);
Var wTrck,wMax:Word;
rc:Integer;
buf:TCharArray;
Begin;
pICD^.Stop;
Case (wProgram=PRG_OFF) Of
TRUE : Begin;
Val (szCurrTrck,wTrck,rc);
Val (szMaxTrack,wMax,rc);
Inc (wTrck); If (wTrck>wMax) Then wTrck:=1;
Str (wTrck,buf);
pICD^.Play(buf);
End;
FALSE : Begin;
StrCopy (buf,GetProgramTrack (iPrgItem,TRK_NEXT));
If (StrLen(buf)<>0) Then Begin;
pICD^.Play(buf); wProgram:=PRG_FIRST;
End Else Stop;
End;
End;
End;
Procedure TDlgCD.BtnStop (VAR Msg:TMessage);
Begin;
Stop;
End;
Procedure TDlgCD.UpdateItemColors;
Var iID:Integer;
Begin;
For iID:=IDSTC_ITEM01 To IDSTC_ITEM24 Do
RedrawWindow (GetItemHandle(iID),NIL,0,RDW_INVALIDATE OR RDW_UPDATENOW);
End;
Function TDlgCD.HasTrackChanged:Boolean;
Var fChanged:Boolean;
Begin;
StrCopy (szPrevTrck,szCurrTrck);
StrCopy (szCurrTrck,pICD^.GetCurrentTrack);
fChanged:=(StrComp(szCurrTrck,szPrevTrck)<>0);
If (fChanged) Then Begin;
StrCopy (szCurrLen,pICD^.GetTrackLength(szCurrTrck));
Update7Seg (IDB_CURR_TRCK);
Update7Seg (IDB_CURR_LEN);
End;
HasTrackChanged:=fChanged;
End;
Procedure TDlgCD.MMMciNotify (VAR Msg:TMessage);
Begin;
fDiscReachedEnd:=(Msg.wParam=MCI_NOTIFY_SUCCESSFUL);
End;
Procedure TDlgCD.WMTimer (VAR Msg:TMessage);
Var wID : Word;
rc : Integer;
szID,buf,xbuf : TCharArray;
fDiscPresent,
fChanged,
fRepeat : Boolean;
Begin;
TDlgWindow.DefWndProc (Msg);
KillTimer (hWindow,10);
fDiscPresent:=pICD^.IsPresent;
{ PRESENCE STATUS CHANGED ? }
Case (fDiscPresent) Of
TRUE : If (StrComp(szDiscLen,'00:00')=0) Then Begin;
StrCopy (szMaxTrack,pICD^.GetTrackCount);
StrCopy (szDiscLen,pICD^.GetDiscLength);
EnableSkipButtons (FALSE,FALSE);
EnableTrackButtons;
RedrawWindow (hWindow,NIL,0,RDW_INVALIDATE OR RDW_UPDATENOW OR RDW_ALLCHILDREN);
End;
FALSE : If (StrComp(szDiscLen,'00:00')<>0) Then Begin;
wProgram:=PRG_OFF;
StrCopy (szCurrTrck,'00');
StrCopy (szCurrTime,'00:00');
StrCopy (szCurrLen,'00:00');
StrCopy (szMaxTrack,'00');
StrCopy (szDiscLen,'00:00');
EnableSkipButtons (FALSE,FALSE);
EnableTrackButtons;
RedrawWindow (hWindow,NIL,0,RDW_INVALIDATE OR RDW_UPDATENOW OR RDW_ALLCHILDREN);
End;
End;
{ PRESENT & PLAYING ? }
If (fDiscPresent) Then If ((pICD^.IsPlaying) OR (fDiscReachedEnd)) Then Begin;
{ TIME CHANGED ? }
StrCopy (szPrevTime,szCurrTime);
StrCopy (szCurrTime,pICD^.GetCurrentTrackTime);
If (StrComp(szCurrTime,szPrevTime)<>0) Then Update7Seg (IDB_CURR_TIME);
{ TRACK CHANGED }
fChanged:=HasTrackChanged OR fDiscReachedEnd;
fRepeat:=IsDlgButtonChecked(hWindow,IDCB_REPEAT)=BF_CHECKED;
{ PLAY MODE - TRACK CHANGED }
If (wProgram=PRG_OFF) AND (fDiscReachedEnd) AND (fRepeat) Then Begin;
Stop;
pICD^.Play('01');
HasTrackChanged;
End;
{ PROGRAM MODE - GET NEXT ITEM IF TRACK HAS CHANGED }
If (wProgram<>PRG_OFF) AND (fChanged) Then Begin;
If (wProgram=PRG_NEXT) Then Begin;
StrCopy(buf,GetProgramTrack (iPrgItem,TRK_NEXT));
If (StrLen(buf)<>0) Then pICD^.Play(buf)
Else Begin; Stop; If (fRepeat) Then StartProgram; End;
End;
If (wProgram=PRG_FIRST) Then wProgram:=PRG_NEXT;
HasTrackChanged; UpdateItemColors;
End;
fDiscReachedEnd:=FALSE;
End;
{ RE-ENABLE TIMER }
SetTimer (hWindow,10,ST_TIMER,NIL);
End;
Procedure TDlgCD.SetupWindow;
Begin;
wProgram:=PRG_OFF;
TDlgWindow.SetupWindow;
hMainWindow:=hWindow;
{ UPDATE SYSTEM-MENU }
hSysMenu:=GetSystemMenu(hWindow,FALSE);
AppendMenu (hSysMenu,MF_SEPARATOR,0,NIL);
AppendMenu (hSysMenu,MF_STRING,IDM_HELP,'&Hilfe...');
AppendMenu (hSysMenu,MF_STRING,IDM_ABOUT,'&▄ber CD Player...');
AppendMenu (hSysMenu,MF_SEPARATOR,0,NIL);
AppendMenu (hSysMenu,MF_STRING,IDM_ONTOP,'Immer im &Vordergrund');
{ CREATE DISC-OBJECT }
pICD:=New(PCompactDisc,Init(hWindow));
pICD^.SetFailProc (FailProc);
fDiscReachedEnd:=FALSE;
StrCopy (szCurrTrck,'00');
StrCopy (szPrevTrck,'00');
StrCopy (szCurrTime,'00:00');
StrCopy (szCurrLen,'00:00');
StrCopy (szMaxTrack,'00');
StrCopy (szDiscLen,'00:00');
EnableTrackButtons;
EnableSkipButtons (FALSE,FALSE);
UpdateItemColors;
CheckDlgButton (hWindow,IDCB_PROGRAM,BF_UNCHECKED);
CheckDlgButton (hWindow,IDCB_REPEAT,BF_UNCHECKED);
SetTimer (hWindow,10,ST_TIMER,NIL);
End;
Destructor TDlgCD.Done;
Begin;
KillTimer (hWindow,10);
WinHelp (hWindow,'CDPLAYER.HLP',HELP_QUIT,0);
piCD^.Stop;
pICD^.Eject;
Dispose (pICD,Done);
TDlgWindow.Done;
End;
{ PROGRAM }
Function TDlgCD.GetProgramTrack (VAR iID:Integer; iDir:Integer):pChar;
Var buf:TCharArray;
fOut:Boolean;
Begin;
StrCopy (buf,'');
Repeat;
iID:=iID+iDir;
fOut:=(iID<IDSTC_ITEM01) OR (iID>IDSTC_ITEM24);
If (NOT fOut) Then GetDlgItemText (hWindow,iID,buf,sizeof(buf)-1);
Until (fOut) OR (StrLen(buf)<>0);
If (fOut) Then iID:=IDSTC_ITEM01;
UpdateItemColors;
GetProgramTrack:=buf;
End;
Procedure TDlgCD.ClearProgramItems;
Var iID:Word;
Begin;
For iID:=IDSTC_ITEM01 To IDSTC_ITEM24 Do SetDlgItemText (hWindow,iID,'');
End;
Procedure TDlgCD.BtnWipe (VAR Msg:TMessage);
Begin;
ClearProgramItems;
End;
Procedure TDlgCD.BtnBack (VAR Msg:TMessage);
Var buf:TCharArray;
iID:Integer;
Begin;
{ DEN LETZTEN BELEGTEN PROGRAMMPLATZ FINDEN & L╓SCHEN }
iID:=(IDSTC_ITEM24+1);
StrCopy (buf,GetProgramTrack(iID,TRK_PREV));
If (StrLen(buf)<>0) Then SetDlgItemText (hWindow,iID,'');
End;
Procedure TDlgCD.StartProgram;
Var buf:TCharArray;
Begin;
{ FANGE MIT DEM ERSTEN PROGRAMMPLATZ AN }
iPrgItem:=(IDSTC_ITEM01-1);
StrCopy (buf,GetProgramTrack (iPrgItem,TRK_NEXT));
If (StrLen(buf)>0) Then Begin;
{ CD PRESENT ? }
If (NOT pICD^.IsPresent) Then Begin;
MsgBox ('Es befindet sich keine CD im Laufwerk.'); EXIT;
End;
{ PLAY PROGRAM }
wProgram:=PRG_FIRST;
pICD^.Play(buf);
EnableSkipButtons (TRUE,TRUE);
End Else MsgBox ('Der Programmspeicher ist leer.');
End;
Procedure TDlgCD.BtnPlay (VAR Msg:TMessage);
Begin;
StartProgram;
End;
{ SYSTEM MENU EXTANSIONS }
Procedure TDlgCD.WMSysCommand (VAR Msg:TMessage);
Begin;
TDlgWindow.DefWndProc (Msg);
Case (Msg.wParam) Of
IDM_HELP : MnuHelp;
IDM_ABOUT : MnuAbout;
IDM_ONTOP : MnuOnTop;
End;
End;
Procedure TDlgCD.MnuHelp;
Begin;
WinHelp (hWindow,'CDPLAYER.HLP',HELP_CONTENTS,0);
End;
Procedure TDlgCD.MnuAbout;
Var DlgAbout : TDlgAbout;
Begin;
DlgAbout.Init (@Self,'ABOUT');
DlgAbout.Execute;
DlgAbout.Done;
End;
Procedure TDlgCD.MnuOnTop;
Var fChecked:Boolean;
Begin;
fChecked:=(GetMenuState(hSysMenu,IDM_ONTOP,MF_BYCOMMAND) AND MF_CHECKED)=MF_CHECKED;
Case (fChecked) Of
TRUE : Begin;
CheckMenuItem (hSysMenu,IDM_ONTOP,MF_BYCOMMAND OR MF_UNCHECKED);
SetWindowPos (hWindow,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE OR SWP_NOSIZE);
End;
FALSE : Begin;
CheckMenuItem (hSysMenu,IDM_ONTOP,MF_BYCOMMAND OR MF_CHECKED);
SetWindowPos (hWindow,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE OR SWP_NOSIZE);
End;
End;
End;
END.