программа Метроном
Есть программа такая-Метроном
мне по нему нужно сделать аж 6 заданий...но я не понимаю ни черта(((
помогите пожалуйста разобраться...
вот такст программы
Код:
program timer;
uses
windows,
messages,
sysUtils; //Служебные функции Дельфи для форматирования строк и т.д.
var
//Глобальные переменные; используются для хранения значений,
// не изменяющихся между вызовами процедур
xOffset:integer;
yOffset:integer;
bkmode:integer;
timeinterval:integer;
timechange:integer;
function WndProc (hWnd: THandle; Msg: integer; wParam: longint; lParam: longint): longint; stdcall; forward;
procedure WinMain; //Основной цикл обработки сообщений
const szClassName='Shablon';
var
wndClass:TWndClassEx; //имя, под которым класс зарегистрирован в системе
hWnd: THandle; //хэндл окна
msg:TMsg;
begin
wndClass.cbSize:=sizeof(wndClass);
wndClass.style:=cs_hredraw or cs_vredraw;
wndClass.lpfnWndProc:=@WndProc;
wndClass.cbClsExtra:=0;
wndClass.cbWndExtra:=0;
//wndClass.hInstance:=hPrevInst; [Warning] Symbol 'HPrevInst' is deprecated
wndClass.hInstance:=hInstance;
wndClass.hIcon:=loadIcon(0, idi_Application);
wndClass.hCursor:=loadCursor(0, idc_Arrow);
wndClass.hbrBackground:=GetStockObject(white_Brush);
wndClass.lpszMenuName:=nil;
wndClass.lpszClassName:=szClassName;
wndClass.hIconSm:=loadIcon(0, idi_Application);
RegisterClassEx(wndClass);
hwnd:=CreateWindowEx(
0,
szClassName, //имя класса окна
'Программа-таймер', //заголовок окна
ws_overlappedWindow, //стиль окна
10, //Left
10, //Top
500, //Width
200, //Height
0, //хэндл родительского окна
0, //хэндл оконного меню
hInstance, //хэндл экземпляра приложения
nil); //параметры создания окна
ShowWindow(hwnd,sw_Show); //отобразить окно
updateWindow(hwnd); //послать wm_paint оконной процедуре, минуя очередь сообщений
while GetMessage(msg,0,0,0) do
begin //получить очередное сообщение
TranslateMessage(msg); //Windows транслирует сообщения от клавиатуры
DispatchMessage(msg); //Windows вызовет оконную процедуру
end; //выход по wm_quit, на которое GetMessage вернет FALSE
end; // WinMain
function WndProc (hWnd: THandle; Msg: integer; wParam: longint; lParam: longint): longint; stdcall;
var
ps:TPaintStruct;
hdc:THandle;
rect:TRect;
s:shortstring; //Строка как в Турбо-Паскале
keystate:short;
begin
result:=0;
//keystate:=0; [Hint]: Value assigned to 'keystate' never used.
case Msg of
wm_create:
begin
SetTimer(hwnd,0,1000,nil); // Таймер ~1 с, посылает WM_TIMER
end;
wm_timer:
begin
bkmode:=bkmode*(-1);
invalidateRect(hwnd,nil,true);
end;
wm_paint:
begin
hdc:=BeginPaint(hwnd,ps); //Удалить WM_PAINT из очереди и начать рисование
GetClientRect(hwnd,rect);
if bkmode=1 then
SetBkMode(hdc,opaque)
else
SetBkMode(hdc,transparent);
SetBkColor(hdc,rgb(0,0,255));
s:='Таймер активен. Период работы: ';
TextOut(hdc,xOffset+5,yOffset+5,@s[1],length(s));
s:=inttostr(timeinterval)+' милисекунд';
TextOut(hdc,xOffset+5,yOffset+20,@s[1],length(s));
EndPaint (hwnd,ps);
end;
wm_keydown:
begin
case wParam of
vk_up:
begin
keystate:=getkeystate(vk_lControl);
if (keystate=-128) or (keystate=-127) then
timechange:=500
else
timechange:=100;
if timeinterval<3000 then
timeinterval:=timeinterval+timechange;
SetTimer(hwnd,0,timeinterval,nil);
end;
vk_down:
begin
keystate:=getkeystate(vk_lControl);
if (keystate=-128) or (keystate=-127) then
timechange:=500
else timechange:=100;
if timeinterval>500 then
timeinterval:=timeinterval-timechange;
SetTimer(hwnd,0,timeinterval,nil);
end;
vk_left:
dec(xOffset);
vk_right:
inc(xOffset);
vk_escape:
begin
xOffset:=0;
yOffset:=0;
end; // Вернуть по умолчанию
end; //case wparam
invalidaterect(hwnd,nil,true);
updateWindow(hwnd); //Перерисовать окно, не дожидаясь опустошения очереди
end; //wm_keydown
wm_destroy:
begin
killTimer(hwnd,0);
PostQuitMessage(0);
end;
else
result:=DefWindowProc(hwnd,msg,wparam,lparam);
end; //case Msg
end; //WndProc
begin
xOffset:=0; //Присвоение начальных значений глобальным переменным
yOffset:=1;
bkmode:=1;
timeinterval:=1000;
timechange:=100;
WinMain;
end.
Admin: Пользуемся тегами!
а вот задания:
Варианты индивидуальных заданий
1.1.Сделать из метронома таймер обратного отсчета: начиная с 10000 мс, значение таймера убавляется по 1000 мс до нуля. В конце выдается сообщение (для выдачи сообщения менять строку s; вызов процедуры TextOut не трогать).
1.2.Сделать разноцветный метроном: каждые 1000 мс цвет сообщения меняется на другой по заранее заданной циклической схеме (например, синий-зеленый-желтый-синий).
1.3.Добавить возможность перемещения надписи по вертикали (задействовав вертикальные стрелки не под изменение периода таймера, а под перемещение)
1.4.Создать измеритель скорости набора на клавиатуре. Для этого сосчитать все события wm_keydown, произошедшие за заданный интервал.
1.5.Добавить возможность перетаскивания надписи мышкой (события wm_lbuttondown (начало перетаскивания) и wm_lbuttonup(конец перетаскивания))
1.6.Сделать из метронома секундомер, начинающий отсчет по нажатию какой-либо клавиши и прекращающий его по нажатию той же клавиши. Точность измерения – 0.1 сек.
очень прошу пожалуйста помогите!!!
|