| ||||||||||||||||
![]() | ||||||||||||||||
| ||||||||||||||||
![]() | ||||||||||||||||
| ||||||||||||||||
![]() |
Создание окна средствами API Введение Пришла пора начать цикл статей по пограммированию, с использованием API. Надоело, знайте ли, создавать малофункциональные программы с огромным объемом. Проблема решилась одним из возможных способов- писать напрямую, через API. "Что это значит",- спросит неопытный читатель. А значит это следующее: вы не используйте никаких классов VCL, всё создаете сами!!! Program Name; uses MyUnit; {$R *.RES} {По этой директиве в ваш проект будет включен ресурсный файл, где вместо * быдет имя вашего проекта} {$R NameRes.RES} {Другие файлы ресурсов с явным указанием имени} const MyConst=0; {Ваши константы} var MyVar:integer; {Ваши переменные} {Здесь находится описание и реализаия ваших функций} begin ..... {код программы} end; Таков вид вашего проекта. Теперь давайте перейдем к показу пробного окошка.Для этого нам надо будет вставить некоторый код между begin и end; Показ окна Чтобы показаь окно нужно изучить несколько функций: Прием сообщений
Прием сообщений осуществляется с помощью нескольких функций:GetMessage(); TranslateMessage(); DispatchMessage(); DefWindowProc(); HWND-дискриптор окна, который вы получили после использования функции CreateWindow() uMsg - это и есть код сообщения (16 бит)(имеет место выражение типа: if uMsg=WM_CLOSE then) WPARAM,LPARAM - параметры, которые передаются вместе с сообщением.(16 бит) В функции WindowProc полезно использовать оператор case (swith- на C++) в этом случае в разделе else (default на C++) нужно написать функцию DefWindowProc(), которая не имеет параметров. Это функция удаляет все остальные сообщения, которые были получены, но не были обработаны. После того, как эта функция описана, её имя занесено в структуру WNDCLASS, и показкно окно, нужно написать следуйщий код: while GetMessage(Msg, 0, 0, 0) do begin TranslateMessage(Msg); DispatchMessage(Msg); end; Где HWnd -дискриптор окна, который вы получили после использования функции CreateWindow(). Пример program Dir; uses Windows, Messages, shellapi; const sClassName = 'sTaskBarHandlerWindow'; // Имя класса окна 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. |
|
![]() | ||||||||||||||||
| ||||||||||||||||
![]() | ||||||||||||||||
|