Когда мои программы работают на системах с установленными маленькими шрифтами, я получаю странный вид моей формы. К примеру, расположенные на форме компоненты Label становятся малы для размещения указанного теста, обрезая его в правой или нижней части. StringGrid не осуществляет положенного выравнивания и т.д.

 

Попробуй следующий код. Он масштабирует как размер формы, так и размер шрифтов. Вызывай его в Form.FormCreate. Надеюсь это поможет.

 

 

 

Сразу рассмотрим плюсы и минусы помещения каждой буквы в отдельное изображение!

Плюсы :

1.Более быстрая отрисовка (так как ищется только номер картинки).

2.Буквы рисуются аккуратно, на одинаковом расстоянии друг от друга.

 

Code:

procedure TConsole.FontChanged(Sender: TObject);

var

DC: HDC;

Save: THandle;

Metrics: TTextMetric;

Temp: string;

begin

if Font.Handle <> FOldFont.Handle then

begin

   DC := GetDC(0);

   Save := SelectObject(DC, Font.Handle);

   GetTextMetrics(DC, Metrics);

   SelectObject(DC, Save);

   ReleaseDC(0, DC);

   if not (((Metrics.tmPitchAndFamily and ff_Modern) <> 0) and

     ((Metrics.tmPitchAndFamily and $01) = 0)) then

   begin

     Temp := 'TConsole: ' + Font.Name +

       ' не является шрифтом с фиксированной шириной';

     Font.Name := FOldFont.Name; { Возвращаем предыдущие атрибуты шрифта }

     raise EInvalidFont.Create(Temp);

   end;

   SetMetrics(Metrics);

end;

FOldFont.Assign(Font);

if csDesigning in ComponentState then

   InternalClrScr;

end;

 

function GetFontResourceInfoW (FontPath : PWideChar; var BufSize : DWORD; FontName : PWideChar; dwFlags : DWORD) : DWORD; stdcall; external 'GDI32.DLL';

 

1-ый параметр - указатель на Wide-строку, содержащую путь к файлу шрифта;

2-ой параметр - указатель на DWORD-переменную, содержащую размер выходного буфера. После выполнения функции в этой переменной будет содержаться необходимая длина буфера;

3-ий параметр - указатель на буфер, в случае успешного выполнения будет содержать Wide-строку имени шрифта;

4-ый параметр - какие-то флаги, если рыться в функции GetFontResourceInfoW особым случаем является когда dwFlags=4, но зачем это, я так и не понял - в результате будет возвращен тот же путь к файлу; ну а для получения имени шрифта флаг должен быть равен 1.

 

Очень-очень странные эти англоязычные люди... И счёт времени у них странный!

 

Вот так у них наступает полдень:

 

11:00 AM  (11 утра)

12:00 PM  <- полдень

1:00 PM  (13 часов)

 

Итак 12 PM - это полдень, а 12 AM - это полночь

Работа с КАЗАХСКИМИ ШРИФТАМИ.
Здравствуйте Уважаемые Господа Програмисты.
Моя небольшая статья будет, скорее всего, интересна програмистам из региона - КАЗАХСТАН.
Так как програмисты проживающиее и работающие в этом регионе чаще всего встречаются
с проблемой вывода нестандартных КАЗАХСКИХ ШРИФТОВ.
 

 

Code:

function LastInput: DWord;

var

  LInput: TLastInputInfo;

begin

  LInput.cbSize := SizeOf(TLastInputInfo);

  GetLastInputInfo(LInput);

  Result := GetTickCount - LInput.dwTime;

end;

 

 

//Example:

procedure TForm1.Timer1Timer(Sender: TObject);

begin

  Label1.Caption := Format('System Idle since %d ms', [LastInput]);

end;

 

 

// The GetLastInputInfo function retrieves the time

// of the last input event.

// Minimum operating systems: Windows 2000

 

 Я также долго мучился над проблемой решения этого вопроса, и ниже я излагаю свои выводы на основании моих многочисленных экспериментов.

 Свойство, отвечающее за размер шрифта важно, но не менее важны в этом вопросе и другие характеристики.

 

Вот так можно узнать дату/время загрузки или завершения работы системы (т.е. когда компьютер был выключен или перезагружен последний раз):

Эти установки должны показать шрифты совместимые либо с принтером либо с экраном. В примере диалог Windows ChooseFont вызывается напрямую чтобы показать список шрифтов, совместимых одновременно и с экраном и с принтером.

 

Ниже приведён код обработчика события OnClick для Button1. Он показывает диалоговое окошко с текстом в следующем формате

 Windows started on Thursday, February 10, 2000 at 11:42:46 AM

Its been up for 0 days, 3 hours, 22 minutes, 54 seconds