Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
21-34_ПР-ИЕ.doc
Скачиваний:
13
Добавлен:
28.08.2019
Размер:
328.19 Кб
Скачать

Специализация и создание объектов

Специализацией шаблона называется код шаблона с подставленными компилятором параметрами, то есть если в программе будет:

SomeClass <20, int> SomeVariable1;

SomeClass <30, double> SomeVariable2;

SomeClass <20, int> SomeVariable3;

значит создано две специализации шаблона (по одной для набора параметров <20, int> и <30, double>) и создано два объекта класса SomeClass <20, int> и один объект класса SomeClass <30, double>.

Примеры

// Описание шаблонной функции

template <typename T> T max(T x, T y)

{

if (x < y)

return y;

else

return x;

}

...

// Применение шаблонной функции

int a = max(10,15);

...

double f = max(123.11, 123.12);

...

//нахождение минимума

template< typename T >

T min( T a, T b )

{

return a < b ? a : b;

}

main()

{

min<int>( 1, 2 );

min<char>( 'a', 'b' );

min<string>( string( "abc" ), string( "cde" ) );

}

//шаблон массива int’ов, параметр – размер массива

template< int size >

class IntegerArray

{

int Array[ size ];

/* ... */

};

main()

{

IntegerArray<20> ia;

IntegerArray<30> ib;

}

34. Общие сведения о GUI-приложениях Win32. API-функции. Интерфейсы программирования приложений. Окно приложения, элементы управления. Главная функция GUI-приложения. Оконные сообщения. Цикл обработки сообщений. Оконная процедура.

GUI-приложения (Graphical User Interface) – программы Win32 основанные на графическом интерфейсе. Обычно приложение будет представлять из себя одно окно (или набор окон), здесь располагаются все функциональные элементы окна (кнопки, поля ввода, меню и т.п.).

Для реализации GUI в конкретном приложении можно применять интерфейс программирования приложений (Application Programming Interface - API). Под API понимается набор внешних функций (API-функции). При их использовании программист затрагивает только идеологии процедурного и модульного программирования (не использует объектного программирования).В качестве альтернативы API предлагаются и другие интерфейсы программирования основанные на идеологии объектного программирования (с использованием классов), например MFC, ATL, BCL.

Окно приложения Windows обычно состоит из заголовка окна (значок, название, системные кнопки) и клиентской области, в которой располагаются все элементы, касающиеся работы с программой.

Любое GUI-приложение должно содержать главную функцию WinMain – Именно она вызывается при запуске приложения. Протоип:

int WinMain(HINSTANCE, //манипулятор текущего экземпляра приложения

HINSTANCE, //манипулятор предыдущего экземпляра приложения (остался для обратной совместимости)

LPSTR, //строка с содержанием командной строки приложения

int); //режим отображения окна

для последнего параметра используются значения: SW_SHOWNORMAL, SW_MINIMIZED, SW_MAXIMIZED.

В теле этой функции обычно создаётся и отображается окно приложения,

CHAR lsWClName[] = "Класс окна на основе API ";

CHAR lsWName[] = "OOP3 задание 1 ";

WNDCLASSA wcl;//создание класса окна

wcl.style = CS_HREDRAW | CS_VREDRAW;

wcl.lpfnWndProc = WindProced_My;

wcl.cbClsExtra = 0;

wcl.cbWndExtra = 0;

wcl.hInstance = hInst;

wcl.hIcon = LoadIcon(0,IDI_APPLICATION);

wcl.hCursor = LoadCursor(0,IDC_ARROW);

wcl.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);

wcl.lpszMenuName = NULL;

wcl.lpszClassName = lsWClName;

if (!RegisterClassA(&wcl)) //регистрация класса окна

return -1;

HWND hW; //создание окна

hW = CreateWindowA(lsWClName, lsWName, WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

HWND_DESKTOP, NULL, hInst, NULL);

ShowWindow(hW, nShowCmd);//показ окна

и запучкается цикл обработки сообщений, например так:

MSG msg;

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

while (GetMessage(&msg,NULL,0,0))

DispatchMessage(&msg);

Нужно добавить, что работа приложений в среде Windows базируется на механизме отправки и получения сообщений. Оконное сообщение – это данные отправляемые системой в качестве реакции на какое либо событие (нажатие клавиши, закрытие окна и т.п.). Сообщение имеет тип UINT и вместе с собой несёт ещё два значения: WPARAM (UINT) и LPARAM (long int), через которые передаётся специальная информация, касающаяся события. Например, какая именно кнопка нажата, в событии нажатия кнопки клавиатуры.

Для обработки сообщений используется функция, называемая оконной процедурой. Её имя должно быть указано при создании окна. Эта функция не вызывается программистом, её всегда вызывает ОС (для этого указывается слово CALLBACK). Пример:

LRESULT CALLBACK WindProced_My(HWND hW, UINT uMsg, WPARAM wPar, LPARAM lPar)

{//оконная процедура

switch (uMsg)

{

case WM_DESTROY:/*уничтожение*/

PostQuitMessage(0);

break;

case WM_LBUTTONDOWN:/*левлапа*/

UINT xl,yl;

xl = LOWORD(lPar);

yl = HIWORD(lPar);

CHAR Messagel[20];

sprintf_s(Messagel, "левлапа: %d , %d", xl, yl);

MessageBoxA(hW, Messagel, "Нажата мыШ", MB_OK | MB_ICONASTERISK);

break;

case WM_RBUTTONDOWN:/*правлапа*/

UINT xr,yr;

xr = LOWORD(lPar);

yr = HIWORD(lPar);

CHAR Messager[20];

sprintf_s(Messager, "правлапа: %d , %d", xr, yr);

MessageBoxA(hW, Messager, "Нажата мыШ", MB_OK | MB_ICONASTERISK);

break;

case WM_MBUTTONDOWN:/*средлапа*/

UINT xm,ym;

xm = LOWORD(lPar);

ym = HIWORD(lPar);

CHAR Messagem[20];

sprintf_s(Messagem, "средлапа: %d , %d", xm, ym);

MessageBoxA(hW, Messagem, "Нажата мыШ", MB_OK | MB_ICONASTERISK);

break;

case WM_MOVING:/*кнопка клавы*/

MessageBoxA(hW, "А может не стоит", "Засёк движение", MB_OK | MB_ICONHAND);

break;

case WM_KEYDOWN:/*движение окна*/

MessageBoxA(hW, "Я знаю, ты ткнул на клаву", "Нажата КЛаВа", MB_OK | MB_ICONEXCLAMATION);

break;

case WM_CLOSE:/*завершение*/

if (MessageBoxA(hW, "А?", "Закрыть здесь всё?",

MB_YESNO | MB_ICONQUESTION) == IDYES)

DestroyWindow(hW);

break;

default: return DefWindowProc(hW, uMsg, wPar, lPar);

}

return 0;

}