Создание окна средствами API

Тема в разделе "Delphi", создана пользователем WinHack, 23 ноя 2016.

  1. WinHack
    Создание одного окна средствами API.

    popup-menu-on-button.png
    Код:
    program Project1;
    
    uses
      windows,
      messages;
    
    
    procedure MainPaint(hWindow: HWND; pt: TPaintStruct);
    begin
      SetBkMode(pt.hdc, TRANSPARENT);
      TextOut(pt.hdc, 1, 1, 'Window with API!', 38 );
    end;
    
    procedure MainDestroy(hWindow: HWND);
    begin
      PostQuitMessage(0);
    end;
    
    // Процедура создания главного окна
    
    function MainWndProc(hWindow: HWND; Msg: UINT; WParam: WPARAM;
                         LParam: LPARAM): LRESULT; stdcall; export;
    var
      ps: TPaintStruct;
    begin
      Result := 0;
      case Msg of
        WM_PAINT: begin
          BeginPaint(hWindow, ps);
            MainPaint(hWindow,ps);
          EndPaint( hWindow, ps );
          end;
        WM_DESTROY: MainDestroy(hWindow);
      else begin
        result := DefWindowProc( hWindow, Msg, wParam, lParam );
        exit;
        end;
      end; // case
    end;
    
    // Главная процедура
    
    var
      wc: TWndClass;
      hWindow: HWND;
      Msg: TMsg;
    begin
      wc.lpszClassName   := 'GenericAppClass';
      wc.lpfnWndProc     := @MainWndProc;
      wc.style           := CS_VREDRAW or CS_HREDRAW;
      wc.hInstance       := hInstance;
      wc.hIcon           := LoadIcon(0, IDI_APPLICATION);
      wc.hCursor         := LoadCursor(0, IDC_ARROW);
      wc.hbrBackground   := (COLOR_WINDOW + 1);
      wc.lpszMenuName    := nil;
      wc.cbClsExtra      := 0;
      wc.cbWndExtra      := 0;
      RegisterClass(wc);
      hWindow := CreateWindowEx(WS_EX_CONTROLPARENT or WS_EX_WINDOWEDGE,
                              'GenericAppClass',
                              'API',
                              WS_VISIBLE or WS_CLIPSIBLINGS or
                              WS_CLIPCHILDREN or WS_OVERLAPPEDWINDOW,
                              CW_USEDEFAULT, 0,
                              400,300,
                              0,
                              0,
                              hInstance,
                              nil);
    
       ShowWindow(hWindow, CmdShow);
       UpDateWindow(hWindow);
    // Цикл сообщений
      while GetMessage(Msg, 0, 0, 0) do
      begin
        TranslateMessage(Msg);
        DispatchMessage(Msg);
      end;
      Halt(Msg.wParam);
    end.
    После компиляции этого проекта, исполнимый файл будет весить приблизительно 17KB всего!!!