program StandartWindows;
{$R *.res}
uses
  Windows, Messages, CommDlg,
  Controls in 'Controls.pas',
  StdWindows in 'StdWindows.pas';
var
  hMainWnd: HWND;
  hInst: Cardinal;
  mess: MSG;
  curColor: COLORREF;
  font: LOGFONT;
  hCurFont: HFONT;

//Функция обработки сообщений
function WindowFunc(hWnd:HWND; msg:UINT;
                    wParam:WPARAM; lParam:LPARAM):LRESULT; stdcall;
var
   hOldFont: HFONT;
   strBuf: String;
   hEditDC: HDC;
begin
  case msg of
    WM_CLOSE:
      if (hWnd = hMainWnd) then PostQuitMessage(0);
    WM_CTLCOLOREDIT:  //Сообщения от Edit'а перед перерисовкой
    begin
      //Зададим тексту Edit'а выбранный цвет
      hEditDC := HDC(wParam);
      SetTextColor(hEditDC, curColor);
      GetCurrentObject(hEditDC, OBJ_BRUSH);
    end;
    WM_COMMAND:
      if (HIWORD(wParam) = BN_CLICKED) then
      begin
        //Определим, какая кнопка нажата
        case LOWORD(wParam) of
          1001: //Открытие файла
          begin
            SetText(2001, 'Открыт файл:' + #13 + #10 +
                              ShowOpen('Все файлы|*.*||'));
          end;
          1002: //Сохранение файла
          begin
            SetText(2001, 'Путь для сохранения:' + #13 + #10 +
                              ShowSave('Все файлы|*.*||'));
          end;
          1003: //Выбор цвета
          begin
            curColor := ShowChooseColor(curColor);
            Str(curColor, strBuf);
            SetText(2001, 'Выбранный цвет:' + #13 + #10 + strBuf);
          end;
          1004: //Выбор шрифта
          begin
            if (ShowChooseFont(font) = TRUE) then
            begin
              //Замена шрифта в Edit'е
              hOldFont := HFONT(
                SendDlgItemMessage(hMainWnd,2001,WM_GETFONT, 0,0));
              hCurFont := CreateFontIndirect(font);
              SendDlgItemMessage(hMainWnd, 2001, WM_SETFONT,
                                 Integer(hCurFont), Integer(TRUE));
              SetText(2001, 'Текст, записанный выбранным шрифтом');

              if (hOldFont <> 0) then DeleteObject(hOldFont);
            end;
          end;
          1010: //Выбор папки
          begin
            SetText(2001, 'Выбранная папка:' + #13 + #10 +
                              ShowChooseFolder());
          end;
          1011: //Подключение сетевого ресурса
          begin
            ShowConnection();
          end;
          1012: //Отключение сетевого ресурса
          begin
            ShowDisconnect();
          end;
          1013: //Окно "О программе"
          begin
            ShowAbout('Standart windows',
                      'Демонстрация использования стандартных ' +
                      'окон диалога из чистого API-приложения');
          end;
        end;
      end;
  else
    begin
      //Обработка по умолчанию
      WindowFunc := DefWindowProc(hWnd, msg, wParam, lParam);
      Exit;
    end;
  end;

  WindowFunc := S_OK; //Сообщение обработано
end;

function RegisterWindow():Boolean;
var
  wcx: WNDCLASSEX;
begin
  ZeroMemory(Addr(wcx), SizeOf(wcx));
  //Формирование информации о классе окна
  wcx.cbSize := SizeOf(wcx);
  wcx.hInstance := hInst;
  wcx.hIcon := LoadIcon(0, IDI_ASTERISK);       //Стандартная иконка
  wcx.hIconSm := wcx.hIcon;
  wcx.hCursor := LoadCursor(0, IDC_ARROW);      //Стандартный курсор
  wcx.hbrBackground := COLOR_BTNFACE + 1;            //Стандартный для окна цвет
  wcx.style := 0;

  //..самые важные параметры
  wcx.lpszClassName := 'MyWindowClass'; //Название класса
  wcx.lpfnWndProc := Addr(WindowFunc);  //Адрес функции обработки сообщений

  //Регистрация класса окна
  RegisterWindow := RegisterClassEx(wcx) <> 0;
end;

begin
  hInst :=   GetModuleHandle(nil);

  //Регистрация и создание главного окна
  if not RegisterWindow() then Exit;
  hMainWnd := CreateWindow(
    'MyWindowClass', //Имя класса окна
    'Стандартные окна Windows',  //Заголовок окна
    WS_CAPTION or WS_SYSMENU or WS_CLIPCHILDREN or WS_CLIPSIBLINGS,
    CW_USEDEFAULT,   //Координата X по умолчанию
    CW_USEDEFAULT,   //Координата Y по умолчанию
    470, 330,
    HWND(nil),        //Нет родительского окна
    HMENU(nil),       //Нет меню
    hInst,
    nil);
  if (hMainWnd = HWND(nil)) then Exit;

  //Инициализация модуля Controls для работы с главным окном приложения
  Controls.hParentWnd := hMainWnd;
  Controls.hAppInst := hInst;
  //Инициализация модуля StdWindows для работы с главным окном приложения
  StdWindows.hParentWnd := hMainWnd;
  StdWindows.hAppInst := hInst;


  //Создание кнопок для открытия диалоговых окон
  CreateButton(20, 20, 200, 30, 1001, 'Открытие файла');
  CreateButton(20, 60, 200, 30, 1002, 'Сохранение файла');
  CreateButton(20, 100, 200, 30, 1003, 'Выбор цвета');
  CreateButton(20, 140, 200, 30, 1004, 'Выбор шрифта');
  CreateButton(230, 20, 220, 30, 1010, 'Выбор папки');
  CreateButton(230, 60, 220, 30, 1011, 'Подключение сетевого ресурса');
  CreateButton(230, 100, 220, 30, 1012, 'Отключение сетевого ресурса');
  CreateButton(230, 140, 220, 30, 1013, 'Системное окно "О программе"');
  //Текстовое поле для результата
  CreateMemo(20, 180, 430, 100, 2001);

  ShowWindow(hMainWnd, SW_NORMAL);

  //Запуск цикла обработки сообщений
  while (Longint(GetMessage(mess, 0, 0, 0)) <> 0) do
  begin
      if (IsDialogMessage(hMainWnd, mess) = FALSE) then
      begin
        TranslateMessage(mess);
        DispatchMessage(mess);
      end;
  end;
end.


