Федеральное государственное образовательное учреждение Высшего профессионального образования «Южный федеральный университет» Авакян Леон Александрович «использование win api функций в среде делфи» (учебно-методическое пособие)

Проектное задание

Написать программу, выводящую дескриптор окна и всех оконных компонентов (свойство Handle всех объектов-наследников TControl библиотеки VCL) в окне, выводимом функцией MessageBox, содержащем три кнопки – Ok, Retry, Cancel. Проверить, какую из кнопок выбрал пользователь.

Тест рубежного контроля №1

Тест содержит 5 заданий, на выполнение которых отводится 3 минуты. Выберите наиболее правильный, по Вашему мнению, вариант ответа и отметьте его любым значком в бланке ответов.

1. Windows API функции это:

1)

Функции, предоставляемые оболочкой Delphi при работе в ОС Windows

2)

Функции всех динамических библиотек (DLL)

3)

Системные функции операционной системы Windows, используемые при разработке приложений

4)

Функции, которые выполняет операционная система (поддержка устройств, интерфейс пользователя…)

2. Сообщения в Windows позволяет

1)

Взаимодействовать операционной системе и приложению

2)

Управлять системой из приложения

3)

Управлять приложением

4)

Все вышеперечисленное

3. Дескриптор это

1)

Объект или ресурс операционной системы

2)

Некоторое однобайтовое целое число

3)

Непрямой указатель

4)

Указатель на область памяти

4. Выполнение кода MessageBox(0, ‘’, ‘’, MB_ICONASTERYX or MB_YESNO) приведет к

1)

Возникновению ошибки при исполнении

2)

Возникновению ошибки при компиляции

3)

Появлению окна без заголовка и текста, но с иконкой с вопросом и кнопками да/нет

4)

Появлению окна без заголовка и текста, но с иконкой остановки и кнопками да/нет

5. Выполнение кода MessageBox(0, '', '', MB_OK or MB_YESNO or MB_ABORTRETRYIGNORE or MB_RETRYCANCEL) приведет к

1)

Возникновению ошибки при исполнении

2)

Возникновению ошибки при компиляции

3)

Не приведет к возникновению ошибки, однако окно показано не будет

4)

Приведет к появлению окна с большим количеством кнопок

Бланк ответов

1

2

3

4

1)

2)

3)

4)

5)

Критерии оценки

4 и более правильных ответов – отлично

3 правильных ответа – хорошо

2 правильных ответа – удовлетворительно

1 и менее правильных ответов - неудовлетворительно

Модуль 2. Создание элементов управления

Разработка программ зачастую напоминает священный ритуал, построенный на произнесении ряда обязательных магических заклинаний. Особенно это касается Windows приложений. Windows-заклинания позволяют вывести графическое окно, обработать поступающие сообщения. Порядок их следования предопределен священными руководствами.

Легалов А. И., д.т.н., проф. Сибирского федерального университета

Комплексная цель: научиться создавать полноценные программы без использования дополнительных визуальных библиотек, таких как VCL в Delphi или MFC в C++.

Краткое изложение программного материала: в модуле показано как создавать на основе Win API функций:

  • Окна

  • Кнопки

  • Редакторы ввода

  • Меню

  • Стандартные диалоговые окна

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

2.1. Создание окна средствами WinAPI

Для того, чтобы создать окно, необходимо:

  1. Создать и зарегистрировать в Windows специальный класс окна с помощью функции RegisterClass();

  2. Создать (CreateWindow) и показать (ShowWindow) экземпляр окна;

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

Регистрация специального класса окна производиться с помощью функции ATOM RegisterClass(CONSTYLE="WNDCLASS *lpWndClass), возвращаемое значение которой равно нулю в случае ошибки. Информация о классе содержится в структуре lpWndClass типа WNDCLASS* (язык C), которую необходимо предварительно заполнить, например, следующим образом (Delphi):

Var WndClass: TWndClass;

FillChar(WndClass, SizeOf(WndClass), 0); //заполняем структуру

нулями

with WndClass do begin

hInstance := SysInit.hInstance; //Обязательныйпараметр,

идентификатор приложения

lpszClassName := sClassName; //имя класса

lpfnWndProc := @WindowProc; //ссылка на оконную функцию

hbrBackground := GetStockObject(LTGRAY_BRUSH); // способ

заливки клиентской области

end;

Заполнение нулями необходимо для того, чтобы мусор, который, возможно, остался в памяти, не повлиял на параметры, значения которых явно не прописывается (стиль окна, иконка, курсор…).

После того, как создан класс, создаем на его основе окно. Это делается с помощью функции CreateWindow().

После того, как окно создано, его можно показать, например, с помощью функции ShowWindow(). Следует отметить, что эту функцию можно применить только к родительскому окну, т.е. если приложение содержит главное окно и дочерние компоненты, то аргументом этой функции является дескриптор главного окна.

Прием сообщений осуществляется с помощью нескольких функций: GetMessage(); TranslateMessage(); DispatchMessage(); DefWindowProc();
Для того, чтобы организовать цикл получения сообщений, нужно в первую очередь написать функцию окна, т.е. функцию, которая будет совершать какие-либо действия в ответ на сообщение (адрес этой функции указывается в структуре WNDCLASS: IpfnWndProc:=@WindowProc). Необходимо правильно описать функцию:

На языке С++:
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

На языке Object Pascal:
function WindowProc(hWnd: THandle; uMsg, wParam, lParam: Integer): Integer; stdcall; export;

где HWND - дескриптор окна, который был получен после выполнения функции CreateWindow(), uMsg - код сообщения (16 бит) (может использоваться, например, следующим образом: if uMsg=WM_CLOSE then …),

WPARAM, LPARAM - параметры, которые передаются вместе с сообщением (16 бит).

Цикл обработки сообщений имеет следующий вид:

while GetMessage(Msg, 0, 0, 0) do begin

TranslateMessage(Msg);

DispatchMessage(Msg);

end;

Функция GetMessage() выбирает первое сообщение из очереди сообщений, предназначенных для данного приложения, функция TranslateMessage() переводит виртуальный код сообщения в строку символов, функция DispatchMessage() отправляет сообщение на обработку оконной функцией, заданной при регистрации класса окна.

Оконная функция может иметь следующий вид:

function WindowProc(hWnd: THandle; uMsg, wParam, lParam: Integer): Integer; stdcall; export;

begin

Result := 0;

case uMsg of

WM_DESTROY: …

WM_PAINT: …

end

else

Result := DefWindowProc(hWnd, uMsg, wParam, lParam);

end;

Внутри блока case располагается код, ответственный за особую реакцию приложения на некоторые сообщения (закрытие окна, его перерисовка). Функция DefWindowProc вызывает стандартную оконную функцию, которая обрабатывает все остальные сообщения, не указанные в блоке.

Пример создания простейшего окна приведен ниже. Обратите внимание, что весь код располагается в файле project1.dpr, как и в случае консольного приложения (но без директивы $APPTYPE CONSOLE).

program project1;

uses

Windows,

Messages;

const

sClassName = 'MyWindow'; // Имяклассаокна

var

hWnd: THandle; // идентификаторокна (дескриптор)

WndClass: TWndClass; //структура WndClass

Msg: TMsg; //структура для принятия сообщений

function WindowProc(hWnd: THandle; uMsg, wParam, lParam: Integer): Integer; {функцияокна} stdcall; export;

begin

Result := 0;

case uMsg of

WM_DESTROY: //если uMsg равна WM_DESTROY(кодзакрытияокна) тозакрываемся

begin

halt(0);

end;

end;

Result := DefWindowProc(hWnd, uMsg, wParam, lParam); // обработатьостальныесообщения

end;

begin

FillChar(WndClass, SizeOf(WndClass), 0); //заполняемструктурунулями

with WndClass do begin

hInstance := SysInit.hInstance;

lpszClassName := sClassName; //имякласса

lpfnWndProc := @WindowProc; //ссылканаоконнуюфункцию

hbrBackground := GetStockObject(LTGRAY_BRUSH);

end;

RegisterClass(WndClass); //регистрируем класс

hWnd := CreateWindow(sClassName, '', WS_OVERLAPPEDWINDOW, 200, 200, 300, 300, 0, 0, hInstance, NIL); //создаем окно

if hWnd = 0 then begin //если произошла ошибка, то выходим

MessageBox(0, 'Initialisation failed', NIL, ID_OK);

Exit;

end;

ShowWindow(hWnd, SW_normal); //показываемокно

while GetMessage(Msg, HWnd, 0, 0) do begin //получаемсообщение

TranslateMessage(Msg);

DispatchMessage(Msg);

end;

Halt(Msg.wParam);

end.

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

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

  1. Каталог конкурентоспособных предприятий краснодарского края (1)

    Документ
    Осуществление первичной проверки в производственных условиях селекционных перспективных сортов риса, а также производства и реализации семян риса высших репродукций,
  2. Каталог конкурентоспособных предприятий краснодарского края (2)

    Документ
    Буровое и нефтепромысловое оборудование, циркуляционные системы, башни сотовой связи, блоки к циркуляционным системам, емкости до 60м3, поддоны стеновых панелей для панельного домостроения,
  3. Каталог конкурентоспособных предприятий краснодарского края (3)

    Документ
    Омская, Курганинская, Челябинская, Сведрловская, Курская, Белгородская, Воронежская, Волгоградская, Ростовская области, Республики Адыгея, Башкортостан,
  4. М. П. Горчакова-Сибирская (отв ред., Спбгиэу), д-р философ наук, проф (2)

    Документ
    д-р пед. наук, проф. М. П. Горчакова-Сибирская (отв. ред., СПбГИЭУ), д-р философ. наук, проф. Е. А. Гусева (зам. отв. ред. СПбГИЭУ), канд. филолог. наук, Е.
  5. М. П. Горчакова-Сибирская (отв ред., Спбгиэу), д-р философ наук, проф (1)

    Документ
    д-р пед. наук, проф. М. П. Горчакова-Сибирская (отв. ред., СПбГИЭУ), д-р философ. наук, проф. Е. А. Гусева (зам. отв. ред. СПбГИЭУ), канд. пед. наук М.
  6. Департамент внешнеэкономических и межрегиональных связей Костромской области

    Документ
    В целях развития двустороннего межрегионального сотрудничества и расширения взаимовыгодных поставок потребительских товаров и продукции производственно технического назначения департамент внешнеэкономических и межрегиональных связей
  7. Каталог конкурентноспособных предприятий кубани (1)

    Документ
    Мясо, включая субпродукты, сыры жирные, масло животное, цельномолочная продукция, рыбная продукция, зерновые, продукция растениеводства и животноводства
  8. Каталог конкурентноспособных предприятий кубани (2)

    Документ
    Производство прочего подъемно - транспортного оборудования (домкратные установки для подъема подвижного состава,гидравлический инструмент для ремонта и текущего содержания пути и др.
  9. Выпускаемые товары и услуги

    Документ
    Производство изделий медицинского, технического и бытового назначения на основе натурального латекса (перчатки анатомические, хирургические, технические,

Другие похожие документы..