Среди функций API системы Windows есть много схожих по назначению, но различных по возможностям. Например, для копирования растрового изображения (картинки) в контексте устройства есть две основные функции - BitBI t и Stretch-Bit. С помощью обеих функций можно вывести изображение на контекст окна, но с разной скоростью.

Функция BitBIt копирует битовый массив растрового изображения в указанную область по определенным правилам. Функция StretchBlt делает то же самое, но в дополнение умеет еще и масштабировать изображение во время копирования. Из-за того что вторая функция имеет больше возможностей, некоторые программисты (особенно начинающие) стараются использовать ее. Зачем? А просто на всякий случай.

Масштабирование - достаточно трудоемкий процесс для процессора, поэтому StretchBlt выполняется намного дольше BitBIt. Нет смысла расходовать драгоценные такты процессорного времени, когда вам абсолютно не нужны возможности той функции, которую вы решили использовать.

Если для выполнения определенного действия в ОС есть несколько функций, то используйте ту функцию, которая решает поставленную задачу быстрее остальных. Не надо делать задел на то, что может и не понадобится. А если в будущем вам все же нужно будет масштабировать растровое изображение, заменить функцию несложно.

В Delphi очень много функций, которые являются надстройками для функций Win API. Например, в объекте TAppl i cati on есть функция MessageBox, которая описывается следующим образом:

function MessageBox(const Text, Caption: PChar;

Flags: Longint = МВ_0К): Integer:

Среди функций Win API есть одноименная, но она описывается иначе:

function MessageBox(hWnd: HWND: lpText, lpCaption: PChar;
uType: UINT): Integer;
stdcall:

Они выполняют одни и те же действия, разница состоит в том, что в функции Win API добавлен параметр hWnd, в котором указывается главное окно для окна сообщения.

Рассмотрим, как выглядит функция MessageBox, которая входит в объект TAppl i -cation (листинг 2.9).

Листинг 2.9. Реализация функции MessageBox в объекте TApplication

function TApplication.MessageBox(const Text. Caption. PChar:
Flags: Longint): Integer.
var
ActiveWindow: HWnd: WindowList: Pointer;
MBMonitor. AppMonitor: HMonitor;
Monlnfo: TMonitorlnfo: Rect: TRect:
FocusState: TFocusState. begin
ActiveWindow := GetActiveWindow;
MBMonitor := MonitorFromWindowCActiveWindow. M0NIT0RJ3EFAULTT0NEAREST);
AppMonitor .= MonitorFromWindow(Handle. MONITOR_DEFAULTTONEAREST): if MBMonitor <>
AppMonitor then begin
Monlnfo.cbSize := Sizeof(TMonitorlnfo): GetMonitorInfo(MBMonitor. @MonInfo): GetWi ndowRect(Handle. Rect);
SetwindowPos(Handle. 0.
Monlnfo.rcMonitor.Left + ((Monlnfo.rcMonitor.Right -
Monlnfo.rcMonitor.Left) div 2).
Monlnfo.rcMonitor.Top + ((Monlnfo rcMonitor.Bottom -
Monlnfo.rcMonitor.Top) div 2). 0. 0. SWP_NOACTIVATE or SWPJOREDRAW or SWPJOSIZE or SWPJOZORDER).
end:
WindowList := DisableTaskwindows(O);
FocusState .= SaveFocusState: - if UseRightToLeftReading then Flags .= Flags or MB_RTLREADING, try
Result := Windows.MessageBox(Handle. Text. Caption, Flags);
finally
if MBMonitor <>
AppMonitor then SetWindowPos(Handle, 0, Rect Left + ((Rect.Right - Rect Left) div 2).
Rect.Top + ((Rect.Bottom - Rect.Top) div 2).
0. 0. SWPJOACTIVATE or SWPJOREDRAW or SWP_NOSIZE or SWP_N0Z0RDER);
EnableTaskWindows(Wi ndowLi st);
SetActi veWi ndow(Acti veWi ndow): RestoreFocusState(FocusState);
end;
end:

Самое главное находится в вызове функции MessageBox из Win API:

Result := Windows.MessageBox(Handle, Text, Caption, Flags);

Все остальное - это дополнительные проверки и определение главного окна Зачем вызывать этот вариант, когда дополнительные проверки в большинстве случаев не нужны, а главное окно мы и так можем определить. Некоторые программисты даже не определяют окно, а просто указывают в качестве параметра hWnd нулевое значение, ведь на ход работы программы это практически не влияет В Delphi есть функции для поиска файлов (FindFi rst, FindNext, FindClose), которые являются надстройками функций Win API, имеющих аналогичные названия и предназначения. Если посмотреть на методы рисования объекта TCanvas, то все они также будут надстройками. Такие функции улучшают код и упрощают программирование, но замедляют работу лишними проверками.

Для повышения производительности лучше использовать варианты функций Win API. Для достижения универсальности кода (программа будет компилироваться в Kylix под Linux) применяются варианты, предоставляемые Delphi.

В настоящее время наблюдается переход на технологию .NET, и фирма Borland уже подготовила новую среду разработки, которая сможет компилировать старые проекты Win API для .NET. Если вы будете переносить свой проект в .NET, то в этом случае лучше использовать функции из VCL, иначе программа не будет компилироваться не только в Linux, но и в .NET.

В слабых местах программы лучше всего использовать функции Win API или .NET. Переписать их для определенной платформы несложно, исходные коды функций Delphi доступны, и производительность может существенно повыситься.

2.16. Ускорение математических вычислений || Оглавление || 2.18. Эффективное использование ресурсов


Delphi в шутку и всерьез: что умеют хакеры



Новости за месяц

  • Декабрь
    2021
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31