Создание Форм в Delphi без VCL: Примеры Использования CreateWindow и Windows API
Вопрос пользователя заключается в необходимости создания формы в Delphi, не используя VCL, а только с помощью функций Windows API, таких как CreateWindow. Это может быть полезно, например, для создания диалоговых окон, которые должны быть доступны из потоков, отличных от основного потока приложения, где VCL использовать нельзя.
Пример кода для создания окна с использованием Windows API:
uses
Windows,
Messages,
SysUtils;
var
Msg: TMsg;
LWndClass: TWndClass;
hMainHandle: HWND;
hButton, hStatic, hEdit, hFontText, hFontButton: HWND;
procedure ReleaseResources;
begin
DestroyWindow(hButton);
DestroyWindow(hStatic);
DestroyWindow(hEdit);
DeleteObject(hFontText);
DeleteObject(hFontButton);
PostQuitMessage(0);
end;
function WindowProc(hWnd, Msg: Longint; WParam, LParam: Longint): Longint; stdcall;
begin
case Msg of
WM_COMMAND: if LParam = hButton then
MessageBox(hMainHandle, 'You pressed the button Hello', 'Hello', MB_OK or MB_ICONINFORMATION);
WM_DESTROY: ReleaseResources;
end;
Result := DefWindowProc(hWnd, Msg, WParam, LParam);
end;
begin
// Инициализация класса окна
LWndClass.hInstance := hInstance;
with LWndClass do
begin
lpszClassName := 'MyWinApiWnd';
Style := CS_PARENTDC or CS_BYTEALIGNCLIENT;
hIcon := LoadIcon(hInstance, 'MAINICON');
lpfnWndProc := @WindowProc;
hbrBackground := COLOR_BTNFACE + 1;
hCursor := LoadCursor(0, IDC_ARROW);
end;
RegisterClass(LWndClass);
hMainHandle := CreateWindow(LWndClass.lpszClassName, 'Window Title', WS_CAPTION or WS_MINIMIZEBOX or WS_SYSMENU or WS_VISIBLE,
(GetSystemMetrics(SM_CXSCREEN) div 2) - 190,
(GetSystemMetrics(SM_CYSCREEN) div 2) - 170, 386, 200, 0, 0, hInstance, nil);
// Создание шрифтов
hFontText := CreateFont(-14, 0, 0, 0, 0, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, VARIABLE_PITCH or FF_SWISS, 'Tahoma');
hFontButton := CreateFont(-14, 0, 0, 0, 0, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, VARIABLE_PITCH or FF_SWISS, 'Tahoma');
// Создание статического текста
hStatic := CreateWindow('Static', 'This is static text, like a TLabel', WS_VISIBLE or WS_CHILD or SS_LEFT, 10, 10, 360, 44, hMainHandle, 0, hInstance, nil);
SendMessage(hStatic, WM_SETFONT, hFontText, 0);
// Создание поля ввода
hEdit := CreateWindowEx(WS_EX_CLIENTEDGE, 'Edit', 'This is an Edit like a TEdit', WS_VISIBLE or WS_CHILD or ES_LEFT or ES_AUTOHSCROLL, 10, 35, 360, 23, hMainHandle, 0, hInstance, nil);
SendMessage(hEdit, WM_SETFONT, hFontText, 0);
// Создание кнопки
hButton := CreateWindow('Button', 'Hello', WS_VISIBLE or WS_CHILD or BS_PUSHBUTTON or BS_TEXT, 10, 130, 100, 28, hMainHandle, 0, hInstance, nil);
SendMessage(hButton, WM_SETFONT, hFontButton, 0);
// Цикл обработки сообщений
while GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end.
Пример использования Threaded Splashscreen:
unit PBThreadedSplashscreenU;
interface
uses
Windows, SysUtils, Classes, Graphics, Controls, StdCtrls, CommCtrl, Types;
type
TPBThreadedSplashscreen = class(TComponent)
// Описание компонента и его свойств
end;
procedure Register;
implementation
uses
Messages, SyncObjs, Types;
type
TPBSplashThread = class(TThread)
// Описание класса потока
end;
procedure Register;
begin
RegisterComponents('PBGoodies', [TPBThreadedSplashscreen]);
end;
procedure TPBThreadedSplashscreen.Create(AOwner: TComponent);
begin
inherited;
// Инициализация компонента
end;
procedure TPBThreadedSplashscreen.Show;
begin
// Показать поток
end;
procedure TPBThreadedSplashscreen.Hide;
begin
// Скрыть поток и очистить ресурсы
end;
procedure TPBThreadedSplashscreen.ShowStatusMessage(const msg: String);
begin
// Показать сообщение в статус-баре
end;
procedure TPBSplashThread.CreateSplashWindow;
begin
// Создать окно потока
end;
procedure TPBSplashThread.WMCreate(var msg: TWMCreate);
begin
// Обработка сообщения WM_CREATE
end;
procedure TPBSplashThread.WMEraseBkGnd(var msg: TWMEraseBkGND);
begin
// Отрисовка окна
end;
procedure TPBSplashThread.CenterSplashScreen;
begin
// Центрировать окно
end;
procedure TPBSplashThread.Execute;
begin
// Основной цикл потока
end;
procedure TPBSplashThread.UpdateContent(sender: TObject);
begin
// Обновить содержимое окна
end;
procedure TPBSplashThread.WndProc(var msg: TMessage);
begin
// Обработчик сообщений окна
end;
procedure TPBSplashThread.DefaultHandler(var Message);
begin
// Обработчик по умолчанию
end;
procedure TPBThreadedSplashscreen.ContentChanged( sender: TObject );
begin
// Событие изменения содержимого
end;
end.
Эти примеры демонстрируют, как можно создать пользовательский интерфейс в Delphi, используя только функции Windows API, без использования VCL. Это может быть полезно для создания диалоговых окон, которые должны быть доступны из потоков, отличных от основного потока приложения, где VCL не поддерживает многопоточность, или для создания легковесных GUI приложений, где использование VCL не требуется.
Компоненты для создания пользоваских элементов управления и окон в Delphi с помощью низкоуровневых API Windows, без применения Visual Component Library (VCL).
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.