Виртуальная школа начинающего программиста
10 апреля 2003
Рубрика: Технологии.
Автор: .
pic

В настоящее время существует большое количество языков программирования, каждый из которых разрабатывался под различные цели и имеет свои уникальные особенности. Современный программист имеет возможность выбрать именно тот инструмент, который лучше всего подходит для решения поставленной задачи. В нашей школе мы постараемся дать вам представление о возможностях этих разных языков, чтобы вы смогли понять, на какой из них стоит обратить внимание и серьезно изучить

Прежде всего мы познакомимся с возможностями популярного языка C++, который является одним из самых мощных и гибких языков программирования. На нем написана не только операционная система Windows, но и большинство приложений, созданных для этой системы. На этом уроке на простом примере мы попробуем показать, как с помощью языка C++ легко поддается управлению такая известная операционная система, как Windows. То есть решим элементарную задачу из разряда системного программирования.

pic

Урок 1: Поиграем в пинг-понг
с кнопкой «Пуск»

Всем пользователям персонального компьютера, конечно, знаком стандартный графический интерфейс известной операционной системы Microsoft Windows. Известно также, что основной кнопкой для доступа к установленным программам, созданным документам и настройкам системы является кнопка «Пуск» (или «Start»). Стандартно она всегда расположена в нижнем левом углу экрана и жестко связана с треем (информационной панелью).
А теперь давайте с помощью современного языка программирования C++ устроим настоящий «цирк на экране». Поставим себе цель: создать программу, заставляющую указанную кнопку «сорваться» со своего «насиженного» места и произвольно плыть по экрану до ближайшего края. Достигнув края экрана, кнопка должна отскочить от него, как мячик в пинг-понге, и двигаться к другому краю. И так пока пользователь не остановит этот процесс появившейся на экране кнопкой «Стоп».

pic

Условно программу можно разложить на несколько блоков.
Сначала идет заголовок программы. В нем обычно объявляются основные библиотеки функций и процедуры, которые будут использованы при работе программы, а также определяются исходные значения констант и переменных. Затем следует собственно тело программы (//точка входа в программу).

Следует отметить, что в языке C++ в полной мере реализована идеология так называемого объектно-ориентированного программирования. Она позволяет оперировать не байтами или числами, а объектами прикладной среды и работать с ними на языке, подобном языку обычных манипуляций. Поэтому, прежде всего, в тексте программы для окна создается собственный класс объекта.

pic

Кроме этого, объектно-ориентированный подход был использован для определения системных параметров самой кнопки «Пуск». Чтобы узнать ее системный идентификатор, предварительно была применена утилита SPY++ из состава среды разработки Visual Studio 6.0. Эта утилита позволяет с помощью указателя в виде прицела, удерживая левую кнопку мыши, навести на любой объект или окно на экране и сразу получить список его параметров — дескриптор. Из полученного в итоге дескриптора (описания) трея можно узнать и идентификатор содержащейся в нем кнопки «Пуск», который и записывается затем в программе как параметр функции FindWindowEx оператора поиска объекта для манипуляции hRunButton. После выбора объекта следует блок, описывающий процедуру управления объектом. В ней определяются очередные координаты перемещения кнопки по экрану с контролем достижения края экрана, а также обработка события, связанного с прерыванием работы программы по нажатию расположенной в центре экрана кнопки «Стоп» или комбинации клавиш Alt+F4. Полный текст программы приведен ниже.

Набирать текст программы можно в любом тестовом редакторе, но наиболее удобно это делать, используя специальную среду разработки со встроенным редактором, например популярную Visual Studio 6.0 от компании Microsoft.

После набора текста в среде Visual Studio следует осуществить процедуру тестирования работы программы, а затем компиляцию программного модуля (компиляцию можно сделать и в другой программной среде разработки, например, C++ Builder). В результате компиляции на диске создается исполняемый файл (например, назовите его start.exe).

pic

Затем вы можете запустить этот файл на любом компьютере и убедиться в том, что кнопка «Пуск» действительно «плавает». Причем это работает на всей «линейке» ОС Windows — от 95 до 2000.
В следующем номере вы сможете узнать о других возможностях этого популярного языка программирования.

P.S.: Благодарим за предоставленный пример учебный центр «NetDec».

Исходный текст программы

/*
Visual C++
Project: Win32 Application
*/
//стандартная библиотека функций и сообщений Windows
#include
//константная переменная таймера
const ID_TIMER1 = 1;
//дескрипторы окон
HWND hShell_TrayWnd ;
HWND hRunButton;
HWND hButton;
//структура прямоугольной области окна
RECT r , rB;
// переменные для хранения координат
int xCoor ;
int yCoor ;
// переменные для хранения приращения координат
int xDelta = 2 ;
int yDelta = -2 ;
//объявление оконной процедуры
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
//точка входа в программу
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
//создается класс Окна
WNDCLASS MyWindow;
//заполнение структуры класса Окна
MyWindow.style=CS_DBLCLKS ;
MyWindow.lpfnWndProc=(WNDPROC) WindowProc;
MyWindow.cbClsExtra=0;
MyWindow.cbWndExtra=0;
MyWindow.hInstance=hInstance;
MyWindow.hCursor=LoadCursor(NULL,IDC_ARROW);
MyWindow.hIcon=LoadIcon(NULL,IDI_WINLOGO);
MyWindow.hbrBackground=CreateSolidBrush(RGB(0,150,70));
MyWindow.lpszMenuName=NULL;
MyWindow.lpszClassName=»MyWindow»;
//Регистрация класса окна в ОС
RegisterClass(&MyWindow);
//Получение прямоугольной области рабочего стола
GetWindowRect(GetDesktopWindow(),&r);
//создание самого окна
HWND hwndMama = CreateWindowEx(WS_EX_TOOLWINDOW, «MyWindow», NULL, WS_POPUP, r.right/2-60, r.bottom/2 -15, 120, 30, NULL, NULL, hInstance, NULL);
//создание кнопки на вашем окне
hButton = CreateWindow(«BUTTON», «Стоп», WS_CHILD| BS_DEFPUSHBUTTON, 0, 0, 120, 30, hwndMama, NULL, hInstance, NULL);
//отображение окна и кнопки
ShowWindow(hwndMama, SW_SHOW);
ShowWindow(hButton, SW_SHOW);
//поиск объекта для манипуляции
hShell_TrayWnd = FindWindow(«Shell_TrayWnd»,»»);
hRunButton = FindWindowEx(hShell_TrayWnd, NULL, «Button»,»»);
SetWindowLong(hRunButton, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
//установка исходных координат объекта
xCoor = 2;
yCoor = r.bottom — 24;
//выделение объекта из нижней панели
SetParent(hRunButton, NULL);
//запуск таймера
SetTimer(hwndMama, ID_TIMER1,10, NULL);
MSG message;
//цикл обработки сообщений
while(GetMessage(&message,0,0,0 ))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
return message.wParam;
}
//оконная процедура
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch(uMsg)
{
//обработчик кнопки стоп
case WM_COMMAND:
if ((HWND) lParam == hButton && HIWORD(wParam) == BN_CLICKED)
{
//завершение таймера
KillTimer(hwnd, ID_TIMER1);
//возвращение к установке исходных значений
SetParent(hRunButton, hShell_TrayWnd);
PostMessage(hShell_TrayWnd, WM_SIZE, 0, 0);
//завершение программы
PostQuitMessage(0);
}
break;
//сообщение WM_TIMER
case WM_TIMER:
//изменение координат кнопки
xCoor += xDelta;
//проверка условия достижения края экрана
if ( (xCoor >= r.right-r.left-56) | | (xCoor <= 0)) xDelta *= -1; yCoor += yDelta; if ((yCoor >= r.bottom-r.top — 22) | | (yCoor <= 0)) yDelta *= -1; //выполнение перемещения кнопки SetWindowPos(hRunButton, HWND_TOPMOST, xCoor, yCoor, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW); break; //завершение программы Alt+F4 case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc( hwnd, uMsg, wParam, lParam); } return 0; }

Orphus system
Подписывайтесь на канал infoCOM.UZ в Telegram, чтобы первыми узнавать об ИКТ новостях Узбекистана
В Telegram
В WhatsApp
В Одноклассники
ВКонтакте