Delphi. Трюки и эффекты. Александр Чиртик. Читать онлайн. Newlib. NEWLIB.NET

Автор: Александр Чиртик
Издательство:
Серия:
Жанр произведения: Программы
Год издания: 0
isbn: 978-5-911-80219-6
Скачать книгу
COLORREF = 0):COLORREF;

      var

      choose: TChooseColor;

      begin

      ZeroMemory(Addr(choose), SizeOf(choose));

      //Заполнение структуры для диалогового окна

      choose.lStructSize := SizeOf(choose);

      choose.hWndOwner := hParentWnd;

      choose.hInstance := hAppInst;

      choose.rgbResult := lastColor;

      choose.lpCustColors := Addr(colors);

      choose.Flags := CC_RGBINIT or CC_ANYCOLOR or CC_FULLOPEN;

      //Отображение окна диалога и обработка результата

      if (ChooseColor(choose) = True) then ShowChooseColor :=

      choose.rgbResult

      else ShowChooseColor := lastColor;

      end;

      Здесь также заполняется структура похожего назначения. Используются следующие флаги диалогового окна:

      • CC_RGBINIT – использовать значение поля rgbResult в качестве предустановленного значения цвета (по умолчанию как ранее выбранного);

      • CC_ANYCOLOR – отображать все доступные предопределенные цвета (левая часть, рис. 2.4);

      • CC_FULLOPEN – раскрывать панель подбора цвета (правая часть, рис. 2.4).

      Рис. 2.4. Окно выбора цвета

      Поясним, что за переменная, а точнее, ее адрес, сохраняется в поле lpCustColors – это массив из 16 значений типа COLORREF:

      colors: array [1..16] of COLORREF;

      Обратите внимание на 16 квадратов в левой нижней области окна (рис. 2.4) – это места для определенных пользователем цветов. Для заполнения этой области окна и используются значения из массива colors. Массив может быть как локальным, так и глобальным (что удобнее, так как значения определенных пользователем цветов сохраняются между вызовами диалогового окна).

      Окно выбора шрифта

      Для вывода диалогового окна выбора шрифта вполне подойдет функция, приведенная в листинге 2.27.

Листинг 2.27. Окно выбора шрифта

      function ShowChooseFont(var font: LOGFONT):BOOL;

      var

      choose: TChooseFont;

      begin

      ZeroMemory(Addr(choose), SizeOf(choose));

      //Заполнение структуры для диалогового окна

      choose.lStructSize := SizeOf(choose);

      choose.hWndOwner := hParentWnd;

      choose.hInstance := hAppInst;

      choose.lpLogFont := Addr(font);

      choose.Flags := CF_BOTH or CF_INITTOLOGFONTSTRUCT;

      //Отображение окна диалога и обработка результата

      if (ChooseFont(choose) = True) then

      begin

      CopyMemory(Addr(font), choose.lpLogFont, SizeOf(font));

      ShowChooseFont := True;

      end

      else ShowChooseFont := False;

      end;

      Здесь используются флаги окна, имеющие следующие значения:

      • CF_BOTH – отображать экранные и принтерные шрифты (для показа экранных или принтерных шрифтов можно использовать флаги CFSCREENFONTS и CF_PRINTERFONTS соответственно);

      • CF_INITTOLOGFONTSTRUCT – выбрать в диалоговом окне шрифт, соответствующий (или максимально похожий) шрифту, описываемому структурой LOGFONT, указатель на которую сохраняется в поле lpLogFont.

      Окно выбора папки

      Чтобы иметь возможность пользоваться окном Обзор папок для выбора папки, можно использовать листинг 2.28.

Листинг 2.28. Окно выбора папки

      function ShowChooseFolder(strTitle: string):string;

      var

      choose: BROWSEINFO;

      buffer: string;

      pidl: PItemIDList;

      begin

      ZeroMemory(Addr(choose), SizeOf(choose));

      SetLength(buffer, MAX_PATH);

      //Заполнение структуры для диалога

      choose.hwndOwner := hParentWnd;

      choose.pidlRoot := nil; //Корень – папка Рабочего стола

      choose.pszDisplayName := PAnsiChar(buffer);

      choose.lpszTitle := PAnsiChar(strTitle);

      choose.ulFlags := 0;

      //Вывод диалогового окна и обработка результата

      pidl := SHBrowseForFolder(choose);

      if (pidl <> nil) then

      begin

      //Получение полного пути выбранной папки

      SHGetPathFromIDList(pidl, PAnsiChar(buffer));

      ShowChooseFolder := buffer;

      DeletePIDL(pidl);

      end

      else

      ShowChooseFolder