![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно использовать функцию DrawTextEx?
KIR © (2002-08-23 13:28:00)Народ, требуется выводить текст в различных колонках грида либо отцентрировано, либо справа, либо слева. Что-то я никак не могу разобраться с параметрами функции DrawTextEx. Я делаю так:
procedure TResultsForm.StringGrid3DrawCell(Sender: TObject; ACol,
ARow: Integer; Rect: TRect; State: TGridDrawState);
var
al: UINT;
s: string;
hi: integer;
R: TRect;
begin
S:=StringGrid3.Cells[ACol,ARow];
al:=DT_LEFT or DT_VCENTER or DT_END_ELLIPSIS or DT_NOPREFIX or DT_WORDBREAK;
R := Rect;
R.left:=R.Left+2;
R.Top:=R.Top+2;
R.Right:=Rect.Right-2;
StringGrid3.Canvas.FillRect(Rect);
hi:=DrawTextEx(StringGrid3.Canvas.Handle, PChar(s), Length(s), R, al or DT_CALCRECT, nil);
if StringGrid3.RowHeights[ARow] < hi then
StringGrid3.RowHeights[ARow]:=hi+6;
DrawTextEx(StringGrid3.Canvas.Handle,Pchar(s),-1,R,al,nil);
end;
Объясните тупому почему параметры пишутся через or. И как их нужно скомпановать, чтобы выровнять текст, например, по правой стороне ячейки?
KIR (2002-08-29 10:47:00) [1]Вот процедура:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
al: UINT;
s: string;
hi: integer;
R: TRect;
begin
S:=StringGrid1.Cells[ACol,ARow];
al:=DT_RIGHT or DT_END_ELLIPSIS or DT_NOPREFIX or DT_WORDBREAK;
R := Rect;
R.left:=R.Left+2;
R.Top:=R.Top+2;
R.Right:=Rect.Right-2;
StringGrid1.Canvas.FillRect(Rect);
hi:=DrawTextEx(StringGrid1.Canvas.Handle, PChar(s), Length(s), R, al or DT_CALCRECT, nil);
if StringGrid1.RowHeights[ARow] < hi then
StringGrid1.RowHeights[ARow]:=hi+6;
DrawTextEx(StringGrid1.Canvas.Handle,Pchar(s),-1,R,al,nil);
end;
она НЕ ВЫРАВНИВАЕТ текст по правому краю, НО как только я комментирую след. строки:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
al: UINT;
s: string;
hi: integer;
R: TRect;
begin
S:=StringGrid1.Cells[ACol,ARow];
al:=DT_RIGHT or DT_END_ELLIPSIS or DT_NOPREFIX or DT_WORDBREAK;
R := Rect;
R.Left:=R.Left+2;
R.Top:=R.Top+2;
R.Right:=Rect.Right-2;
StringGrid1.Canvas.FillRect(Rect);
// hi:=DrawTextEx(StringGrid1.Canvas.Handle, PChar(s), Length(s), R, al or DT_CALCRECT, nil);
// if StringGrid1.RowHeights[ARow] < hi then
// StringGrid1.RowHeights[ARow]:=hi+6;
DrawTextEx(StringGrid1.Canvas.Handle,Pchar(s),-1,R,al,nil);
end;
все получается. Я так понимаю, что проблема в использовании параметра DT_CALCRECT. Но без него я не смогу выводить текст в несколько строк... может мне кто-нибудь помочь?
KIR (2002-08-28 10:59:00) [2]>> ЮЮ
Большое спсибо
ЮЮ (2002-08-27 11:03:00) [3]Двоичная арифметика:
1 or 0 = 1,
1 and 0 = 0.
Формирование пораметра - это заполнение 1-ми, каждая их констант - это 2 в степени N, т.е. 1 в определённой позиции
KIR (2002-08-27 10:56:00) [4]м..ки
Игорь Шевченко (2002-08-27 10:49:00) [5]
> Все-таки (если можно поподробнее) почему параметры вводятся
> через or, а не через and?
Это тайное знание.
ZrenBy (2002-08-27 10:43:00) [6]>all
Я не помню, в школе начала матлогики дают или нет ?
KIR (2002-08-27 10:35:00) [7]Внесу небольшое пояснение: вышеприведенныы код был ответом на мой вопрос в этом форуме. Вопрос заключался в том, как сделать так, чтобы текст в Гриде выводился при необходимости в несколько строк. Мне кто-то написал это код. Я его использовал и все вроде работает. Теперь мне понадобилось выравнивание, я стал читать дельфийский Windows SDK. Набрел там на функцию DrawTextEx, и вот сейчас пытаюсь с ней разобраться, но что-то пока не выходит, хотя, казалось бы, все элементарно.
Отсюда, если позволите, все-таки вопрос:
Все-таки (если можно поподробнее) почему параметры вводятся через or, а не через and?
Игорь Шевченко (2002-08-27 10:01:00) [8]KIR © (27.08.02 09:57)
а как тогда понять строку
...DT_LEFT or DT_VCENTER...?
Как бред :-)
Впрочем, DT_LEFT равно 0, так что не страшно, но все равно, бред :-)
KIR (2002-08-27 09:57:00) [9]а как тогда понять строку
...DT_LEFT or DT_VCENTER...?
Skier (2002-08-23 13:32:00) [10]>KIR
> Объясните тупому почему параметры пишутся через or
А чтобы сложить битики...
> как их нужно скомпановать, чтобы выровнять текст, например,
> по правой стороне ячейки
... or DT_RIGHT - Aligns text to the right.