#define STRICT
#include <windows.h>
#include <windowsx.h>
#include <commctrl.h>
#include "resource.h"
#include "afxres.h"
#include "cdplay.h"

HINSTANCE hInst;
char szAppName[]  = "CdPlayApp";
char szAppTitle[] = "CD Player";

UINT nTimerID;

UINT nCurTrack = 0;
UINT nTrackCnt = 0;

HWND hwndCurTrack;
HWND hProgressBar;
HWND hTrackBar;

// -----------------------------------------------------
// Функция WinMain
// -----------------------------------------------------
int APIENTRY 
WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
        LPSTR lpCmdLine, int nCmdShow)
{
  HWND hWnd;
  
  hInst = hInstance;

  // Преверяем, не было ли это приложение запущено ранее
  hWnd = FindWindow(szAppName, NULL);
  if(hWnd)
  {
    if(IsIconic(hWnd))
	  ShowWindow(hWnd, SW_RESTORE);
	SetForegroundWindow(hWnd);
    return FALSE;
  }

  // Инициализируем библиотеку стандартных органов управления
  InitCommonControls();

  // Отображаем диалоговую панель, которая служит
  // главным окном приложения
  DialogBox(hInstance, 
    MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);

  return FALSE;
}

// -----------------------------------------------------
// Функция DlgProc
// -----------------------------------------------------
BOOL APIENTRY
DlgProc(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
  switch(msg)
  {
    HANDLE_MSG(hdlg, WM_INITDIALOG, DlgProc_OnInitDialog);
    HANDLE_MSG(hdlg, WM_COMMAND,    DlgProc_OnCommand);
    HANDLE_MSG(hdlg, WM_HSCROLL,    DlgProc_OnHScroll);
    HANDLE_MSG(hdlg, WM_TIMER,      DlgProc_OnTimer);
	default:
      break;
  }
  return FALSE;
}

// -----------------------------------------------------
// Функция DlgProc_OnInitDialog
// -----------------------------------------------------
BOOL DlgProc_OnInitDialog(HWND hdlg, 
  HWND hwndFocus, LPARAM lParam)
{
  // Определяем идентификатор поля, которое используется
  // для отображения номера текущей дорожки
  hwndCurTrack = GetDlgItem(hdlg, IDT_CURTRACK);

  // Получаем идентификатор органа Progressbar
  hProgressBar = GetDlgItem(hdlg, IDC_PROGRESSBAR);
  
  // Устанавливаем диапазон изменения значений
  // и шаг для органа Progressbar
  SendMessage(hProgressBar, PBM_SETRANGE, 0, 
    MAKELPARAM(0, nTrackCnt));
  SendMessage(hProgressBar, PBM_SETSTEP, 1, 0);

  // Получаем идентификатор органа Trackbar
  hTrackBar = GetDlgItem(hdlg, IDC_TRACKBAR);
  
  // Устанавливаем диапазон изменения значений
  // для органа Trackbar
  SendMessage(hTrackBar, TBM_SETRANGE, TRUE, 
    MAKELPARAM(1, nTrackCnt));

  // Устанавливаем шаг изменений 
  SendMessage(hTrackBar, TBM_SETPAGESIZE, 0, 1);
  SendMessage(hTrackBar, TBM_SETLINESIZE, 0, 1);

  // Инициализируем устройство проигрывания
  // звуковых компакт-дисков
  CdInit();  

  // Создаем таймер для периодического определения
  // состояния устройства проигрывания
  nTimerID = SetTimer(hdlg, 1, 1000, NULL);

  // Открываем AVI-файл с видеоклипом (вращающийся
  // компакт-диск)
  Animate_Open(GetDlgItem(hdlg, IDC_ANIMATE), "CD.AVI");

  return TRUE;
}

// -----------------------------------------------------
// Функция DlgProc_OnCommand
// -----------------------------------------------------
#pragma warning(disable: 4098)
void DlgProc_OnCommand(HWND hdlg, int id, 
  HWND hwndCtl, UINT codeNotify)
{
  switch (id)
  {
	case IDCANCEL:
	case IDB_EXIT:
    {
      KillTimer(hdlg, nTimerID); // удаляем таймер

	  CdClose(); // закрываем устройство чтения компакт-диска

	  EndDialog(hdlg, TRUE); // завершаем работу приложения
	  break;
    }
	  
	// Выполнение команд проигрывания, останова,
    // паузы, возобновления проигрывания после паузы и т. д.
	case IDB_PLAY:
      CdPlay(hdlg, 1);  break;
	case IDB_STOP:
      CdStop();         break;
	case IDB_PAUSE:
      CdPause();        break;
	case IDB_RESUME:
      CdResume(hdlg);   break;
	case IDB_NEXT:
      CdPlayNext(hdlg); break;
	case IDB_PREV:
      CdPlayPrev(hdlg); break;
	case IDB_EJECT: 
	  CdEject();        break;

  	default:
      return FALSE;
  }
  return TRUE;
}

// -----------------------------------------------------
// Функция DlgProc_OnTimer
// -----------------------------------------------------
void DlgProc_OnTimer(HWND hwnd, UINT id)
{
  BYTE szBuf[20];

  // Если окно свернуто в пиктограмму, ничего не делаем,
  // чтобы не снижать производительность системы
  if(IsIconic(hwnd))
    return;

  // Если состояние устройства проигрывания изменилось,
  // отображаем изменения в диалоговой панели
  if(CdUpdateState(hwnd))
  {
    // Отображаем номер текущей дорожки
    if(nCurTrack != 0)
    {
      itoa(nCurTrack, szBuf, 10);
      SetWindowText(hwndCurTrack, szBuf);
    }
    else
      SetWindowText(hwndCurTrack, "");

    // Изменяем положение движка Trackbar
    SendMessage(hTrackBar, TBM_SETPOS, TRUE, nCurTrack);

    // Изменяем диапазон значений и положение 
    // движка Progressbar
    SendMessage(hProgressBar, PBM_SETRANGE, 0, 
      MAKELPARAM(0, nTrackCnt));
    SendMessage(hProgressBar, PBM_SETPOS, nCurTrack, 0);
  }
}

// -----------------------------------------------------
// Функция DlgProc_OnHScroll
// -----------------------------------------------------
void DlgProc_OnHScroll(HWND hdlg, HWND hwndCtl, 
  UINT code, int pos)
{
  switch(code)
  {
    // Отрабатываем команды, поступающие от органа
    // управления Trackbar
    case TB_LINEDOWN:
    case TB_PAGEDOWN:
      CdPlayNext(hdlg);         break;
    
    case TB_LINEUP:
    case TB_PAGEUP:
      CdPlayPrev(hdlg);         break;

    case TB_BOTTOM:
      CdPlay(hdlg, nTrackCnt);  break;

    case TB_TOP:
      CdPlay(hdlg, 1);          break;

    case TB_THUMBPOSITION:
      CdPlay(hdlg, pos);        break;
    default:
      break;
  }
}
