Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.10.2010, 22:50
Аватар для Lory
Lory Lory вне форума
Прохожий
 
Регистрация: 23.05.2010
Адрес: Москва
Сообщения: 29
Репутация: 10
Вопрос программа Метроном

Есть программа такая-Метроном
мне по нему нужно сделать аж 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 сек.

очень прошу пожалуйста помогите!!!

Последний раз редактировалось Admin, 11.10.2010 в 22:55.
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:48.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025