Компютърни програми - Ваньо Георгиев

 начало   новости   контакт   дарения 


e-mail:  

Получаване на ключ


Изучаване на машинопис
Компютърна Библия нова версия

Други безплатни програми


Сайтове
За образование

Online правописен речник
Физика
Статии


Интернет връзки
Благотворителност

Кажете на приятел

Google

 

Програмиране с Windows API на Delphi

Windows API (application programming interface) представлява съвкупност от средства за създаване на потребителски интерфейс на програми, предназначени за различните версии на операционната система Windows на Microsoft.

Обикновено в Delphi средствата от Windows API не се използват директно, защото е значително по-лесно и бързо да се създават програми чрез библиотеката от визуални елементи VCL. Но ако желаем да напишем изключително малка и бърза програма, ще се наложи да прибегнем до Windows API.

Ето как на Delhpi може да се напише една много проста програма чрез средства от Windows API.

От менюто на Delphi: File -> New application създайте проект за нова програма.

Чрез менюто: Project -> Remove from project изтрийте създадения автоматично Unit1.

Отворете файла с кода на проекта: Project -> View source. Това е единствения файл, който е необходим за нашата програма.

В Delphi достъп до средствата от Windows API се получава чрез използване на модулите windows и messages, затова в Uses декларацията напишете:

uses windows, messages;

Изтрийте реда {$R *.RES}, както и редовете между begin и end, защото там ще напишем друго.

Всяка програма за Windows създава връзка (интерфейс) с потребителя посредством един главен прозорец. Ето защо програмата трябва:
- да заяви пред операционната система какъв клас прозорец ще използва,
- да поиска да се създаде прозорец от този клас,
- да влезе в цикъл за получаване и обработка на съобщения.

Класът на един прозорец се описва чрез променлива от тип WNDCLASS, затова преди begin напишете декларация:

var wc:WNDCLASS;

Програмата първо трябва да присвои стойности поне на някои от полета на структурата wc, затова след begin напишете следните редове:

( 1 ) 	wc.lpfnWndProc  :=@WProc;
        wc.lpszClassName:='MyWCName';
        wc.hInstance    := MainInstance;
        wc.hbrBackground:= 1;

В първия от горните редове, е употребен необявен още идентификатор WProc. Това е идентификатор на функцията за приемане на системни съобщения, към която Windows ще изпраща съобщенията, отнасящи се за прозорците от дадения клас. Ние трябва да напишем такава функция и да присвоим указател към нея в полето lpfnWndProc на структурата wc.

Под Uses декларацията напишете следната функция:

function WProc(hwnd:HWND; msg:Cardinal;
wParam,lParam:Integer): Integer; stdcall;
begin
  Result:= 0;
  case msg of
  WM_DESTROY: PostQuitMessage(0);
  else Result:= DefWindowProc(hwnd, msg, wParam, lParam);
  end;
end;

В тази функция задаваме как да реагира програмата на различни системни съобщения. Функцията трябва да обработва специално само тези съобщения, които е необходимо, а всички останали да обработва чрез стандартната процедура на Windows DefWindowProc. В случая се обработва само съобщението WM_DESTROY, като при получаване на това съобщение с процедурата PostQuitMessage се изпраща системно съобщение за прекратяване на програмата.

Така описаният чрез променливата wc клас на прозорец, трябва да се регистрира. След редовете ( 1 ) напишете:

RegisterClass(wc);

Създаването на прозорец от регистрирания клас се извършва чрез функцията: CreateWindow. Напишете следното:

CreateWindow(wc.lpszClassName,
	'My First Application',
	WS_OVERLAPPEDWINDOW or WS_VISIBLE,
	10,10,300,300, 0, 0, MainInstance, nil);

След създаване на прозорец програмата трябва да влезе в цикъл за обработка на системни съобщения. В най-прост вид този цикъл изглежда така:

while GetMessage(msg, 0, 0, 0) do DispatchMessage(msg);

Разбира се, променливата msg трябва да се прибави към var декларацията msg:TMsg.

И така, целият код на написаната до тук програма трябва да изглежда така:

program Project1;

uses windows, messages;

function WProc(hwnd:HWND; msg:Cardinal;
  wParam,lParam:Integer): Integer; stdcall;
begin
  Result:= 0;
  case msg of
    WM_DESTROY: PostQuitMessage(0);
  else
    Result:= DefWindowProc(hwnd, msg, wParam, lParam);
  end;
end;

var wc:WNDCLASS; msg:TMsg;

begin
  wc.lpfnWndProc:=@WProc;
  wc.lpszClassName:='MyWCName';

  wc.hInstance:=MainInstance;
  wc.hbrBackground:=1;

  RegisterClass(wc);

  CreateWindow(wc.lpszClassName,
    'My First Application',
    WS_OVERLAPPEDWINDOW or WS_VISIBLE,
    10,10,300,300, 0, 0, MainInstance, nil);

  while GetMessage(msg, 0, 0, 0) do DispatchMessage(msg);

end.

Ако компилирате и стартирате тази програма ще видите един прозорец, който има типичното за Windows поведение – може да се мести, уголемява или намалява, да се сваля на лентата с бутони и да се издига отново и т.н.

При това, ако проверите големината на получения exe файл, ще видите, че тя е само 16к докато същата проста програма направена с VCL библиотеката на Delphi се получава с размер 276к.

Икономията е збележителна, нали?


Страница на българската Moodle общност
Bulgarian Moodle

 

Статии

GTK+
MathML
Български правопис във FireFox
MiKTeX
MinGW и MSYS
Perl
Python
Qt
RSS
Windows API в Delphi
WiX
wxWidgets

 
Вижте класирането
на този сайт в:
Гласувай за тази страница в BGTop.net
Гласувай за тази страница в Българския ТОП

 
.: Последна промяна: 21 януари 2018 г. | Мнения за тази страница :.


Моля, не се колебайте да казвате своето мнение за този сайт и представените програми, или да давате предложения.
Страниците на сайта са редактирани с VGEdit 1.0
Copyright © 2004-2023 Vanyo Georgiev