Створення вікна засобами API, Різне, Програмування, статті

Введення

Прийшла пора почати цикл статей по пограммірованію, з використанням API. Набридло, знайте, чи створювати малофункціональні програми з величезним обсягом. Проблема зважилася одним з можливих способів-писати безпосередньо, через API. “Що це означає”, – запитає недосвідчений читач. А значить це наступне: ви не використовуйте ніяких класів VCL, все створюєте самі!
Якщо хто-небудь вивчав програмування на Паскалі, то він, ймовірно, згадає, що будь-яка програма починається з назви Program Так потрібно робити і на API: ваша програма-це тільки один файл з розширенням *. Dpr (звичайно ви можете підключати до нього як свої, так і інші модулі). Загальний вигляд його повинен виглядати так


Program Name;
uses MyUnit; {$ R *. RES} {З цієї директиви в ваш проект буде включений ресурсний файл, де замість * бидет ім’я вашого проекту}
{$ R NameRes.RES} {Інші файли ресурсів з явним зазначенням імені} const MyConst = 0; {Ваші константи}
var MyVar: integer; {Ваші змінні}
{Тут знаходиться опис і реалізаія ваших функцій}
begin ….. {Код програми}
end;

Такий вид вашого проекту. Тепер давайте перейдемо до показу пробного окошка.Для цього нам треба буде вкласти певний код між begin і end;
Показ вікна

Щоб показати вікно потрібно вивчити кілька функцій:
RegisterClass(); CreateWindow(); ShowWindow();
Всі ці функції мають бути присутніми при створенні будь-якої програми.
Насамперед на шляху створення вікна є регитрации класу вікна, який несе в собі деяку інформацію про вікно. Це робиться за допомогою функції
ATOM RegisterClass(CONST WNDCLASS *lpWndClass), Яка реєструє клас вікна на основі структури WNDCLASS
Після того, як створений клас створюємо на його основі вікно. Це робиться за допомогою функції CreateWindow ()
Після того, як вікно створене, його потрібно показати, що робиться функцією ShowWindow () Хочу зауважити, що цю функцію потрібно застосовувати тільки для батьківського вікна, тобто якщо ваш додаток містить головне вікно і дочірні компоненти, то робиться показ тільки головного вікна.

Прийом повідомлень

Прийом повідомлень здійснюється за допомогою кількох функцій: GetMessage (); TranslateMessage (); DispatchMessage (); DefWindowProc ();
Спочатку-теорія. Повідомлення-це такі коди команд, які посилає ОС додатком, наприклад, WM_CLOSE-це константа, яка містить код повідомлення, яке надсилається програмі, коли користувач натискає кнопку Close. Всі ці константи визначені в модулі Messages.
Отже, щоб організувати отримання повідомлень потрібно в першу чергу написати функцію вікна, тобто функцію, яка бде здійснювати якісь дії у відповідь на повідомлення (найчастіше її назва – WndProc, але ви можете змінювати його на свій розсуд, адреса цієї функції ми заносимо в структуру WNDCLASS: IpfnWndProc: = @ WindowProc). Необхідно правильно описати функцію:
LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
function WindowProc(hWnd: THandle; uMsg, wParam, lParam: Integer): Integer;
stdcall; export;
-Це на паскалі

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.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*