![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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. просто объяснить) |