Программирование в Delphi. Трюки и эффекты. Александр Чиртик

Читать онлайн.
Название Программирование в Delphi. Трюки и эффекты
Автор произведения Александр Чиртик
Жанр Программирование
Серия
Издательство Программирование
Год выпуска 2010
isbn 978-5-49807-118-3



Скачать книгу

ShowChooseColor(lastColor: 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);

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

      • CC_FULLOPEN – раскрывать панель подбора цвета (правая половина окна, рис. 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 – позволяет отображать экранные и принтерные шрифты (для отображения либо экранных, либо принтерных шрифтов можно использовать флаги CF_SCREENFONTS и 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.pi dlRoot:= 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:=