Канва текст под углом?? проблема
От: DenisKDA  
Дата: 14.04.05 18:03
Оценка:
Хочу вывести текст под углом, дела так

void __fastcall TForm1::Button1Click(TObject *Sender)
{
LOGFONT lf;
GetObject(Form1->Canvas->Font->Handle,sizeof(lf),&lf);
lf.lfEscapement = 900;
lf.lfOrientation = 900;
lf.lfWeight = FW_NORMAL;
Form1->Canvas->Font->Handle = CreateFontIndirect(&lf);

Form1->Canvas->TextOutA(50,50,"TEST");
DeleteObject(Form1->Canvas->Font->Handle);
}


Ну вот загвостка почемуто срабатывает только со второго раза, Т.е. в первый раз рисует как обычно, а при вызове в второй раз рисует уже как надо.
Не пойму в чем загвоздка.
Builder 6. Win XP pro.
Re: Канва текст под углом?? проблема
От: alive Россия  
Дата: 14.04.05 20:09
Оценка:
Здравствуйте, DenisKDA, Вы писали:

DKD>Хочу вывести текст под углом, дела так


...
DKD>Form1->Canvas->Font->Handle = CreateFontIndirect(&lf);

Так делать ИМХО нельзя
Вот что я использую, надеюсь переведешь в билдер

procedure FreeTextOut(Canvas: TCanvas; X, Y, A: Integer; S: string);
var
  OldFont, NewFont: hFont;
  lf: TLogFont;
begin
  with lf, Canvas do
  begin
    {Устанавливаем параметры шрифта.
        Все параметры, кроме двух из текущего шрифта}
    lfHeight:= Font.Height;
    lfWidth:= 0;
    lfEscapement:= A * 10; {Угол наклона строки}
    lfOrientation:= A * 10; {Угол наклона символа}
    if fsBold in Font.Style then
      lfWeight:= FW_BOLD
    else
      lfWeight:= FW_NORMAL;
    lfItalic:= Byte(fsItalic in Font.Style);
    lfUnderline:= Byte(fsUnderline in Font.Style);
    lfStrikeOut:= Byte(fsStrikeOut in Font.Style);
    lfCharSet:= DEFAULT_CHARSET;
    StrPCopy(lfFaceName, Font.Name);
    lfQuality:= DEFAULT_QUALITY;
    lfOutPrecision:= OUT_DEFAULT_PRECIS;
    lfClipPrecision:= CLIP_DEFAULT_PRECIS;
    lfPitchAndFamily:= DEFAULT_PITCH;
  end;
  {Создаем шрифт}
  NewFont:= CreateFontIndirect(lf);
  {Выбираем в контекст}
  OldFont:= SelectObject(Canvas.Handle, NewFont);
  {Выводим текст}
  Canvas.TextOut(X, Y, S);
  {Выбираем старый шрифт в контекст}
  SelectObject(Canvas.Handle, OldFont);
  {Удаляем созданный}
  DeleteObject(NewFont);
end;
... << RSDN@Home 1.1.4 beta 5 rev 405 >> <<silent>>
Keep yourself alive
Re[2]: Канва текст под углом?? проблема
От: DenisKDA  
Дата: 15.04.05 03:54
Оценка:
Спасибо! А глюк состоял в том, что ширифт "MS Sans Serif" нехотел писаться под углом как только поставил другой сразу все заработало, почему так я и немонял. Какая в принципе разница какой у меня ширифт стоит.


Здравствуйте, alive, Вы писали:

A>Здравствуйте, DenisKDA, Вы писали:


DKD>>Хочу вывести текст под углом, дела так


A>
A>...
DKD>>Form1->Canvas->Font->Handle = CreateFontIndirect(&lf);
A>

A>Так делать ИМХО нельзя
A>Вот что я использую, надеюсь переведешь в билдер

A>
A>procedure FreeTextOut(Canvas: TCanvas; X, Y, A: Integer; S: string);
A>var
A>  OldFont, NewFont: hFont;
A>  lf: TLogFont;
A>begin
A>  with lf, Canvas do
A>  begin
A>    {Устанавливаем параметры шрифта.
A>        Все параметры, кроме двух из текущего шрифта}
A>    lfHeight:= Font.Height;
A>    lfWidth:= 0;
A>    lfEscapement:= A * 10; {Угол наклона строки}
A>    lfOrientation:= A * 10; {Угол наклона символа}
A>    if fsBold in Font.Style then
A>      lfWeight:= FW_BOLD
A>    else
A>      lfWeight:= FW_NORMAL;
A>    lfItalic:= Byte(fsItalic in Font.Style);
A>    lfUnderline:= Byte(fsUnderline in Font.Style);
A>    lfStrikeOut:= Byte(fsStrikeOut in Font.Style);
A>    lfCharSet:= DEFAULT_CHARSET;
A>    StrPCopy(lfFaceName, Font.Name);
A>    lfQuality:= DEFAULT_QUALITY;
A>    lfOutPrecision:= OUT_DEFAULT_PRECIS;
A>    lfClipPrecision:= CLIP_DEFAULT_PRECIS;
A>    lfPitchAndFamily:= DEFAULT_PITCH;
A>  end;
A>  {Создаем шрифт}
A>  NewFont:= CreateFontIndirect(lf);
A>  {Выбираем в контекст}
A>  OldFont:= SelectObject(Canvas.Handle, NewFont);
A>  {Выводим текст}
A>  Canvas.TextOut(X, Y, S);
A>  {Выбираем старый шрифт в контекст}
A>  SelectObject(Canvas.Handle, OldFont);
A>  {Удаляем созданный}
A>  DeleteObject(NewFont);
A>end;
A>
Re[3]: Канва текст под углом?? проблема
От: alive Россия  
Дата: 15.04.05 04:19
Оценка:
Здравствуйте, DenisKDA, Вы писали:

DKD>Спасибо! А глюк состоял в том, что ширифт "MS Sans Serif" нехотел писаться под углом как только поставил другой сразу все заработало, почему так я и немонял. Какая в принципе разница какой у меня ширифт стоит.


Шрифт должен быть TrueType.
... << RSDN@Home 1.1.4 beta 5 rev 405 >> <<Queen — [A Day At The Races] Teo Torriatte (Let Us Cling To>>
Keep yourself alive
Re[3]: Канва текст под углом?? проблема
От: Аноним  
Дата: 15.04.05 15:53
Оценка:
Здравствуйте, DenisKDA, Вы писали:

DKD>Спасибо! А глюк состоял в том, что ширифт "MS Sans Serif" нехотел писаться под углом как только поставил другой сразу все заработало, почему так я и немонял. Какая в принципе разница какой у меня ширифт стоит.


MS Sans Serif — растровый шрифт (как и все остальные, обозначеные красной буковкой А в Control Panel). Если попытаться его поворачивать — то результат будет настолько отвратительным, что мама не горюй.
True Type описаны как векторные объекты, и они сначала ПОВОРАЧИВАЮТСЯ на заданный угол, а уже потом превращаются в РАСТР на экране. Потеря качества минимальна. К тому же, последние версии Windows умеют делать антиалиасинг при растеризации TrueType-шрифтов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.