Тема: Hello, World
Показать сообщение отдельно
  #3  
Старый 14.03.2011, 08:41
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

вообще-то 1 и 2 способы идентичны - они используют всю мощь VCL. из-за этого теряют в размере. на самом деле вот следующий способ, наиболее "многотекстный", но наиболее "малоразмерный" (exe = 15Кб):
Код:
program CreateWindow;

uses
  Windows, Messages;

var
  AWndClass: WNDCLASS;
  AWnd: HWND;
  AMsg: TMsg;

function WindowProc(AWnd: HWND; Msg: Integer; wParam: WPARAM; lParam: LPARAM): Longint; stdcall;
begin
  case Msg of
    WM_CREATE: begin
      Windows.CreateWindow('STATIC', 'Hello, world', WS_CHILD+WS_VISIBLE, 10,  10, 100, 40, AWnd, 0, HInstance, nil);
      Result:=0;
    end;
    WM_DESTROY: begin
      Result:=0;
    end;
    WM_CLOSE: begin
      PostQuitMessage(0);
      Result:=0;
    end;
    else Result:=DefWindowProc(AWnd, Msg, wParam, lParam);
  end
end;

begin
  AWndClass.Style:=CS_HREDRAW or CS_VREDRAW;
  AWndClass.lpfnWndProc:=@WindowProc;
  AWndClass.cbClsExtra:=0;
  AWndClass.cbWndExtra:=0;
  AWndClass.hInstance:=HInstance;
  AWndClass.hIcon:=0;
  AWndClass.hCursor:=LoadCursor(0, IDC_ARROW);
  AWndClass.hbrBackground:=HBRUSH(COLOR_WINDOW);
  AWndClass.lpszMenuName:=nil;
  AWndClass.lpszClassName:='TWINAPIFORM';
  RegisterClass(AWndClass);
  AWnd:=CreateWindowEx(
    0,
    AWndClass.lpszClassName,
    AWndClass.lpszClassName,
    WS_OVERLAPPEDWINDOW,
    Integer(CW_USEDEFAULT),
    Integer(CW_USEDEFAULT),
    320,
    120,
    0, 0,
    HInstance,
    nil);
  SetWindowText(AWnd, 'MyWinAPIForm');
  ShowWindow(AWnd, SW_SHOWNORMAL);
  UpdateWindow(AWnd);
  while GetMessage(AMsg, 0, 0, 0) do begin
    TranslateMessage(AMsg);
    DispatchMessage(AMsg);
  end;
  DestroyWindow(AWnd);
  UnregisterClass(AWndClass.lpszClassName, HInstance);
  ExitProcess(0);
end.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием