Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Создание Форм в Delphi без VCL: Примеры Использования CreateWindow и Windows API

Delphi , Синтаксис , Справочник по API-функциям

Создание Форм в 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Справочник по API-функциям ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2024-12-26 14:06:33/0.0033891201019287/0