![]() |
|
|
Регистрация | << Правила форума >> | 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. |
#2
|
|||
|
|||
![]() Ну тут сделано все на WinAPI.
Вся суть в том, что здесь идет работа с сообщениями, а не с событиями. Соответствено, для реализации того, что тебе задали, тебе надо подправить соответсвующие обработчики. Например, для задачи 1.2 надо сделать следующее: 1. Завести переменную для хранения текущего цвета. 2. При старте программы инициализировать ее (в WinMain). 3. Изменить метод отрисовки так, что бы он использовал значение из этой переменной для установки цвета надписи (это в WndProc в обр. сообщения wm_paint) 4. Написать процку, которая будет менять цвет по заданной схеме (в той самой переменной). 5. Поставить вызов процки смены цвета в обработчике события от таймера (это в WndProc в обр. сообщения wm_timer). Все. это задание готово. 5 не очень больших правок. |
#3
|
||||
|
||||
![]() честно я чё то ни черта не поняла...мне нужно 2 4 и 5...
эх...текстик бы((( |
#4
|
|||
|
|||
![]() Для второй задачи я тебе написал что надо сделать.
Для всех остальных делается примерно так же. Ну для 5ой надо просто добавить обработку доп. сообщений. А за готовыми решениями тут принято ходить в другой раздел. В этом разделе могут решить только если задача интересная. |
#5
|
||||
|
||||
![]() тогда скажи куда мне пойти чтобы мне дали решение?)
спасибо за объяснение)))))))) а вот еще: 1.Выделить функции WinAPI, используемые в программе (проще всего – создав отдельный doc-файл с программой и сделав выделение шрифтом. Результат пойдет в отчет). 2.Изучить программу-метроном. Составить список обработчиков сообщений и используемых функций winapi с кратким описанием, какая функция чему соответствует. Для получения информации о функциях можно использовать Delphi Help и MS SDK Help. просто объяснить) |