Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС / Тема_8.ppt
Скачиваний:
137
Добавлен:
11.04.2015
Размер:
1.17 Mб
Скачать

8.1.1. Основные определения

Иллюстрация выполнения методов классов стандартных библиотек.

Классы стандартных библиотек, таких как MFC или FCL, реализованы в виде DLL-библиотек. Как и в случае с функциями стандартных

библиотек системы программирования, метод может выполниться либо

без вызова системной функции (1), либо с вызовом (2).

21

 

8.1.1. Основные определения

Программа, решающая рассмотренную выше задачу, но с использованием функций API Win32.

#include <windows.h> #include <string.h> #include <stdio.h>

LRESULT CALLBACK WindowFunc (HWND, UNIT, WPARAM,

LPARAM); // прототип

 

 

 

HINSTANCE hInst;

// для сохранения дескриптора приложения

// В. Главная функция

 

 

 

int WINAPI

WinMain (HINSTANCE hThisInst,

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

 

 

HINSTANCE hPrevInst,

// = 0

 

 

LPSTR

lpszArgs,

// хвост командной строки, 0

{

 

int

iWinMode) // вид окна при запуске

 

 

 

 

HWND

hwnd;

 

// дескриптор окна

MSG

msg;

 

// сообщение

 

WNDCLASSEX wcl;

 

// структура класса окна

hInst = hThisInst;

 

// сохранить дескриптор приложения

22

8.1.1.Основные определения

//определить класс окна

wcl.cbSize = sizeof(wcl);

 

 

wcl.hlnstance = hThisInst;

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

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

wcl.lpfnWndProc = WndProc;

// функция окна

 

wcl.style = 0;

// стиль по умолчанию

wcl.hlcon = Loadlcon (NULL, IDI_APPLICATION);

// стд.значок

wcl.hCursor= LoadCursor (NULL, IDC_ARROW);

// стд. курсор

wcl.lpszMenuName= NULL;

// без меню

 

wcl.cbClsExtra = 0;

// без дополнительной

wcl.cbWndExtra = 0;

//информации

 

wcl.hbrBackground= (HBRUSH) GetStockObject (WHITE_BRUSH); wcl.hIconSm= LoadIcon(NULL, IDI_APPLICATION);

if (! RegisterClassEx (&wcl) ) return 0; // зарегистрировать класс окна

23

8.1.1.Основные определения

//создать окно

hwnd = CreateWindow ("Имя класса", // имя класса

;

"Заголовок окна",

 

//заголовок

 

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

 

CW_USEDEFAULT,

 

// Х-координата окна

 

CW_USEDEFAULT,

 

//Y-координата окна

 

CW_USEDEFAULT,

 

//ширина окна

 

CW_USEDEFAULT,

 

//высота окна

 

HWND_DESKTOP,

 

// нет родительского окна

 

NULL,

// нет меню

 

hThisInst,

// дескриптор приложения

 

NULL );

/* без дополнительных аргументов */

 

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

 

UpdateWindow (hwnd);

// и вывести в него содержимое

 

24

8.1.1. Основные определения

while (GetMessage (&msg, NULL, 0,0) ) // Цикл обработки сообщений

{

 

 

 

TranslateMessage

(&msg);

// Послать символьное сообщ. клавиатуры

DispatchMessage (&msg);

// Вернуть управление Windows

}

 

 

 

return msg.wParam;

 

}

 

 

 

// С. Оконная функция

 

LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg,

WPARAM wParam, LPARAM iParam)

{

 

 

 

static HWND

hwndButton;

char

szBuffer[50];

 

HDC

hdc;

 

 

25

8.1.1. Основные определения

switch (iMsg)

{

case WM_CREATE:

hwndButton = CreateWindow ("BUTTON", "Ok",

BS_DEFPUSHBUTTON| WS_CHILD |WS_VISIBLE, 100, 100, 60, 30, hwnd, (HMENU)1, hInst, NULL) ;

return 0;

case WM_COMMAND:

MessageBox (hwnd, "", "Нажата кнопка Ok", MBjOK); break;

case WMJJESTROY: PostQuitMessage (0); return 0;

}

return DefWindowProc (hwnd, iMsg, wParam, lParam);

}

26

8.1.1. Основные определения

Если сравнить две последние программы, решающие одну и ту же задачу, то можно увидеть, что в основе методов классов, используемых в первой программе, лежат вызовы таких системных функций, как:

RegisterClassEx();

CreateWindow();

ShowWindow();

UpdateWindow (); GetMessage (); Translate Message (); DispatchMessage ().

Существует еще порядка полутора тысяч других функций графического интерфейса GUI.

Главную функцию и функцию окна на языке С# необходимо оформить как методы класса, а в начале программы необходимо будет определить пространство имен System.Runtime.InteropServices. Кроме того, для каждой используемой функции API Win32 потребуется вставить атрибут DllImport, указывающий на принадлежность функции к DLL- библиотеке. Следом за этим атрибутом необходимо поместить прототип функции.

27

8.1.1. Основные определения

Такая техника обусловлена тем, что в языках С и C++ прототипы всех системных функций описываются в заголовочном файле windows.h, а в языке С# этот файл не используется.

Пример консольного приложения на языке С#, в котором используется системный вызов MessageBox().

using System;

using System.Runtime.InteropServices; class Class1

{

[DllImport(“User32.dll")]

public static extern int MessageBox (int hParent, string Message, string Caption, int Type);

static void Main()

{

MessageBox (0, "Функция API Win32", "Системный вызов",0);

}

}

28

8.1.1. Основные определения

Программа с консольным приложением на языке C++, котороя делает то же самое:

#include "windows.h" void main()

{

MessageBox (0, "Функция API Win32", "Системный вызов", МВ_ОК);

}

29

8.1. Интерфейс прикладного программирования

8.1.2. Классификация системных вызовов

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

управление процессами, потоками и синхронизацией;

управление виртуальной и физической памятью;

управление вводом-выводом.

В API Windows также есть еще ряд групп:

графический интерфейс пользователя;

управление защитой;

управление реестром;

консольные функции

и другие группы специальных функций.

30

Соседние файлы в папке ОС