{
   Copyright (c) 1996 by Charlie Calvert
   Modifications by Florian Klaempfl

   Standard Windows API application written in Object Pascal.
   No VCL code included. This is all done on the Windows API
   level.
}

{$APPTYPE GUI}
{$MODE DELPHI}
program WinHello;

uses
   Windows;

const
   AppName = 'WinHello';
   ID_FILE_NEW    = 100;
   ID_FILE_OPEN   = 101;
   ID_FILE_SAVEAS = 102;

type
   TlBarBtn = TTBBUTTON;

var
   hTool : hwnd;
   TlBarBtns : Array [0 .. 5] of TlBarBtn;
   tbab : TBADDBITMAP;


function WindowProc(Window: HWnd; AMessage: UINT; WParam : WPARAM;
                    LParam: LPARAM): LRESULT; stdcall; export;

var
   dc : hdc;
   ps : paintstruct;
   r : rect;
begin
   WindowProc := 0;
   case AMessage of
      wm_Destroy:
      begin
         PostQuitMessage(0);
         Exit;
      end;
   end;
   WindowProc := DefWindowProc(Window, AMessage, WParam, LParam);
end;

{ Register the Window Class }
function WinRegister: Boolean;
var
   WindowClass: WndClass;
begin
   WindowClass.Style := cs_hRedraw or cs_vRedraw;
   WindowClass.lpfnWndProc := WndProc(@WindowProc);
   WindowClass.cbClsExtra := 0;
   WindowClass.cbWndExtra := 0;
   WindowClass.hInstance := system.MainInstance;
   WindowClass.hIcon := LoadIcon(0, idi_Application);
   WindowClass.hCursor := LoadCursor(0, idc_Arrow);
   WindowClass.hbrBackground := GetStockObject(WHITE_BRUSH);
   WindowClass.lpszMenuName := nil;
   WindowClass.lpszClassName := AppName;

   Result := RegisterClass(WindowClass) <> 0;
end;

{ Create the Window Class }
function WinCreate: HWnd;
var
   hWindow: HWnd;
begin
   hWindow := CreateWindow(AppName, 'Hello world program',
      ws_OverlappedWindow, cw_UseDefault, cw_UseDefault,
      300, 170, 0, 0, system.MainInstance, nil);

   hTool := CreateWindowEx(0, TOOLBARCLASSNAME, 0,
      WS_CHILD or WS_VISIBLE, 0, 0, 0, 0,
      hWindow, 0, system.maininstance, nil);
   SendMessage(hTool, TB_BUTTONSTRUCTSIZE, WPARAM(sizeof(TBBUTTON)), 0);

   tbab.hInst := HINST_COMMCTRL;
   tbab.nID := IDB_STD_SMALL_COLOR;
   SendMessage(hTool, TB_ADDBITMAP, 0, LPARAM(@tbab));

   ZeroMemory(@TlBarBtns, sizeof(TlBarBtns));
   TlBarBtns[0].iBitmap := STD_FILENEW;
   TlBarBtns[0].fsState := TBSTATE_ENABLED;
   TlBarBtns[0].fsStyle := TBSTYLE_BUTTON;
   TlBarBtns[0].idCommand := ID_FILE_NEW;

   TlBarBtns[1].iBitmap := STD_FILEOPEN;
   TlBarBtns[1].fsState := TBSTATE_ENABLED;
   TlBarBtns[1].fsStyle := TBSTYLE_BUTTON;
   TlBarBtns[1].idCommand := ID_FILE_OPEN;

   TlBarBtns[2].iBitmap := STD_FILESAVE;
   TlBarBtns[2].fsState := TBSTATE_ENABLED;
   TlBarBtns[2].fsStyle := TBSTYLE_BUTTON;
   TlBarBtns[2].idCommand := ID_FILE_SAVEAS;

   SendMessage(hTool, TB_ADDBUTTONS, sizeof(TlBarBtns) div sizeof(TBBUTTON), LPARAM(@TlBarBtns));

   if hWindow <> 0 then
   begin
      ShowWindow(hWindow, CmdShow);
      ShowWindow(hWindow, SW_SHOW);
      UpdateWindow(hWindow);
   end;

   Result := hWindow;
end;


var
   AMessage: Msg;
   hWindow: HWnd;

begin
   if not WinRegister then
   begin
      MessageBox(0, 'Register failed', nil, mb_Ok);
      Exit;
   end;

   hWindow := WinCreate;
   if longint(hWindow) = 0 then
   begin
      MessageBox(0, 'WinCreate failed', nil, mb_Ok);
      Exit;
   end;

   while GetMessage(@AMessage, 0, 0, 0) do
   begin
      TranslateMessage(AMessage);
      DispatchMessage(AMessage);
   end;
   Halt(AMessage.wParam);
end.