Генерация сообщений таймера

Последним сообщением, которое мы обсудим в этой главе, будет WM_TIMER. В Windows-программах можно устанавливать таймер, который с данной периодич­ностью будет посылать программке сообщение WM_TIMER. Внедрение таймера является неплохим методом временами «будить» Вашу программку. Это может быть полезным в этом случае, если Ваша программка производится как Генерация сообщений таймера фоновое приложение.

Главные функции. Для установки таймера необходимо использовать функцию API SetTimer():

UINT SetTimer(HWND hwnd, UINT nID, UINT wLength,

TIMEPROC lpTFunc);

Параметр hwnd является дескриптором окна, которое собирается использовать таймер. Параметр nID – идентификатор устанавливаемого таймера (сразу могут употребляться несколько таймеров). Параметр wLength задает временной интервал для таймера в миллисекундах. Функция, указатель Генерация сообщений таймера на которую задается параметром lpTFunc, является процедурой, определенной в программке и вызываемой при об­работке прерываний таймера. Эта функция должна быть определена как VOID CALLBACK и имеет такие же характеристики, как и оконная функция. Но, если значение lpTFunc равно NULL, как это в большинстве случаев и бывает, для обработки Генерация сообщений таймера сообще­ний таймера будет вызываться оконная функция. В данном случае всякий раз по истечении данного временного интервала в очередь сообщений программки будет помещаться сообщение WM_TIMER, а оконная функция программки должна будет обрабатывать его так же, как и другие сообщения. Таковой подход употребляется в последующем примере. Функция SetTimer() в Генерация сообщений таймера случае удачного окончания возвращает значение nID, в неприятном случае ворачивается 0.

Будучи установлен, таймер будет посылать сообщения до того времени, пока программка не закончится либо не вызовет функцию API KillTimer():

BOOL KillTimer(HWND hwnd, UINT nID);

Тут hwnd является дескриптором окна, использующего таймер, а nID – идентификатором этого таймера Генерация сообщений таймера.

Всякий раз при поступлении сообщения WM_TIMER параметр wParam содер­жит идентификатор таймера, a lParam – адресок функции таймера (если он был задан при установке таймера). В последующем примере значение IParam будет NULL.

Дополнительные функции. Для программирования с внедрением таймера нам будет нужно особая структура типа tm, предоставляемая операционной системой

struct tm *newtime,

адресок Генерация сообщений таймера которой помещается в указатель newtime.

Не считая того, нужна переменная t типа time_t:

time_t t.

Функция time(NULL)позволяет получить новое время, которое имеет тип time_t:

t = time(NULL).

Новое время можно поместить в структуру типа tm (в соответственное её поле), адресок которой помещен в указатель Генерация сообщений таймера newtime, при помощи функции localtime :

newtime=localtime(&t).

Единственным аргументом функции localtime является адресок переменной t типа time_t.

Из структуры типа tm время можно поместить в буфер вывода, используя функции strcpy и asctime:

strcpy(str,asctime(newtime)).


Следует учитывать, что в конце этой инфы Windows расположит Генерация сообщений таймера знаки «возврат каретки» \r и «новая строка» \n . Эти знаки лучше удалить, поставив в конце инфы обыденный знак «конец строки»:

str[strlen(str)-1] = '\0' .

Пример 3-5. Приведенная ниже программка употребляет таймер для сотворения часов. Для полу­чения текущей даты и времени она вызывает стандартные функции «C» либо «C++». Всякий раз при получении Генерация сообщений таймера сообщения таймера – приблизительно раз за секунду – изображение, отображающее время, обновляется. Таким макаром, время указывается с точностью до одной секунды.

// Программа-часы

#include

#include

#include

#include

LRESULT CALLBACK WindowFunc(HWND, UINT,

WPARAM, LPARAM);

char szWinName[]="МоеОкно"; // Имя класса окна

char str[80]=""; // Буфер для строчки вывода

int X=1, Y=1; // Координаты строчки на дисплее

int Генерация сообщений таймера WINAPI WinMain(HINSTANCE hThisInst,

HINSTANCE hPrevInst,

LPSTR lpszArgs,

int nWinMode)

{

HWND hwnd;

MSG msg;

WNDCLASS wcl; // Найти класс окна

wcl.hInstance=hThisInst; // Дескриптор приложения

wcl.lpszClassName=szWinName; // Имя класса окна

wcl.lpfnWndProc=WindowFunc; // Функция окна

wcl.style=0; // Стиль по дефлоту

wcl.hIcon=LoadIcon(NULL,IDI_APPLICATION);// Иконка

wcl.hCursor=LoadCursor(NULL,IDC_ARROW); // Курсор

wcl.lpszMenuName=NULL; // Без меню

wcl Генерация сообщений таймера.cbClsExtra=0; // Без дополнительной инфы

wcl.cbWndExtra=0;

wcl.hbrBackground=

(HBRUSH)GetStockObject(WHITE_BRUSH); //Белоснежный фон

if(!RegisterClass(&wcl)) // Регистрируем класс окна

return 0;

hwnd=CreateWindow(szWinName, // Сделать окно

"Программа-часы",

WS_OVERLAPPEDWINDOW, // Стиль окна

CW_USEDEFAULT, // x-координата

CW_USEDEFAULT, // y-координата

CW_USEDEFAULT, // Ширина

CW_USEDEFAULT, // Высота

HWND_DESKTOP, // Нет родител. окна

NULL, // Нет меню

hThisInst,// Дескриптор приложения

NULL); // Нет дополнит Генерация сообщений таймера. аргументов

ShowWindow (hwnd, nWinMode); // Показать окно

SetTimer(hwnd,1,1000,NULL); // Устан. таймер 1 сек.

UpdateWindow(hwnd); // Перерисовать содержимое

while(GetMessage(&msg,NULL,0,0)) // Запустить цикл

{ // обработки сообщений

TranslateMessage(&msg); //Разреш. исп-е клавиатуры

DispatchMessage (&msg); // Возвратить управл. Windows

}

KillTimer(hwnd,1); // Высвободить таймер

return msg.wParam;

}

// Последующая функция вызывается операционной

// системой Windows и получает в качестве

// характеристик сообщения из очереди сообщений

// данного приложения

LRESULT CALLBACK Генерация сообщений таймера WindowFunc(HWND hwnd,

UINT message,

WPARAM wParam,

LPARAM lParam)

{

HDC hdc;

PAINTSTRUCT paintstruct;

struct tm *newtime;

time_t t;

switch(message)

{

case WM_PAINT: // Перерисовка рабочей области

hdc=BeginPaint(hwnd,&paintstruct);// Получить DC

TextOut(hdc,X,Y,str,strlen(str));//Вывести буфер

EndPaint(hwnd, &paintstruct); // Высвободить DC

break;

case WM_TIMER: // Очередной Генерация сообщений таймера временной интервал

t = time(NULL); // Получить новое время

newtime=localtime(&t); // Новое время - в буфер

strcpy(str,asctime(newtime));

str[strlen(str)-1] = '\0'; // Удалить \r\n

InvalidateRect(hwnd,NULL,1); // Перерисов. экран

break;

case WM_DESTROY: // Окончание программки

PostQuitMessage(0);

break;

default:

// Все сообщения, не обрабатываемые в

// данной функции, направляются на обработку

// по дефлоту

return DefWindowProc(hwnd,message,

wParam,lParam);

}

return 0;

}

Пример Генерация сообщений таймера вывода этой программки показан на рис. 3.3.

Глава 4. Ресурсы и меню

Вы уже знакомы со структурой программ для Windows, которые принимают и обрабатывают сообщения. Пришло время разобраться с компонентами пользовательского интерфейса Windows. Если Вы только начали учить программирование под Windows, принципиально уяснить, что в большинстве случаев Ваши приложения будут вести Генерация сообщений таймера взаимодействие с юзером, используя одну либо более предопределенных компонент интерфейса.

В Windows имеется разные элементы интерфейса. В данной главе дискуссируются два из их: окна сообщений и меню. Это более принципиальные составляющие интерфейса Windows. Фактически все написанные Вами программки будут их использовать. В Windows предопределены главные стили окон сообщений и меню, – нужно Генерация сообщений таймера только заполнить их соответственной информацией.

В данной главе вводится также понятие ресурсов, которые являются принципиальной частью практически всех Windows-приложений.


generirovanie-elektricheskoj-energii.html
genetic-characteristics-of-red-gorbatov-and-suksun-cattle-breeds-using-microsatellite-markers.html
geneticheskaya-istoriya-chelovechestva-statya.html