//------------------------------------------------------------------
//    Файл:     fastfile.dpr
//    Описание: Пример загрузки данных из одного растрового файла
//------------------------------------------------------------------
program fastfile;

uses
  windows,
  messages,
  basedd7 in 'basedd7.pas';




//------------------------------------------------------------------
// типы, константы и глобальные переменные
//------------------------------------------------------------------
const
  SCREEN_WIDTH  = 640;
  SCREEN_HEIGHT = 480;
  FRAME_WIDTH   = 64;
  FRAME_HEIGHT  = 64;

var
  frame: DWORD;




//------------------------------------------------------------------
// оконная процедура
//------------------------------------------------------------------
function MsgProc( hWnd: HWND; msg: UINT; wParam: WPARAM; lParam: LPARAM ): LRESULT; stdcall;
begin
  case msg of
    WM_KEYDOWN:
      if wParam = VK_ESCAPE then
         SendMessage( hWnd, WM_DESTROY, 0, 0 );

    WM_TIMER:
      begin
        inc( frame );
        if frame > 9 then
           frame := 0;
      end;

    WM_DESTROY:
    begin
      PostQuitMessage( 0 );
      result := 0;
      exit;
    end;
  end;

  result := DefWindowProc( hWnd, msg, wParam, lParam );
end;




//------------------------------------------------------------------
// главная функция программы
//------------------------------------------------------------------
function WinMain( hInstance: HINST; hPrevInstance: HINST;
                  lpCmdLine: PCHAR; nCmdShow: integer ): integer; stdcall;
const
  CLASS_NAME = 'FASTFILE';
  WIN_NAME   = 'FASTFILE';

var
  wc:   WNDCLASSEX;
  hWnd: LONGWORD;
  msg:  TMSG;

  id_timer: DWORD;  // идентификатор таймера
  pos:      TPoint; // позиция указателя мыши
begin
  // заполняем поля класса будущего окна
  wc.cbSize        := sizeof( WNDCLASSEX );
  wc.style         := CS_CLASSDC;
  wc.lpfnWndProc   := @MsgProc;
  wc.cbClsExtra    := 0;
  wc.cbWndExtra    := 0;
  wc.hInstance     := hInstance;
  wc.hIcon         := 0;
  wc.hCursor       := LoadCursor( 0, IDC_ARROW );
  wc.hbrBackground := HBRUSH(GetStockObject( BLACK_BRUSH ));
  wc.lpszMenuName  := nil;
  wc.lpszClassName := CLASS_NAME;
  wc.hIconSm       := 0;

  // регистрируем класс и создаём окно
  RegisterClassEx( wc );
  hWnd := CreateWindowEx( WS_EX_TOPMOST, CLASS_NAME, WIN_NAME, WS_POPUP, 0, 0,
                          GetSystemMetrics( SM_CXSCREEN ),
                          GetSystemMetrics( SM_CYSCREEN ),
                          0, 0, wc.hInstance, nil );

  // производим инициализацию DirectDraw и загружаем данные
  if ( InitDirectDraw( hWnd, SCREEN_WIDTH, SCREEN_HEIGHT, 16 ) ) and
     ( LoadData() ) then
  begin
    ShowWindow( hWnd, SW_SHOWDEFAULT );
    UpdateWindow( hWnd );

    // прячем курсор
    ShowCursor( false );
    // устанавливаем таймер
    SetTimer( hWnd, id_timer, 110, nil );

    // организуем цикл выборки сообщений
    while msg.message <> WM_QUIT do
    if PeekMessage( msg, 0, 0, 0, PM_REMOVE ) then
    begin
      TranslateMessage( msg );
      DispatchMessage( msg );
    end
    else
    begin
      // получаем позицию курсора
      GetCursorPos( pos );

      if pos.x > SCREEN_WIDTH - FRAME_WIDTH then
         pos.x := SCREEN_WIDTH - FRAME_WIDTH;

      if pos.y > SCREEN_HEIGHT - FRAME_HEIGHT then
         pos.y := SCREEN_HEIGHT - FRAME_HEIGHT;

      // рисуем
      OnDraw( pos.x, pos.y, frame );
    end;
  end;

  // удаляем объекты программы
  KillTimer( hWnd, id_timer );
  ReleaseDirectDraw();
  UnregisterClass( CLASS_NAME, wc.hInstance );
end;




//------------------------------------------------------------------
// здесь программа получает управление
//------------------------------------------------------------------
begin
  WinMain( hInstance, hPrevInst, CmdLine, CmdShow );
end.
