![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
![]() Есть программа такая-Метроном
мне по нему нужно сделать аж 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. а вот задания: Варианты индивидуальных заданий 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 сек. очень прошу пожалуйста помогите!!! Последний раз редактировалось Admin, 11.10.2010 в 22:55. |