Если запустить созданное нами пустое приложение (см. предыдущий подраздел), то ничего не произойдет. Не появится никаких окон, и программа сразу же закроется. Давайте создадим что-нибудь более стоящее, с главным окном, и посмотрим, как будет работать программа. Даже если вы не будете писать на "чистом" Win API, это поможет вам понять, как работают программы Windows.

В листинге 2.6 приведен код проекта, в котором создается окно без использования VCL, на него помещаются две кнопки и обрабатываются события по их нажатии.

Листинг 2.6. Создание окна и кнопок с использованием Win API

program Win_Button;
uses windows, messages: var
wc: TWndClassEx;
pWnd, pButtonl. pButton2: HWND;
pMsg: TMsg:

// Процедура обработки сообщений

function WindowProc(wnd: HWND: Msg: Integer;
wParam. wParam: lParam: IParam): Lresult;
stdcall;
begin
Result := 0:
case msg of

// Создание окна

WM_CREATE:
begin
end;

// Уничтожен e окна

WM_DESTROY:
begin
PostQuitMessage(O):
exit;
end:

// Нажатие кнопки слева в окне

WM_LBUTT0ND0WN:
begin
MessageBoxCO, Щелчок левой кнопкой мыши в окне' 'Внимание', 0);
end;

// События от элементов управления продолжение iP

Листинг 2.6 (продолжение) WM_COMMAND: begin // Нажата первая кнопка if pButtonl = lParam then MessageBox(0, 'Левый клик мышкой по кнопке Г. 'Внимание'. 0):

// Нажата вторая кнопка if pButton2 = 1 Param then MessageBox(0, 'Левый клик мышкой по кнопке 2', 'Внимание'. 0):

end; else // Если мы не обработали событие, // то вызываем обработчик по умолчанию

Result := DefWindowProc(wnd.msg,wparam.lparam);
end;
end;
// Начало кода begin
// Регистрация класса окна wc.cbSize := sizeof(wc); wc.lpfnWndProc := @WindowProc. wc.cbClsExtra := 0: wc.cbWndExtra := 0; wc.hlnstance := HInstance: wc.hCursor := LoadCursor(0, IDC_ARR0W); wc.hbrBackground :- C0L0R_BTNFACE+1: wc. 1 pszMenuName := nil;
wc.lpszClassName := 'delphi_winapi'; RegisterClassEx(wc);

// Создание окна на основе созданного класса pWnd := CreateWindowEx(WS_EX_APPWINDOW, 'del phi_wiпарт', 'Delphi WinAPI Demo'. WS_OVERLAPPED or WS_SYSMENU CW_USEDEFAULT, CW_USEDEFAULT. 250. 130. 0. 0. Hinstance, nil):

// Создание первой кнопки , pButtonl := CreateWindow('button'. 'sdf, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 75. 5. 100. 25. pWnd. 0. hinstance. nil);

// Создание второй кнопки

pButton2 := CreateWindow('button'. 'Тест 2'.

WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTT0N, 75. 50. 100. 25. pWnd, 0. hinstance. nil).
// Изменение названия первой кнопки SetWindowText(pButtonl, 'Тест Г);

// Отображение созданного окна Showkhndow(pWnd. SW_SHOW), // Цикл обработки сообщений while GetMessage(pMsg, 0, 0, 0) do begin Transi ateMessage(pMsg): DispatchMessage(pMsg), end:

end.

В этом примере показаны основы создания приложений на "чистом" Win API. С их помощью вы сможете создать простое приложение минимального размера. В следующих двух главах мы еще много внимания уделим использованию функций Win API.

Весь код нашей программы состоит из двух частей: функции WindowProc и кода проекта между основными операторами begi п и end. Рассмотрим основной код, потому что программа начнет выполнение именно с него.

Первым делом зарегистрируем новый класс окна, на основе которого будет создано главное окно нашей программы. Для регистрации используется функция Régi s -terClassEx, которой нужно в качестве параметра передать структуру типа Twnd-Cl assEx, имеющую следующий вид:

tagWNDCLASSEXA = packed record cbSize: UINT: style: UINT:
IpfnWndProc: TFNWndProc: cbClsExtra. Integer: cbWndExtra: Integer, hlnstance: HINST;
hlcon: HICON;
hCursor- HCURSOR: hbrBackground: HBRUSH;
lpszMenuName: PAnsiChar;
IpszClassName: PAnsiChar: hlconSm: HICON;
end;

Рассмотрим параметры структуры TwndCl assEx:

о cbSize - размер структуры. Чтобы правильно указать размер, определяем его с помощью функции sizeof;
в style - стиль окна. Нам этот параметр не нужен, поэтому будет использоваться стиль по умолчанию;
в 1 pf nWndProc - функция, которая будет использоваться в качестве обработчика события для сообщений окна;
в cbCl sExtra и cbWndExtra - количество дополнительных байтов для класса и окна. Чаще всего указывают нулевые значения;
в hlnstance - экземпляр приложения;
в hlcon - пиктограмма программы;
• hCursor - курсор, который будет отображаться, когда указатель мыши находится над окном. По умолчанию используется стрелка (IDCARR0W). В примере этот указатель явно загружается с помощью функции LoadCursor;
в hbrBackground - цвет фона окна;
• 1 pszMenuName - главное меню окна;
в 1 pszCl assName - имя класса окна. Сейчас мы только регистрируем класс, но это имя должно будет использоваться при создании окна;

в hlconSm - указатель на пиктограмму, которая будет отображаться в системном меню окна.

После того как мы зарегистрировали класс, можно создать окно на основе этого класса. Для этого используется функция CreateWindowEx. Функция возвращает указатель на созданное окно и описывается таким образом:

function CreateWindowEx<
dwExStyle: DWORD;
lpClassName: PChar; 1pWindowName: PChar: dwStyle: DWORD: X. Y.
nWidth. nHeight: Integer;
hWndParent: HWND;
hMenu: HMENU: hlnstance: HINST;
lpParam: Pointer ): HWND:

Рассмотрим параметры функции CreateWindowEx:

e dwExStyl e - расширенный стиль окна. Параметр может принимать следующие значения (рассмотрим только основные):

О WS_EX_ACCEPTFILES - окно, на которое можно "перетягивать" файлы (Drag&-Drop);
О WS_EX_APPWINDOW - главное окно, кнопка которого будет отображаться в Панели задач;
О WS_EX_CLIENTEDGE - окно имеет клиентскую область, огражденную границей;
О WS_EX_CONTEXTHELP - в заголовке окна есть кнопка помощи для вызова контекстного меню;
О WS_EX_CONTROLPARENT - разрешается перемещение по элементам окна с помощью кнопки Tab;
О WS_EX_DLGMODALFRAME - окно с двойной границей. Такие окна используются в качестве модальных диалоговых окон;
О WSEXMDICHILD - дочернее окно для многодокументного приложения;
О WS_EX_RIGHTSCROLLBAR - с правой стороны будет полоса прокрутки;
О WSEXT0OLWIND0W - окно инструментов. Такие окна имеют узкое системное меню и используются для хранения кнопок или других вспомогательных инструментов главного окна;
О WS_EX_T0PM0ST - окно будет расположено поверх всех остальных;
в lpClassName - имя класса, на основе которого будет создаваться окно;
в 1 pWi ndowName - заголовок окна;

в dwStyl е - стиль окна. Для задания стиля можно указывать сочетания из следующих флагов (рассмотрим основные):

О WS_B0RDER - окно имеет границу в виде тонкой линии;
О WS_CAPTION - окно имеет заголовок;
О WSCHILD - дочернее окно;
О WS_DISABLED - окно будет отключено и не сможет получать данные от пользователя;
О WS_DL6FRAME - окно будет иметь границу, как у диалоговых окон;
О WSMAXIMIZE - после создания окно будет максимизировано;
О WSMAXIMIZEBOX - окно будет иметь кнопку максимизации;
О WS_MINIMIZE - окно создается минимизированным;
О WS_MINIMIZEBOX - окно будет иметь кнопку минимизации;
О WS_SYSMENU - окно будет иметь системное меню;
О WS_TABSTOP - окно сможет получать фокус ввода;
О WS_VISIBLE - после создания окно будет видимо; в X и Y - левая и верхняя позиции окна; в nWidth и nHeight - высота и ширина окна; в hWndParent - главное окно по отношению к создаваемому; в hMenu - меню;
в hlnstance - экземпляр приложения;

в 1 рРагат - это значение используется в качестве параметра 1 pParam в обработчике сообщений для события WMCREATE при создании окна.

Для создания элементов управления используется функция CreateWindow:

function CreateWindow( lpClassName PChar: lpWindowName: PChar: dwStyle: DWORD: X. Y.
nWidth, nHeight: Integer: hWndParent: HWND;
hMenu: HMENU;
hlnstance: HINST;
lpParam: Pointer )• HWND:

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

При создании элементов управления для задания классов окна (параметр 1 pCl ass -Name) нужно указывать заранее предопределенные в системе имена классов элементов управления:

• BUTTON - кнопка;
• С0МВ0В0Х - выпадающий список;
• EDIT - поле ввода;
• LISTB0X - список выбора;
• STATIC - статический текст;

• SCROLLBAR - полоса прокрутки.

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

В данном примере (см. листинг 2.6) мы создали две кнопки. Для первой в заголовке указано бессмысленное сочетание букв, потому что впоследствии заголовок изменяется, а для второй в заголовке указано Тест 2.

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

Чтобы изменить заголовок окна, нужно вызвать функцию SetWindowText, в которой нужно задать следующие параметры:

• указатель на окно. Это должен быть указатель, который мы получили при создании окна;

• новый текст окна.

2.13.1. Уменьшение размера программы с помощью Win API || Оглавление || 2.13.3. Обработка сообщений в Win API


Delphi в шутку и всерьез: что умеют хакеры



Новости за месяц

  • Декабрь
    2021
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31