Работа с прозорци в Делфи, използвайки API
Работа с прозорци в Делфи, използващи API.
Защо е нужно всичко това? примерите, представени в тази статия, дават представа за начина, по който Windows-базирано приложение, както и на най-важните понятия на операционната система. Това е едновременно ръководство за действие, както и преглед на най-основните характеристики на API функции. Примерите, представени тук, ясно показват отделните раздели на хартията, и могат да служат като основа, така наречената основа за по-нататъшното продължаване на изследването на идеологията на Windows.
Сега се опитвам да обясня какво ще направи тази програма, но само когато тя прави. В допълнение към например поддиректория Ex01 имаме нужда от още един проект, като само една форма, наречена "Form1", над този проект не трябва да съдържат нищо. Когато се стартира първата ни програма, ще видите форма на бутон "ФОРМА2 '' Button1"
кликнете върху това, получаваме:
Ако изтеглите проекта на форма Form1, а след това кликнете върху Button1 образуват ФОРМА2, получаваме отговор:
Това означава, че при натискане на бутона "BUTTON1", се показва съобщение, дали прозорецът е отворен клас, регистрирана в операционната система като "TForm1", след като удар с глава на "Form1". За да намерите необходимата прозореца ние използваме FindWindow. като два параметъра, първите - прозорците, втора класа - името му, но ако заглавието на желания прозорец безразличен, вторият документ, трябва да настроите нула. или, ако те е грижа за този клас, а след това следва да се определи нулев. например: FindWindow (нула, Winamp); В този случай, функцията ще търси един прозорец с името на Winamp, че няма значение какво е клас, а не се грижи за произхода на прозореца, независимо дали това е проект, DELPHI, или Internet Explorer, или Notepad. FindWindow функция връща стойността в отговор на вида на HWND - препратка към намери прозореца, или нула, ако прозорецът не е намерен.
В нашия пример, ние определяме променлива Н, като HWND. да се равнява стойността му да функционира FindWindow. Трябва да се отбележи, че името на формата в проекта DELPHI е важно не само по време на проектирането, но и по време на заявлението. Ако започнете нов проект, наречен форма някои много дълго име и съставяне на проекта и след това да сравните размера на компилиран модулът на размера на първия проект, ние виждаме, че тя се е увеличила - увеличава само за сметка на дълго име на класа. Трябва също да се отбележи, че е желателно да се обадите форма, различна от стойностите, дадени по подразбиране DELPHI.
Прозорецът може. без фокус, получавате съобщения и отговори на тях. Един пример за това е поддиректория Ex02
процедура TForm2.FormMouseMove (Sender: TObject; Shift: TShiftState; X, Y: цяло число);
започвам
Заглавие: = 'х =' + IntToStr (X) + ', у =' + IntToStr (Y)
приключи;
Когато се движи курсора на мишката формират титлата резултатите от дейността си координати.
Работещи две копия на програмата, ние отбелязваме, че кутията е без фокус, т.е. неактивни, също реагира на движението на показалеца на повърхността си и изходи към заглавната част на текущите координати на курсора в координатна система. С позоваване на прозореца, приложението може да изпълнява с всичко (почти) действието, чрез изпращане на съобщения до него. поддиректория Процедурата по Ex03 належаща, изменя, както следва:
процедура TForm2.Button1Click (Sender: TObject);
Var
H. HWND;
започвам
Н = FindWindow ( "TForm1", "Form1 ');
Ако Н <> 0, тогава SendMessage (Н, WM_CLOSE, 0, 0)
приключи;
Ако има няколко прозорци на класа "TForm1". и необходимостта да се затворят всички от тях автоматично, това се прави в Ex04 следва:
процедура TForm2.Button1Click (Sender: TObject);
Var
H. HWND;
започвам
повторение
Н = FindWindow ( "TForm1", "Form1 ');
Ако Н <> 0, тогава SendMessage (Н, WM_CLOSE, 0, 0)
До H = 0;
приключи;
Как да работят с приложения, които прозорец клас не е известно, тъй като не е нужно да им изходния код? За решаването на тези проблеми е Ws32 полезност. снабден с DELPHI. Аз също трябва да се добави, че, например, за да се минимизира прозореца. прозорец се изпраща съобщение WM_SYSCOMMAND. съответстваща на действието "меню прозорец за избор на системата." параметър на функцията Третият SendMessage е настроен да SC_MINIMIZE. Пример за това е в Ex06.
Защо DELPHI приложения са големи? Минимална prelozhenie създадени в различни версии на DELPHI. Тя може да достигне от 170 до 290 КВ. Големият размер на компилиран приложението е цената, която плащате за невероятен дизайн комфорт. при условие, DELPHI. Архитектура среда за програмиране, на RTTI, компонент подход - всичко това прави DELPHI в изключително мощен инструмент, но не се нуждаят от тези мощни функции за среден клас приложения. В съставен модул съдържа всички код интерфейс входно-изходни елементи. Отърви се от RTTI е невъзможно да се радикално решаване на проблема само като не използва DELPHI клас библиотека. т.е. Програмиране без VCL.
Списъкът показва само използва два модула - Windows и съобщение - само API функции. така че кодът е толкова дълго, че прилича на езика C.
Заключение с GDI
Поддиректория Ex09 може да се изследва със старата формата ФОРМА2. но с нов бутон "правоъгълник". с код натискане процедура:
процедура TForm2.Button2Click (Sender: TObject);
Var
DC. HDC;
започвам
DC: = GetDC (дръжката);
Правоъгълник (DC, 10, 10, 110, 110);
ReleaseDC (дръжка, DC);
DeleteDC (DC);
приключи;
Стартирайте приложението и кликнете върху бутона "правоъгълник". получаваме:
Прозорецът с референтната стойност от нула съответства на прозореца на работния плот. Пример Ex11 показва как да начертаете квадрат на вашия работен плот, няма нужда да се каже какво перспективите то пред нас е:
процедура TForm2.Button2Click (Sender: TObject);
Var
DC. HDC;
започвам
DC: = GetDC (0);
Правоъгълник (DC, 10, 10, 110, 110);
ReleaseDC (дръжка, DC);
DeleteDC (DC);
приключи;
край.
В прозоречната функция проект Ex12 минималната програма допълва обработка WM_PAINT съобщения. Изводът е направен между редовете с извикване на функция BeginPaint и EndPaint а. първият от които се връща препратка към контекст устройство, т.е. ценим тип HDC. изисква да GDI изходни функции. След като използвате връзките трябва да бъдат премахнати в края на работа - това е необходимо за правилното функциониране на заявлението.
Проектът Ex13 ние отново ще се програмира без VCL, предизвикателството е, че когато кликнете два пъти върху левия бутон на мишката показва текущото показалеца позиция. Постоянните cs_DblClks. така, че прозорецът може да реагира на двукратно щракване, и прозорец функция попълва обработка wm_LButtonDblClk съобщение, в което координати на курсора се появява.
Проектът Ex14 създаден манипулатор на едни и същи съобщения в проект DELPHI конвенционален тип. съобщение се посочва, че процедурата е да пресече съобщение, което показва, евристика за думата. Така че, тук е заловено съобщение "Кликнете два пъти върху".
Най-EX15 създаден манипулатор OnDblClick събития
Най-EX16 създаден манипулатор wm_Paint мнения - пребоядисване на прозореца. BeginPaint и EndPaint линии са налице за правилното функциониране на заявлението, когато отстранява, има неприятна трептене, когато прозорецът е преоразмерено.
Работа с таймера
В този раздел, ние обсъждаме как да използвате таймера, само въз основа на функциите на API. Пример за това е проект Ex17, която с течение на времето се променя цвета боядисани кръгове. Първото нещо, което се отбележи, че константите на блокови описват добавя описанието на идентификатора на таймер, както което може да отнеме всяко число:
конст
AppName = 'WinPaint;
id_Timer = 100; // идентификатор на таймера
Идентифициране на таймера е необходимо, тъй като прилагането може да има няколко. За да активирате функцията API taymeraispolzuem SetTimer. където желания интервал таймерът е настроен:
SetTimer (Прозорец, id_Timer, 200, нула); // настроен таймер
Ако програмата използва множество таймери, трябва да бъдат отделени стойност идентификатори предават в wParam. В този пример, всеки прозорец 200 мс е преобразена като се обадите на API InvalidRect функция. Цвят на халба променим:
Четка: = CreateSolidBrush (RGB (случаен (255), произволен (255), произволен (255)));
Както обикновено в Windows, създаване на обекти трябва да бъдат премахнати след употреба, за да не се абсорбира ресурси. За изтриване на таймера KillTimer кол манипулатор wm_Destroy мнения.
KillTimer (Прозорец, id_Timer);
В този преглед на функциите на API работи с прозорци в Делфи завършени.