Inspired =)
  
Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005
Репутация: 29 Всего: 191
|
Тут дан пример, где обрабатывается нажатие на кнопку. | Код | {Author: Rrader} Program WinAPI; // Пример простой программы на "чистом" WinAPI с кнопкой {$R *.res} Uses Windows, Messages; Const ButtonID = 100; // Это идентификатор кнопки, используется для определения исходящих от неё событий, число - произвольное Function GetFont(AName: String): HFONT; // Возвращает дескриптор шрифта Begin Result := CreateFont(0, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET, // Набор символов OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, // Качество DEFAULT_PITCH, PChar(AName)); // Имя шрифта End; Procedure InitCommonControls; External 'comctl32.dll' Name 'InitCommonControls'; // Описание см. ниже Function WinProc(HWND: THandle; // Окно-получатель каждого входящего сообщения Msg: Cardinal; // Само сообщение WParam, // Первый и второй уточняющие параметры сообщения LParam: Cardinal): Cardinal; Stdcall; // Оконная процедура, здесь мы задаем реакцию программы на все нужные нам сообщения Var Rect: TRect; // Для записи размеров клиентской области нашего окна Begin Result := 0; // Чтобы в случае сбоя программы до последней строки функции Windows правильно определила ошибку Case Msg Of WM_CREATE: // При создании окна: Begin {Создаём кнопку} CreateWindowEx (0, // Расширенные стили окна - нам никакие не нужны 'BUTTON', // Предопределенный класс Windows - у нас кнопка 'Кнопка', // Это заголовок кнопки - Caption :) WS_CHILD Or WS_VISIBLE{если не указан, ничего не будет} // Это комбинация оконных стилей Or BS_PUSHBUTTON, // А это продолжение, но стили уже идут кнопочные (ранее были оконные) 0, 0, // Положение левого верхнего угла кнопки: смотри ниже реакцию на WM_SIZE 200, 80, // Размеры HWND, // Родительское окно (здесь: параметр оконной процедуры) ButtonID, // Если мы создаем НЕ формы, то сюда прописываем идентификатор контрола, а если формы - то идентификатор меню окна HInstance, // Грубо говоря - дескриптор всей программы в целом (используется для того, чтобы программа имела доступ к сегменту данных - для знающих ассемблер) NIL); // Указатель на дополнительную информацию - нам не нужен SendMessage(GetDlgItem(HWND, ButtonID), WM_SETFONT, GetFont('Verdana'), -1); // Меняем шрифт End; WM_SIZE: // Посылается после изменения размеров окна (формы) Begin GetClientRect(HWND, Rect); // Получаем размеры клиентской (без рамки и заголовка) области формы {В зависимости от размеров формы перемещаем кнопку:} SetWindowPos( GetDlgItem(HWND, ButtonID), // Возвращает дескриптор контрола по его идентификатору HWND_TOP, // Порядок Z - порядок приоритета контролов, сейчас у кнопки наивысший Rect.Right Div 2 - 100, Rect.Bottom Div 2 - 40, 0, 0, // Нулевой размер { А теперь обламываем функцию :) } SWP_NOZORDER // Игнорируем параметр, где определили HWND_TOP Or SWP_NOSIZE); // Игнорируем параметры, где указывали размер End; {ОБРАБОТЧИК НАЖАТИЯ НА КНОПКУ} WM_COMMAND: // Через это сообщение определяем нажатие на кнопку {Если мессага пришла от кнопки} If LoWord (WParam) = ButtonID Then {И если это было нажатие} If HiWord (WParam) = BN_CLICKED then MessageBox(HWnd, 'Вы нажали на кнопочку!', 'Демонстрация WinAPI', MB_OK); WM_DESTROY: // При уничтожении окна (можно и не задавать реакцию - прога автоматически выгрузится, однако оставив след в памяти) PostQuitMessage(0); // Помещает в очередь сообщений сообщение завершения работы программы (WM_QUIT) Else // Если пришедщее сообщение мы не определили: Result := DefWindowProc(HWnd, Msg, WParam, LParam); // Эта функция обрабатывает ВСЕ ОСТАЛЬНЫЕ сообщения по умолчанию End; // Конец блока Case End; Procedure WinMain; // Эта процедура сформирует окно и отобразит его, запустив цикл обработки сообщений Var HWnd: THandle; // Сюда поместим дескриптор созданного окна Msg: TMsg; // Входящие мессаги WndClassEx: TWndClassEx; // Класс окна - несёт инфу об окне (запись) Begin // Заполняем запись информацией: WndClassEx.cbSize := SizeOf(TWndClassEx); // Размер структуры WndClassEx.lpszClassName := 'APIWindow'; // Имя класса окна (для примера - второй параметр функции FindWindow) WndClassEx.style := CS_VREDRAW Or CS_HREDRAW; // Стили окна - в данном случае окно будет перерисовываться при изменении как горизонтальных, так и вертикальных размеров WndClassEx.hInstance := HInstance; // Ищи описание выше WndClassEx.lpfnWndProc := @WinProc; // адрес окнной процедуры WndClassEx.cbClsExtra := 0; WndClassEx.cbWndExtra := 0; WndClassEx.hIcon := LoadIcon(HInstance, MakeIntResource('MAINICON')); // Икнока окна WndClassEx.hIconSm := LoadIcon(HInstance, MakeIntResource('MAINICON')); // Тоже иконка (но маленькая :) WndClassEx.hCursor := LoadCursor(0, IDC_ARROW); // Курсор мыши для окна (у нас - стрелка) WndClassEx.hbrBackground := COLOR_BTNFACE + 1; // Фон окна WndClassEx.lpszMenuName := NIL; // Указатель на меню (у нас меню нет) // Теперь регистрируем класс окна в системе If RegisterClassEx(WndClassEx) = 0 Then MessageBox(0, 'Невозможно зарегистрировать класс окна', 'Ошибка', MB_OK Or MB_ICONHAND) Else Begin // Создаём окно HWnd := CreateWindowEx( WS_EX_OVERLAPPEDWINDOW, // Расширенные стили WndClassEx.lpszClassName, // Имя класса окна 'Демонстрация WinAPI', // Заголовок WS_OVERLAPPEDWINDOW, // Обычные стили CW_USEDEFAULT, 0, // Позиция относительно экрана (CW_USEDEFAULT означает, что размеры будут определяться Windows) CW_USEDEFAULT, 0, // Размеры 0, // Родитель - у нас нет родителей :) 0, // Меню HInstance, // Смотри описание выше NIL); // Дополнительные параметры If HWnd = 0 Then // Если окно не создалось: MessageBox (0, 'Окно не создалось!', 'Ошибка', MB_OK Or MB_ICONHAND) Else Begin ShowWindow (HWnd, SW_SHOWNORMAL); // Показывем окно UpdateWindow(HWnd); // Перерисовываем окно {Запускаем цикл жизни программы} While GetMessage(Msg, 0, 0, 0) Do // Эта функция извлекает очередное сообщение из очереди сообщений, вернет 0 только если попадется сообщение WM_QUIT Begin TranslateMessage(Msg); // Переводит нажатия клавиш, чтобы их можно было обработать оконной процедуре DispatchMessage(Msg); // Отправляем мессагу оконной процедуре End; Halt(Msg.WParam); // Завершение работы при получении мессаги WM_QUIT (при выходе из цикла жизни программы) End; End; End; Begin InitCommonControls; // Для поддержки нового стиля Windows XP WinMain; // Вот и вся программа! :) End.
|
|