Основи WinAPI (Windows Application Programm Interface)

Загальні теоретичні відомості та одержання початкових навичок роботи з WinAPI (Windows Application Programm Interface). Сутність, характеристика та значення функції WinMain, API GetMessage, MainRegister. Приклади завдань для вирішення з даної теми.

Рубрика Программирование, компьютеры и кибернетика
Вид контрольная работа
Язык украинский
Дата добавления 29.06.2010
Размер файла 35,1 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Контрольна робота

З предмету «Системне програмування»

Назва:Основи WinAPI (Windows Application Programm Interface)

Мета: одержання початкових навичок роботи з WinAPI (Windows Application Programm Interface).

Теоретичні відомості:

Перш, ніж приступити до програмування для Windows, необхідно зрозуміти, як виконується представлена тут найпростіша програма. Зверніть увагу: це - Win32-програма. Вона буде виконуватися під керуванням Windows NT.

Спочатку Ви повинні визначити класи вікон, що будуть відображатися вашим додатком. У даному випадку ми відобразимо тільки одне вікно (WinClass), але проте, ми повинні дати Windows деяку мінімальну інформацію щодо його класу. Найбільш важлива частина WinClass - адреса процедури зворотного виклику, чи віконної процедури (WindowProcedure). Windows, відповідно до внутрішньої організації, викликає нас - він посилає повідомлення нашій програмі, викликаючи віконну процедуру.

Зверніть увагу на оголошення віконної процедури. Windows буде викликати її, передаючи дескриптор поточного вікна і два елементи даних, зв'язаних з повідомленням (параметри повідомлення): WPARAM і LPARAM.

У WinClass ми також повинні визначити дескриптор екземпляра програми HINSTANCE, курсор миші (ми лише завантажуємо стандартний курсор - стрілочку), щітку, щоб зафарбувати тло вікна (ми вибрали заданий за замовчуванням колір вікна) і ім'я нашого класу.

Після заповнення всіх полів структури WNDCLASS ми реєструємо клас вікна в Windows.

#include <windows.h>

LRESULT CALLBACK WindowProcedure

(HWND hwnd, unsigned int message, WPARAM wParam, LPARAM lParam);

class WinClass

{

public:

WinClass (WNDPROC winProc, char const * className, HINSTANCE hInst);

void Register ()

{

::RegisterClass (&_class);

}

private:

WNDCLASS _class;

};

WinClass::WinClass

(WNDPROC winProc, char const * className, HINSTANCE hInst)

{

_class.style = 0;

_class.lpfnWndProc = winProc; // віконна процедура: обов'язкова

_class.cbClsExtra = 0;

_class.cbWndExtra = 0;

_class.hInstance = hInst; // власник класу: обов'язковий

_class.hIcon = 0;

_class.hCursor =::LoadCursor (0, IDC_ARROW); // optional

_class.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); // optional

_class.lpszMenuName = 0;

_class.lpszClassName = className; // обов'язково

}

Як тільки Клас Вікна зареєстрований, ми можемо продовжити створення вікна. Для цього викликаємо функцію API CreateWindow. У неї багато параметрів: ім'я тільки що зареєстрованого класу вікна, заголовок, що з'являється в назві вікна, стиль, положення на екрані і розмір, а також дескриптор екземпляра додатка. Інші параметри в даний момент залишені = 0.

Вікно не буде з'являтися на екрані доти, поки Ви не скажете, щоб Windows показала його.

class WinMaker

{

public:

WinMaker (): _hwnd (0) {}

WinMaker (char const * caption, char const * className,

HINSTANCE hInstance

);

void Show (int cmdShow)

{

::ShowWindow (_hwnd, cmdShow);

::UpdateWindow (_hwnd);

}

protected:

HWND _hwnd;

};

WinMaker::WinMaker

(char const * caption, char const * className, HINSTANCE hInstance)

{

_hwnd =::CreateWindow (

className, // ім'я реєструємого віконного класу

caption, // заголовок вікна

WS_OVERLAPPEDWINDOW, // стиль вікна

CW_USEDEFAULT, // позиція x

CW_USEDEFAULT, // позиція y

CW_USEDEFAULT, // ширина

CW_USEDEFAULT, // висота

0, // handle to parent window

0, // handle to menu

hInstance, // дескриптор екземпляра

0); // дата створення (window creation data)

}

Windows програма керується подіями. Це означає, що Вам, як програмісту, належить знаходитися в обороні. Користувач буде бомбардувати Windows різними зовнішніми діями, а Windows буде бомбардувати вашу програму повідомленнями, що відповідають цим діям. Усе, що Ви повинні робити - це відповідати на повідомлення. Малюнок нижче схематично показує як усе це працює.

Windows одержує різні події від клавіатури, миші, портів, і т.д. Кожна подія швидка перетвориться в повідомлення. Windows посилає повідомлення, що відповідають вікнам. Наприклад, усі повідомлення від клавіатури йдуть до вікна, що у даний час має фокус уведення (активне вікно). Повідомлення миші посилаються відповідно до позиції курсору миші. Вони звичайно йдуть до вікна, що розташовано безпосередньо під курсором (якщо яка-небудь програма не захопила мишу).

Усі ці повідомлення закінчуються в чергах повідомлень. Windows підтримує черга повідомлень для кожної прикладної програми, що виконується, (фактично, для кожного потоку). Ваше завдання полягає в послідовному одержанні цих повідомлень у так званому циклі повідомлень (message loop). Для цього програма повинна викликати GetMessage. Потім викликається DispatchMessage, щоб віддати повідомлення назад Windows. Хіба сама Windows не може посилати всі ці повідомлення самостійно? У принципі це можливо, але цикл повідомлень дає вашій програмі можливість подивитися на них і, якщо це необхідно, виконати деякі додаткові дії перед поверненням. Чи не виконувати...

Кожне повідомлення адресоване визначеному вікну. Коли Ви запитуєте повідомлення в Windows, система з'ясує клас вашого вікна, знайде зв'язану з ним віконну процедуру, і викликає її. Будь-яке повідомлення, послане нашому вікну може оброблятися в нашій віконній процедурі. Нам залишається тільки відреагувати на його. І що? Ми повинні відповідати відповідним чином на всілякі повідомлення Windows? Там їх сотні! На щастя, ні! Ми повинні перехоплювати тільки ті повідомлення, у яких зацікавлені. Всі інші ми повертаємо назад у Windows для обробки за замовчуванням, використовуючи DefWindowProc.

Давайте розглянемо WinMain. Виконання Windows програми не починається з функції main - воно починається з WinMain. Спочатку, ми створюємо WinClass і реєструємо його. Потім ми створюємо екземпляр вікна (на основі тільки що зареєстрованого класу) і відображаємо його. У загальному випадку WinMain викликається з відповідною директивою show. Користувач може запустити прикладну програму зі згорнутим чи розгорнутим вікном. Потім ми запускаємо цикл повідомлення, у якому обробляємо і посилаємо повідомлення доти, поки GetMessage не поверне 0. У цей момент параметр wParam повідомлення буде містити код повернення для всієї програми.

int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst,

char * cmdParam, int cmdShow)

{

char className [] = "Winnie";

WinClass winClass (WindowProcedure, className, hInst);

winClass.Register ();

WinMaker win ("Hello Windows!", className, hInst);

win.Show (cmdShow);

MSG msg;

int status;

while ((status =::GetMessage (& msg, 0, 0, 0)) != 0)

{

if (status == -1)

return -1;

::DispatchMessage (& msg);

}

return msg.wParam;

}

Функція API GetMessage - цікавий приклад дивовижної Troolean (на противагу традиційної Boolean) логіки Microsoft. GetMessage визначена таким чином, щоб повернути BOOL, але в документації визначається три варіанти значень, що повертаються: ненульових, нуля і -1. Приведемо цитату з довідки: Якщо функція передає повідомлення, інше ніж WM_QUIT, що повертається значення відмінне від нуля. Якщо ж функція видає повідомлення WM_QUIT, що повертається значення - нуль. При виникненні помилки значення, що повертається, дорівнює -1.

Інша частина Windows програми - віконна процедура. Пам'ятайте, що Windows викликає її при обробці всіх повідомлень. Ці повідомлення можуть ігноруватися, якщо їх пересилати до DefWindowProc. Тільки одне повідомлення ми завжди зобов'язані перехоплювати. Це WM_DESTROY, що посилається самій Windows у той момент, коли користувач закриває вікно (натискаючи кнопку закриття в заголовку вікна). Стандартна відповідь на WM_DESTROY полягає в посилці повідомлення про вихід із програми зі значенням нуля як код повернення. От і усе, що можна сказати з цього приводу.

// Window Procedure called by Windows

LRESULT CALLBACK WindowProcedure

(HWND hwnd, unsigned int message, WPARAM wParam, LPARAM lParam)

{

switch (message)

{

case WM_DESTROY:

::PostQuitMessage (0);

return 0;

}

return::DefWindowProc (hwnd, message, wParam, lParam);

}

Запустіть середовище розробки C++(Платформа: Borland C++ (не Builder), Visual C++.). Створіть простий текстовий файл і запишіть у нього наступне:

HWND MainRegister(char* Name, int x, int y, int w, int h)

{ extern HINSTANCE Instance; // покажчик додатка

extern long WINAPI MainEventManager(HWND,UINT,WPARAM,LPARAM);

static WNDCLASS rc; // параметри головного вікна

rc.lpfnWndProc = MainEventManager; // керування подіями

rc.hInstance = Instance; // код додатка

rc.hIcon = LoadIcon(NULL, IDI_EXCLAMATION); // іконка

rc.hCursor = LoadCursor(NULL, IDC_ARROW); // курсор

rc.hbrBackground = CreateSolidBrush(RGB(255,255,255));//тло

rc.lpszClassName = Name; // ідентифікатор класу вікна

RegisterClass(&rc); // реєстрація класу вікна

return CreateWindow(Name, Name,

WS_OVERLAPPEDWINDOW | WS_VISIBLE,

x, y, w, h, NULL, NULL, Instance, NULL);

}

Тепер пояснимо цей код. Тут ми повідомляємо функцію MainRegister, що реєструє ваш прикладну програму у Windows, для того, щоб воно могло "спілкуватися" із системою. У цій функції створюється об'єкт класу WNDCLASS, що визначає параметри нашого додатка, потім за допомогою функції RegisterClass ми робимо реєстрацію додатка. Також функція повідомляє функцію, що буде керувати подіями(відповідати і посилати повідомлення Windows) - MainEventManager. Наша функція повертає покажчик на створене вікно, що має тип HWND. Але цією функцією нам потрібно вміти скористатися. У будь-якій програмі з WinAPI повинна бути присутнім функція WinMain (це аналог main у досовських чи консольних додатках). Збережіть цей файл із функцією MainRegister, як MainReg.cpp. Тепер створіть ще один текстовий файл і в нього запишіть наступний код:

#include<windows.h>

#include<windowsx.h>

#include<stdio.h>

#pragma stophdr

#include"MainReg.cpp"

/*---------глобальні змінні------------*/

HINSTANCE Instance;

HWND hw;

/*------------------------------------------*/

#pragma argsused

int WINAPI WinMain (HINSTANCE osInstance, HINSTANCE osPreviousInstance,

LPSTR osParameters, int CommandShow)

{

Instance=osInstance;

MainRegister("C++(source code)",50,80,640,500);

MSG MESSAGE;

while(GetMessage(&MESSAGE,0,0,0))

DispatchMessage(&MESSAGE);

}

//--------------------PROTOTIP------------------------//

void wPaint(HWND hw);

/*----------Головне керування подіями-------------------*/

long WINAPI MainEventManager(HWND hw, UINT Code,WPARAM wParam,LPARAM lParam)

{ switch(Code)

{

case WM_PAINT: wPaint(hw);

break;

case WM_DESTROY: PostQuitMessage (0);

}

return DefWindowProc(hw,Code,wParam,lParam);

}

Пояснення до цього фрагмента коду. Перші кілька рядків ми підключаємо бібліотеки, необхідні для роботи WinAPI-програм. Далі ми повідомляємо дві змінні Instance і hw, вони необхідні нам для контролю нашого додатка. Потім йде та сама основна функція WinMain, вона має кілька параметрів (про ці параметри можна прочитати в SDK). У цій функції ми і будемо використовувати нашу MainRegister, що створить нам вікно і зареєструє прикладну програму у Windows. Отже, нашу прикладну програму зареєстровано, але це тільки половина справи. Нам ще потрібно відповідати на повідомлення, що посилаються Windows нашій програмі, для цього ми створюємо цикл, у якому використовуємо функцію одержання повідомлень GetMessage, а потім використовуємо функцію DispatchMessage. Нехай ми одержали повідомлення, але адже нам треба на нього відповісти, а якщо ми не відповімо системі, то вона просто може "забути" про нашу прикладну програму і воно зависне, щоб система про нас не "забула", ми скористаємося функцією, що оголосили ще в MainRegister - MainEventManager. Ми одержуємо повідомлення, але ми не знаємо, що це за повідомлення, а як же ми будемо на нього відповідати, адже не можна відповісти на запитання, не знаючи його суті? Тому ми будемо вибирати, на які повідомлення відповідати. Повідомлення ми одержуємо в змінну Code, потім за допомогою оператора switch ми обробляємо це повідомлення, і якщо ми хочемо відповісти на повідомлення, то ми відповідаємо. Нам зовсім не обов'язково відповідати на всі повідомлення що посилаються Windows, тільки на основні. У нашій програмі ми будемо відповідати на повідомлення WM_PAINT (запит на перемальовування вікна). У цій ділянці коду ми оголосили функцію wPaint, але не записали її вмісту, то вона:

void wPaint(HWND hw)

{

//------------------home-----------------//

PAINTSTRUCT ps;

HDC Canvas=BeginPaint(hw,&ps);

SetTextColor(Canvas,RGB(0,0,255));

//---------------funktion text-------------//

TextOut(Canvas,100,5,"HELLO WORLD!!!",14);

EndPaint(hw,&ps);

}

У цій функції ми виводимо у вікно напис HELLO WORLD!!!.

При натисканні на "хрестик", щоб закрити програму, посилається повідомлення WM_DESTROY, на яке ми відповідаємо WinAPI функцією PostQuitMessage, що і закриває наш прикладну програму.

Завдання на виконання

Наберіть програмний код, зазначений у розділі Виконання. Скомпілюйте програму і продемонструйте її працездатність. Виконайте завдання згідно варіанту. Підготуйте протокол і надайте викладачу.

Варіанти завдань:

Змініть приведений код таким чином, щоб розмір шрифту змінювався пропорційно зміні розмірів вікна.

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

Додайте на форму текстову область і кнопки Save і Load. За допомогою кнопки Save ви повинні зберігати введений текст у файл, а за допомогою Load - завантажувати текст із файлу.

Розбийте вікно на 8 областей. При наведенні курсору в кожну з областей значок курсору повинний мінятися (для кожної області - свій значок).

Зробіть простий імітатор Раіnt'а - віконце, у якому можна малювати за допомогою курсору, чи стирати намальоване. Палітра кольорів також повинна бути доступна.

Здійсните вивід у вікно системного часу і дати. Повинна бути можливість настроювання поточного часу/дати.

Виведіть у вікно список активних процесів.

Виводіть на форму назву заголовка вікна, активного в даний момент.

Використовуючи Windows API створити модальне діалогове вікно з такими елементами керування Windows: Static text, Edit Box, List Box. Та кнопки “OK” та “Cancel”, після натискання на кнопку “OK” винний з'явитись Massage Box у якому відображені значення елементів керування, що присутні в даному вікні.

Використовуючи Windows API створити модальне діалогове вікно з такими елементами керування Windows: Static text, Check Box, Horizontal Scroll Bar. Та кнопки “OK” та “Cancel”, після натискання на кнопку “OK” винний з'явитись Massage Box у якому відображені значення елементів керування, що присутні в даному вікні.

Використовуючи Windows API створити модальне діалогове вікно з такими елементами керування Windows: Static text, декілька Radio Button, які згруповані за допомогою групуючої рамки (Group Box). Та кнопок “OK”, “Cancel”, “About”. При натисканні на “About” у вікні винна відобразитись ваші копірайти. Після натискання на кнопку “OK” винний з'явитись Massage Box у якому відображені значення елементів керування, що присутні в даному вікні.

Використовуючи Windows API створити модальне діалогове вікно з такими елементами керування Windows: Static text, Combo Box, Edit Box - неактивоване. Та кнопок “OK”, “Cancel”, “Active”. Кнопка “Active” винна активувати (дозволяти вводити інформацію) у Edit Box. Після натискання на кнопку “OK” винний з'явитись Massage Box у якому відображені значення елементів керування, що присутні в даному вікні.

Використовуючи Windows API створити модальне діалогове вікно з такими елементами керування Windows: Static text, неактивований Edit Box та поруч з їм Spin (набірний лічильник). При натисканні на Spin значення в Edit Box повинні зменшуватись чи збільшуватись. Та кнопки “OK” та “Cancel”, після натискання на кнопку “OK” винний з'явитись Massage Box у якому відображені значення елементів керування, що присутні в даному вікні.

Використовуючи Windows API створити модальне діалогове вікно з такими елементами керування Windows: Static text, Progress (індикатор просування), Slider (повзунок). Під цими індикаторами відображається їх теперішнє положення в текстовому чи числовому вигляді. Та кнопки “OK” та “Cancel”, після натискання на кнопку “OK” винний з'явитись Massage Box у якому відображені значення елементів керування, що присутні в даному вікні.

Використовуючи Windows API створити вікно в якому відображається інформація про вас та координати миші в цьому вікні. При натисканні на праву кнопку повинна з'явитись інформація про це, при натисканні на ліву кнопку вікно винне закритись.

Використовуючи Windows API створити вікно в якому відображається інформація про вас. До меню додаються назви декількох геометричних фігур, які повинні відображатись у вікні при натисканні на них.

Використовуючи Windows API створити вікно в якому відображається якийсь текст, при цьому необхідно реалізувати скролінг.

Використовуючи Windows API створити вікно в якому відображається чорний квадрат. Якщо ви натискаєте праву кнопку миші в квадраті то повинно з'явитися повідомлення про це, якщо зовні - те аналогічне повідомлення, про ті що курсор знаходиться зовні. При натисканні на ліву кнопку в квадраті вікно винно закритись.

Використовуючи Windows API створити вікно. До меню додати кнопку (пункт) при натисканні на який з'являється модальне діалогове вікно з EditBox та кнопками “OK” та “Cancel”. При натисканні на “OK” текст, що був надрукований у Edit Box повинен відобразитись у головному вікні, при натисканні “Cancel” діалогове вікно просто закривається.

Використовуючи Windows API створити вікно. До меню додати кнопку (пункт) при натисканні на який з'являється модальне діалогове вікно з Tree Control (графічний список) та кнопками “OK” та “Cancel”. При натисканні на “OK” значення, що було вибрано в Tree Control винно відобразитись у головному вікні, при натисканні “Cancel” діалогове вікно просто закривається.

Використовуючи Windows API створити вікно. До меню додати кнопку (пункт) при натисканні пропонується відкрити текстовий файл з крапками для графіка. Після його відкриття в головному вікні малюється координатна сітка та сам графік.


Подобные документы

  • Теоретические сведения о таймерах Windows. Описание используемых WinAPI функций для измерения текущего времени, для создания виртуальных таймеров. Выключение и перезагрузка компьютера по нажатию на кнопку и по таймеру, вывод текущей даты и времени.

    курсовая работа [50,0 K], добавлен 18.05.2014

  • Правила создания и особенности работы с приложением Windows Application. Рассмотрение структуры панели Properties и ее функционального назначения. Возможности пункта меню "View". Практическая разработка приложения - калькулятора для сложения двух чисел.

    лабораторная работа [99,1 K], добавлен 01.12.2011

  • История развития реестра Windows, описание разделов, WinApi функции. Аналоги программ других разработчиков. Последовательность проектирования Windows-приложения, которое будет выводить аппаратную характеристику ПК на экран. Руководство пользователя.

    курсовая работа [1,2 M], добавлен 23.07.2013

  • Таймер в Windows как устройство ввода информации, которое извещает приложение о том, что истек заданный интервал времени. Работа с таймером в условиях WinAPI, процесс 32-битного программирования на ассемблере под Windows. Результат выполнения программы.

    курсовая работа [165,6 K], добавлен 18.05.2014

  • Загальні факти про комп’ютерні ігри. Розгляд основ розробки програмного (джерельного) коду, контенту (малюнки, моделі, музика) та ігрових механік гри "Три стакани". Правила використанням засобів WinAPI. Створення математичної моделі алгоритму програми.

    курсовая работа [405,6 K], добавлен 09.06.2015

  • Основи розробки додатків Windows. Параметри функції WinMain. Запуск процесу, використання для цього вибраних на диску файлів. Відслідковування кожного з процесів (його статус, назву, час життя), діяльності користувача. Опис алгоритму роботи програми.

    курсовая работа [202,6 K], добавлен 14.05.2015

  • Поняття та класифікація операційної системи. Історія появи Windows 7. Нововведення інтерфейсу Windows 7: екран привітання, робочий стіл, панель задач. Описання стандартних програм Windows 7. Огляд захисту та продуктивності даної операційної системи.

    дипломная работа [166,3 K], добавлен 18.06.2011

  • Історія операційної системи Windows. Характеристика операційної системи Microsoft Windows XР. Робочий стіл. Файлова система і структура даних. Загальні відомості про текстовий редактор Microsoft Word. Адаптація до вимог користувача. Редагування тексту.

    реферат [28,2 K], добавлен 20.11.2013

  • Характеристика операционной системы. История развития Windows. Сравнительная характеристика версий Windows. Элементы и инструменты Windows XP. Прикладные программы в Windows XP. Работа настольных и портативных компьютеров под управлением Windows.

    доклад [19,1 K], добавлен 16.10.2011

  • Особливості розвитку та загальна характеристика операційних систем сімейства Windows. Організація роботи в Windows, опис базових об'єктів (файлів, папок, додатків, документів) та набір дій з ними. Застосування Провідника для роботи з файлами та папками.

    курсовая работа [1,9 M], добавлен 20.12.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.