Порожнє вікно на Win API, Різне, Програмування, статті

Содержание:
1. Введення.
2. Функція CreateWindowEx.
3. Функція ShowWindow.
4. Структура типу TWndClassEx.
5. Обробка повідомлень в Win API.
6. Оригінальний текст програми.
7. Розмір програми на Win API.
8. Висновок.
 

 

Програма на Win API

1. Введення

Програми написані на Win API мають більшу продуктивність і невеликий розмір. За допомогою функцій Win API можна отримати доступ до різних об’єктів Windows. З цієї статті ви дізнаєтеся як створити вікно на чистому Win API. Дізнаєтеся, як працюють програми в Windows. Помітите який розмір має програма на Win API і програма з VCL.

2. Функція CreateWindowEx

Створює вікно із заданими властивостями.
Функція CreateWindowEx виглядає так:

function CreateWindowEx(
dwExStyle: DWORD;
lpClassName: PChar;
lpWindowName: PChar;
dwStyle: DWORD;
X, Y, nWidth, nHeight: Integer;
hWndParent: HWND;
hMenu: HMENU;
hInstance: HINST;
lpParam: Pointer
): HWND;

Параметри CreateWindowEx:

dwExStyle – визначає розширений стиль вікна, може бути комбінацією (за допомогою оператора or):
– WS_EX_ACCEPTFILES – на вікно можна перетягувати файли з Провідника, коли користувач опускає на вікно з таким стилем файли, надсилається повідомлення WM_DROPFILES;
– WS_EX_APPWINDOW – на панелі завдань для вікна з таким стилем з’являється кнопка;
– WS_EX_CLIENTEDGE – навколо клієнтської частини буде рамка, причому клієнтська частина буде утиснений всередину;
– WS_EX_CONTEXTHELP – в заголовку вікна з’явиться кнопка контекстної допомоги, це прапор не може використовуватися одночасно з WS_MAXIMIZEBOX і WS_MINIMIZEBOX;
– WS_EX_CONTROLPARENT;
– WS_EX_DLGMODALFRAME;
– WS_EX_LEFT;
– WS_EX_LEFTSCROLLBAR;
– WS_EX_LTRREADING;
– WS_EX_MDICHILD;
– WS_EX_NOINHERITLAYOUT;
– WS_EX_NOPARENTNOTIFY;
– WS_EX_OVERLAPPEDWINDOW;
– WS_EX_PALETTEWINDOW;
– WS_EX_RIGHT;
– WS_EX_RIGHTSCROLLBAR;
– WS_EX_RTLREADING;
– WS_EX_STATICEDGE;
– WS_EX_TOOLWINDOW – створюється вікно з маленьким заголовком, як у панелі інструментів;
– WS_EX_TOPMOST – створюване вікно буде перебувати поверх інших;
– WS_EX_TRANSPARENT;
– WS_EX_WINDOWEDGE.

Визначення інших констант ви зможете знайти в довідці по win32api.

lpClassName – Ім’я класу вікна. Ви можете створювати свої класи за допомогою функції RegisterClassEx або використовувати зумовлені: edit, button, static, scrollbar, combobox та інші;
lpWindowName – текст, який з’явиться в заголовку вікна (якщо вікно із заголовком), на кнопці (якщо клас вікна button), в полі введення тексту (якщо клас вікна edit);
dwStyle – список основних стилів вікна. Містить кілька наступних констант, сполучених оператором or:
– WS_BORDER – вікно буде мати тонку рамку;
– WS_CAPTION – вікно матиме заголовок;
– WS_CHILD або WS_CHILDWINDOW – вікно буде дочірнім, тобто цілком розташовуватися усередині деякого іншого вікна;
– WS_CLIPCHILDREN – площа займана дочірніми вікнами не буде перемальовувати;
– WS_CLIPSIBLINGS – перемальовування одного дочірнього вікна не впливає на інші;
– WS_DISABLED – вікно створюється недоступним, його можна розблокувати за допомогою функції EnableWindow;
– WS_DLGFRAME – створюється вікно з рамкою як у діалогових вікон;
– WS_GROUP – для дочірнього вікна (зі стилем WS_CHILD) визначає перший елемент в групі, при натисканні на Tab саме він отримає фокус, група тягнеться до наступного дочірнього вікна з тим же стилем, усередині групи можна переміщатися за допомогою клавіш управління курсором;
– WS_HSCROLL – створюється вікно з горизонтальною смугою прокрутки;
– WS_ICONIC або WS_MINIMIZE – створюване вікно спочатку мінімізоване;
– WS_MAXIMIZE – створюване вікно спочатку максимізована;
– WS_MAXIMIZEBOX – створюване вікно має кнопку максимізації;
– WS_MINIMIZEBOX – створюване вікно має кнопку мінімізації;
– WS_OVERLAPPED – створюється перекривається вікно, має заголовок і рамку;
– WS_OVERLAPPEDWINDOW – комбінація прапорів WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX і WS_MAXIMIZEBOX;
– WS_POPUP – створюється вікно не має спочатку рамки і заголовка, не може використовуватися із стилем WS_CHILD;
– WS_SIZEBOX або WS_THICKFRAME – створюється вікно, розмір якого можна змінювати;
– WS_SYSMENU – створюється вікно із значком системного меню, повинен вживатися з прапором WS_CAPTION;
– WS_TABSTOP – створюється дочірнє вікно, яке може отримувати фокус введення при натисненні на Tab;
– WS_TILEDWINDOW – комбінація прапорів WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX і WS_MAXIMIZEBOX;
– WS_VISIBLE – створюється вікно, яке спочатку мабуть. Якщо ви не вкажете це прапор для вікна, то ви його ніколи не побачите (якщо тільки не скористаєтеся функцією ShowWindow);
– WS_VSCROLL – створюване вікно матиме вертикальну смугу прокрутки;
– X – горизонтальна координата верхнього лівого кута вікна; якщо ви хочете надати windows можливість розташувати вікно за умовчанням, вкажіть тут CW_USEDEFAULT, в цьому випадку наступний параметр ігнорується;
– Y – вертикальна координата верхнього лівого кута вікна.

nWidth – ширина вікна (в одиницях пристрою, для монітора – в пікселах), якщо ви хочете надати Windows вибрати положення вікна, то виставите тут CW_USEDEFAULT, в цьому випадку наступний параметр ігнорується;
nHeight – висота вікна (в одиницях пристрою, для монітора – в пікселах);
hWndParent – описувач батьківського вікна, якщо вікно створюється із стилем WS_CHILD, то тут обов’язково долден стояти коректний описувач;
для дочірнього вікна (з прапором стилю WS_CHILD) визначає ідентифікатор цього дочірнього вікна, для звичайного вікна визначає описувач головного меню вікна (якщо дорівнює нулю, то використовується меню з визначення класу вікна);
hInstance – описувач додатку, з яким вікно зв’язується (для Windows NT/2000/XP ігнорується);
lpParam – покажчик на що-небудь, він передається в повідомленні WM_CREATE при створенні вікна, і в ньому можуть бути переправлені які-небудь дані для копії вікна.

3. Функція ShowWindow

Ця функція показує або ховає вікно.
function ShowWindow(
hWnd: HWND;
nCmdShow: Integer
): BOOL;

Параметри функції:
hWnd – Описувач потрібного вікна;
nCmdShow – Константа, що визначає, що буде зроблено з вікном:
– SW_HIDE – вікно буде приховано;
– SW_SHOWNORMAL – вікно буде показано і активоване, якщо вікно було мінімізоване або максимізувати, то воно буде відновлено у вихідну позицію і розмір;
– SW_SHOWMINIMIZED – активізує і згортає (мінімізує) вікно;
– SW_SHOWMAXIMIZED – активізує і максимізує вікно;
– SW_MAXIMIZE – максимізує вікно;
– SW_SHOWNOACTIVATE – те ж саме, що SW_SHOWNORMAL, тільки вікно не активізується;
– SW_SHOW – відображає вікно в його поточній позиції;
– SW_MINIMIZE – мінімізує вікно і активізує наступне по Z-списку;
– SW_SHOWMINNOACTIVE – те ж саме, що і SW_SHOWMINIMIZED, тільки вікно не активізується;
– SW_SHOWNA – те ж саме, що SW_SHOW, тільки вікно не активізується;
– SW_RESTORE – відновлює вікно з максимізована або мінімізованого стану;
– SW_SHOWDEFAULT – відображає вікно так, як воно було відображено при старті відповідного застосування;
– SW_MAXIMIZE – максимізує вікно.

4. Структура типу TWndClassEx

Структура типу TWndClassEx має наступний вигляд:
tagWNDCLASSEXA = packed record
cbSize: UINT;
style: UINT;
lpfnWndProc: TFNWndProc;
cbClsExtra: Integer;
cbWndExtra: Integer;
hInstance: HINST;
hIcon: HICON;
hCursor: HCURSOR;
hbrBackground: HBRUSH;
lpszMenuName: PAnsiChar;
lpszClassName: PAnsiChar;
hIconSm: HICON;
end;

5. Обробка повідомлень в Win API

Повідомлення – інформація про деяку зміну в призначеному для користувача інтерфейсі, наприклад переміщення вікна або натиснення клавіші на клавіатурі. Повідомлення також можуть розсилатися іншими додатками.

Цикл обробки повідомлень виглядати так:
while GetMessage(Mmsg,0,0,0) do
begin
TranslateMessage(Mmsg);
DispatchMessage(Mmsg);
end;

TranslateMessage – ця функція переводить повідомлення віртуальних клавіш в символьні повідомлення.
DispatchMessage – ця функція повідомлення віконного обробникові подій.
В якості віконного обробника подій служить функція WindowProc.

6. Оригінальний текст програми

З теорією ми розібралися, давайте приступимо до реалізації нашої ідеї “Зробити вікно на Win API”.

1. Запускаємо Delphi. З’явиться порожнє вікно.
2. Project – View Source.
3. Видаляємо все окрім: Program, Uses, Var, Begin, End.
4. Пишемо код.

Program Api;
uses
windows, messages;
var
window:TWndClassEx;
Mwindow: HWND;
Mmsg: MSG;

/ / Процедура обробки повідомлень
function WindowProc (wnd: HWND; msg: integer; wparam: WPARAM; lparam: LPARAM):LRESULT;STDCALL;
begin
case msg of
WM_Destroy:
begin
PostQuitMessage (0);
Result := 0;
Exit;
end;
else
Result := DefWindowProc(wnd,msg,wparam,lparam);
end;
end;

/ / Рістрація класу вікна
begin
window.cbSize := sizeof (window);
window.style := CS_HREDRAW or CS_VREDRAW;
window.lpfnWndProc := @WindowProc;
window.cbClsExtra := 0;
window.cbWndExtra := 0;
window.hInstance := HInstance;
window.hIcon := LoadIcon (0,IDI_APPLICATION);
window.hCursor := LoadCursor (0,IDC_ARROW);
window.hbrBackground:=Color_BtnFace+12;
window.lpszMenuName := nil;
window.lpszClassName := “Main_Window”;
RegisterClassEx (window);
/ / Створення вікна на основі створеного класу
Mwindow := CreateWindowEx(0,”Main_Window”,”First_WinAPI_Programm”, WS_OVERLAPPEDWINDOW,100,100,300,300,0,0,Hinstance,nil);
/ / Показати створене вікно
SHOWWINDOW (Mwindow,SW_Show);
/ / Цикл обробки повідомлень
while GetMessage (Mmsg,0,0,0) do
begin
TranslateMessage (Mmsg);
DispatchMessage (Mmsg);
end;
end.

7. Розмір програми на Win API

Тепер коли програма у нас готова. Компілюємо і запускаємо програму. З’явиться віконце синього кольору.
Дізнаємося розмір додатку. Для цього заходимо в меню Project – Information for “ім’я програми”.
Дивимося, розмір файлу (File size) дорівнює 8704 байт. або 8,5 кілобайт. Тепер запускаємо створюємо новий додаток.
Компілюємо і запускаємо. Заходимо в меню Project – Information for “ім’я програми”.
Дивимося, розмір файлу (File size) дорівнює 359 454 байт або 351 кілобайт.
Ви побачили, що порожня форма на Win API має набагато менший розмір ніж з VCL.

8. Висновок

Писати великі програми на чистому Win API дуже складно, хоча вони і мають маленький розмір. Але з використанням функцій Win API можна отримати доступ до різних об’єктів Windows. Win API може здатися складним для початківців програмістів, але не варто бояться. Вивчайте, виправляйте помилки, не зупиняйтеся на половині шляху. Якщо у вас, що щось не виходить то не зупиняйтеся, шукайте шляхи вирішення.
Сподіваюся, що цей матеріал допоможе вам в першому знайомстві з Win API.
 

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


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

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

Ваш отзыв

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

*

*