- •Министерство образования и науки Российской Федерации
- •1. Добавление меню
- •2. Добавление кнопок и редакторов
- •2.1. Создание кнопок и редакторов и обработка их сообщений
- •2.2. Помещение и получение текста из редактора (поля ввода)
- •3. Работа с таймером
- •4. Порядок выполнения работы
- •5.Контрольные вопросы
- •Приложение Файл rctm.Cpp
- •Файл rctm.Rc
- •Файл resource.H
5.Контрольные вопросы
Какие API функции используются для создания кнопок и редакторов?
Как добавить меню? Как добавить в меню пункт меню?
Как запустить и остановить таймер? Какие функции для этого используются?
Какое сообщение посылается окну от таймера? Где и как обрабатываются сообщения от таймеров?
Для чего необходим файл ресурсов? Что содержит файл ресурсов? Объяснить назначение в проекте файла resource.h
Каким образом обрабатываются сообщения от кнопок и пунктов меню? Какое сообщение для этого используется?
Какие сообщения и функции используются для получения и помещения текста в редакторы (поля ввода)?
Приложение Файл rctm.Cpp
#include <windows.h>
#include "resource.h""
LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM);
/* дескриптор приложения */
HINSTANCE hInstance;
/* кнопка */
HWND BtHwnd;
/* редактор */
HWND EdtHwnd;
char szWinName[] ="MyWin"; /* имя класса окна */
/* главная функция */
int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst,
LPSTR lpszArgs, int nWinMode )
{
HWND hwnd;
MSG msg;
WNDCLASSEX wcl;
/* определение класса окна */
wcl.hInstance=hThisInst; /* дескриптор данного экземпляра */
wcl.lpszClassName=szWinName; /* имя класса окна */
wcl.lpfnWndProc=WindowFunc; /* функция окна */
wcl.style=0; /* стиль по умолчанию */
wcl.cbSize = sizeof(WNDCLASSEX); /*размер структуры */
/* WNDCLASSEX */
wcl.hIcon = LoadIcon(NULL,IDI_APPLICATION);/* большая */
/* пикторграмма */
wcl.hIconSm = LoadIcon(NULL,IDI_WINLOGO); /* малая */
/* пиктограмма */
wcl.hCursor = LoadCursor(NULL,IDC_ARROW); /* форма курсора */
wcl.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1); /* меню не используется */
wcl.cbClsExtra = 0; /* дополнительная информация отсутствует */
wcl.cbWndExtra = 0;
/* фон окна задается белым */
wcl.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
/* регистрация класса окна */
if(!RegisterClassEx(&wcl)) return 0;
/* Создание окна */
hwnd = CreateWindow (
szWinName, /* имя класса окна */
"Menu & Timer & Edit & Button", /* заголовок */
WS_OVERLAPPEDWINDOW, /* стандартное окно */
CW_USEDEFAULT, /* координата Х - определяется Windows */
CW_USEDEFAULT, /* координата Y - определяется Windows */
CW_USEDEFAULT, /* ширина - определяется Windows */
CW_USEDEFAULT, /* высота - определяется Windows */
HWND_DESKTOP, /* родительского окна нет */
NULL, /* меню уже описано в классе */
hThisInst, /* дескриптор данного экземпляра приложения */
NULL /* дополнительных аргументов нет */
);
/* запоминаем дескриптор приложения для создания дочерних элементов управления */
hInstance = hThisInst;
/* отображение окна */
ShowWindow(hwnd,nWinMode);
UpdateWindow(hwnd);
/* цикл сообщений */
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg); /* разрешает
использование клавиатуры */
DispatchMessage(&msg); /* возвращает управление Windows */
}
return msg.wParam;
}
/* Эта функция вызывается Windows 95, которая передает ей */
/* сообщения из очереди сообщений */
LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
char msg[10];
int r;
/* обработка сообщений */
switch (message){
case WM_DESTROY: /* завершение программы */
PostQuitMessage(0);
break;
/* сообщение от пунктов меню и элементов управления */
case WM_COMMAND:
/* пункт меню - Start */
if(LOWORD(wParam)==IDM_START)
{
MessageBox(hwnd,"Timer started","Generation started",MB_OK);
/* установка таймера */
SetTimer(hwnd,1,1000,NULL);
}
/* пункт меню - Stop */
if(LOWORD(wParam)==IDM_STOP)
{
MessageBox(hwnd,"Timer stoped","Generation stopped",MB_OK);
/* завершение работы таймера */
KillTimer(hwnd,1);
}
/* от кнопки*/
if(HWND(lParam)==BtHwnd)
{
lstrcpy(msg,"0");
/* помещение текста в поле ввода */
SendMessage(EdtHwnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)msg);
}
break;
/* сообщение от таймера*/
case WM_TIMER:
int k;
r=rand()%20;
/* получение длины текста в поле ввода */
k=SendMessage(EdtHwnd,WM_GETTEXTLENGTH,0,0);
/* получение текста из поля ввода */
SendMessage(EdtHwnd,WM_GETTEXT,k+1,(LPARAM)msg);
/* перевод значения из строки в число и суммирование*/
r+=atoi(msg);
/* перевод из числа в строку*/
wsprintf(msg,"%d",r);
/* помещение текста в поле ввода */
SendMessage(EdtHwnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)msg);
break;
/* сообщение - создание окна */
case WM_CREATE:
/* создание кнопки */
BtHwnd = CreateWindow (
"BUTTON", /* имя класса окна */
"Reset", /* заголовок */
WS_CHILD|WS_VISIBLE|WS_BORDER, /* стиль */
5, /* координаты и размеры */
10,
50,
40,
hwnd, /* дескриптор родительского окна */
NULL, /* меню нет */
hInstance, /* дескриптор приложения*/
NULL
);
/* создание (поля ввода) редактора */
EdtHwnd = CreateWindow (
"EDIT", /* имя класса окна */
"0", /* заголовок */
WS_CHILD|WS_VISIBLE|WS_BORDER|WS_THICKFRAME/*стиль*/,
60, /* координаты и размеры */
10,
70,
70,
hwnd, /* дескриптор родительского окна */
NULL, /* меню нет*/
hInstance, /* дескриптор приложения */
NULL
);
default:
/* позволяет Windows обрабатывать любые сообщения
неуказанные в предыдущем случае */
return DefWindowProc(hwnd, message,wParam,lParam);
}
return 0;
}