[ главная ]   [ рейтинг статей ]   [ справочник радиолюбителя ]   [ новости мира ИТ ]



Ответов: 0
25-02-12 07:01







   Web - программирование
PHP


ASP






XML



CSS

SSI





   Программирование под ОС











   Web - технологии








   Базы Данных









   Графика






Данные




Программирование под ОС / Pascal - Delphi /

Работа с таймером на Win API



Таймер - вещь в хозяйстве очень полезная. Если некое действие нужно повторять с определенной периодичностью, то таймер, это как раз то, что нужно. Если вдруг мы захотим приколоться над другом, то с помощью таймера можно сделать кучу прикольных вещей. Например: перемещать по рабочему столу иконки (или курсор мыши), выдвигать лоток сидюка, запускать программы (или вырубать их) и многое другое.

Но сегодня мы никому вредить не будем, а просто посмотрим, как же работать с таймером. По традиции начнем с переменных.


const
  IDTimer1 = 1;
  IDTimer2 = 2;
  IDLabelTime = 3;
  IDLabelDate = 4;
  IDLabelDayOfWeek = 5;
  LabelWidth = 70;

var
  Wc: TWndClassEx;
  Wnd: HWND;
  Msg: TMsg;
  LabelTime: HWND;
  LabelDate: HWND;
  LabelDayOfWeek: HWND;

  t: TSystemTime;

  sYear: string;
  sMonth: string;
  sDayOfWeek: string;
  sDay: string;
  sHour: string;
  sMinute: string;
  sSecond: string;
  sMilliseconds: string;

  FormWidth: Word = 300;
  LabelLeft: Word = 10;
  Direction: boolean = true;

В этот раз переменных много, мы рассмотрим их все по мере того, как будем разбираться в программе. Из констант видно, что у нас будет два таймера и три метки. Что мы будем с ними делать? Первый таймер будет получать информацию о дате и времени на компьютере, и выводить ее на три метки в следующем виде: первая метка - день недели, вторая метка - дата, третья метка - время. Второй таймер будет перемещать метки по форме в горизонтальном направлении, (метки будут как бы отскакивать от краев формы).

Чтобы создать таймер, нужно воспользоваться функцией SetTimer.


SetTimer( Wnd, IDTimer1, 10, nil );
SetTimer( Wnd, IDTimer2, 1, nil );

Рассмотрим параметры этой функции. Первый - идентификатор окна, которому будет принадлежать таймер. Второй - идентификатор самого таймера. Третий - интервал, через который таймер будет посылать окну, которому он принадлежит, сообщение WM_TIMER. Интервал задается в миллисекундах, из расчета, что в одной секунде тысяча миллисекунд. Четвертый - указатель на процедуру TimerProc (подробности смотри в хелпе).

При выходе из программы таймеры нужно уничтожить. Для этого надо воспользоваться функцией KillTimer. Ее два параметра аналогичны первым двум параметрам функции SetTimer.


while GetMessage( Msg, 0, 0, 0 ) do
begin
   TranslateMessage( Msg );
   DispatchMessage( Msg );
end;
KillTimer( Wnd, IDTimer1 );
KillTimer( Wnd, IDTimer2 );
Halt( Msg.wParam );

Для "взаимодействия" с таймером нужно обрабатывать сообщение WM_TIMER.


function WindowProc( Wnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM ): LRESULT; stdcall;
begin
   case Msg of
      WM_DESTROY: begin
         PostQuitMessage( 0 );
         Result := 0;
         Exit;
      end;
      WM_TIMER: begin
         case ( wParam ) of
            IDTimer1: begin
               if ( LabelLeft < 10 ) or ( LabelLeft + LabelWidth > FormWidth - 10 ) then
                  Direction := not Direction;
               if Direction then
                  Inc( LabelLeft )
               else
                  Dec( LabelLeft );
               SetWindowPos( LabelDayOfWeek, 0, LabelLeft, 10, LabelWidth, 20, 0 );
               SetWindowPos( LabelDate, 0, LabelLeft, 30, LabelWidth, 20, 0 );
               SetWindowPos( LabelTime, 0, LabelLeft, 50, LabelWidth, 20, 0 );
            end;
            IDTimer2: begin
               GetLocalTime( t );
               Str( t.wDay, sDay );
               if Length( sDay ) = 1 then
                  sDay := '0' + sDay;
               Str( t.wMonth, sMonth );
               if Length( sMonth ) = 1 then
                  sMonth := '0' + sMonth;
               Str( t.wYear, sYear );
               SetWindowText( LabelTime, PChar( sHour + ':' +
                  sMinute + ':' + sSecond + ':' + sMilliseconds ) );

               Str( t.wHour, sHour );
               if Length( sHour ) = 1 then
                  sHour := '0' + sHour;
               Str( t.wMinute, sMinute );
               if Length( sMinute ) = 1 then
                  sMinute := '0' + sMinute;
               Str( t.wSecond, sSecond );
               if Length( sSecond ) = 1 then
                  sSecond := '0' + sSecond;
               Str( t.wMilliseconds, sMilliseconds );
               SetWindowText( LabelDate, PChar( sDay + '.' +
                  sMonth + '.' + sYear ) );

               case t.wDayOfWeek of
                  0: sDayOfWeek := 'Воскресенье';
                  1: sDayOfWeek := 'Понедельник';
                  2: sDayOfWeek := 'Вторник';
                  3: sDayOfWeek := 'Среда';
                  4: sDayOfWeek := 'Четверг';
                  5: sDayOfWeek := 'Пятница';
                  6: sDayOfWeek := 'Суббота';
               end;
               SetWindowText( LabelDayOfWeek, PChar( sDayOfWeek ) );
            end;
         end;
      end;
      else
         Result := DefWindowProc( Wnd, Msg, wParam, lParam );
   end;
end;

Идентификатор таймера находится в параметре wParam сообщения WM_TIMER, здесь все просто. Посмотрим, что делает каждый таймер. Первый таймер отвечает за перемещение меток по форме. Направление перемещения зависит от значения переменной Direction и осуществляется функцией SetWindowPos. Второй таймер занимается тем, что получает текущую дату и время. Для этого нужно воспользоваться процедурой GetLocalTime, в качестве параметра ей нужно передать переменную типа TSystemTime, в которую будет помещен результат. Для того чтобы вывести полученные значения в метки, их (значения) нужно перевести из чисел в строки. В этом нам поможет процедура Str. У нее два параметра: что переводим и куда будет помещен результат. Чтобы изменить текст метки (или любого другого элемента или окна), используем процедуру SetWindowText. У нее два параметра: идентификатор окна (элемента окна), текст которого следует изменить, и сам текст.

И напоследок посмотрим, как создается форма в этом примере.


Wnd := CreateWindowEx( 0, WndClass, WndCaption, WS_OVERLAPPED or
                       WS_CAPTION or WS_SYSMENU or WS_MINIMIZEBOX,
                       10, 10, FormWidth, 100, 0, 0, hInstance, nil );

Раньше, в качестве флага мы указывали WS_OVERLAPPEDWINDOW, который включает в себя следующие флаги - WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX, WS_MAXIMIZEBOX. В этом примере мы выкинули два флага: WS_MAXIMIZEBOX (делает неактивной кнопку максимизации окна) и WS_THICKFRAME (или WS_SIZEBOX, что одно и то же. Без него мы не сможем изменять размеры формы мышкой). Это упрощение сделано для того, чтобы не производить дополнительные вычисления при изменении ширины формы, что необходимо для правильной работы первого таймера.

На сегодня это все, удачи в программировании.




Комментарии

 Ваш комментарий к данному материалу будет интересен нам и нашим читателям!



Последние статьи: Программирование под ОС / Pascal - Delphi /

Работа со шрифтами на Win API
06-06-2010   

Сегодня поговорим о шрифтах, и о том, каким образом работать с ними на Win API. Нам потребуется переменная типа HFONT. Изменить стиль шрифта можно у любого компонента, я покажу это на примере кнопки... подробнее

Кол. просмотров: общее - 3372 сегодня - 1

Работа с таймером на Win API
06-06-2010   

Таймер - вещь в хозяйстве очень полезная. Если некое действие нужно повторять с определенной периодичностью, то таймер, это как раз то, что нужно... подробнее

Кол. просмотров: общее - 3398 сегодня - 1

Работа с мультимедийным таймером на Win API
06-06-2010   

Мы уже знакомы с системным таймером, сегодня познакомимся с мультимедийным, основное отличие которого, более высокая скорость (точность) работы... подробнее

Кол. просмотров: общее - 3521 сегодня - 0

Создание CheckBoxов средствами Win API
06-06-2010   

Сегодня наша программа научится работать с CheckBoxами. CheckBox можно представить как флаг, который можно установить или сбросить, и в зависимости от его состояния выполнять определенные действия... подробнее

Кол. просмотров: общее - 3636 сегодня - 0

Создание группы RadioButton средствами Win API
06-06-2010   

В прошлый раз мы сделали несколько радио-кнопок, которые автоматически объединялись в одну группу. Сейчас рассмотрим, как создавать несколько независимых групп радио-кнопок... подробнее

Кол. просмотров: общее - 3449 сегодня - 0



  WWW.COMPROG.RU - 2009-2012 | Designed and Powered by Zaipov Renat | Projects