Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.09;
Скачать: CL | DM;

Вниз

Как правильно использовать функцию DrawTextEx?   Найти похожие ветки 

 
KIR ©   (2002-08-23 13:28) [0]

Народ, требуется выводить текст в различных колонках грида либо отцентрировано, либо справа, либо слева. Что-то я никак не могу разобраться с параметрами функции 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. И как их нужно скомпановать, чтобы выровнять текст, например, по правой стороне ячейки?


 
Skier ©   (2002-08-23 13:32) [1]

>KIR

> Объясните тупому почему параметры пишутся через or


А чтобы сложить битики...



> как их нужно скомпановать, чтобы выровнять текст, например,
> по правой стороне ячейки


... or DT_RIGHT - Aligns text to the right.


 
KIR ©   (2002-08-27 09:57) [2]

а как тогда понять строку
...DT_LEFT or DT_VCENTER...?


 
Игорь Шевченко ©   (2002-08-27 10:01) [3]

KIR © (27.08.02 09:57)
а как тогда понять строку
...DT_LEFT or DT_VCENTER...?



Как бред :-)

Впрочем, DT_LEFT равно 0, так что не страшно, но все равно, бред :-)


 
KIR ©   (2002-08-27 10:35) [4]

Внесу небольшое пояснение: вышеприведенныы код был ответом на мой вопрос в этом форуме. Вопрос заключался в том, как сделать так, чтобы текст в Гриде выводился при необходимости в несколько строк. Мне кто-то написал это код. Я его использовал и все вроде работает. Теперь мне понадобилось выравнивание, я стал читать дельфийский Windows SDK. Набрел там на функцию DrawTextEx, и вот сейчас пытаюсь с ней разобраться, но что-то пока не выходит, хотя, казалось бы, все элементарно.

Отсюда, если позволите, все-таки вопрос:
Все-таки (если можно поподробнее) почему параметры вводятся через or, а не через and?


 
ZrenBy ©   (2002-08-27 10:43) [5]

>all
Я не помню, в школе начала матлогики дают или нет ?


 
Игорь Шевченко ©   (2002-08-27 10:49) [6]


> Все-таки (если можно поподробнее) почему параметры вводятся
> через or, а не через and?


Это тайное знание.


 
KIR ©   (2002-08-27 10:56) [7]

м..ки


 
ЮЮ ©   (2002-08-27 11:03) [8]

Двоичная арифметика:
1 or 0 = 1,
1 and 0 = 0.
Формирование пораметра - это заполнение 1-ми, каждая их констант - это 2 в степени N, т.е. 1 в определённой позиции


 
KIR ©   (2002-08-28 10:59) [9]

>> ЮЮ
Большое спсибо


 
KIR ©   (2002-08-29 10:47) [10]

Вот процедура:
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. Но без него я не смогу выводить текст в несколько строк... может мне кто-нибудь помочь?



Страницы: 1 вся ветка

Текущий архив: 2002.09.09;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
14-27193
Человечек
2002-08-14 13:06
2002.09.09
Нашествие голубых человечков


14-27181
Карлсон
2002-08-11 19:25
2002.09.09
На чем пишутся ОС?


3-26908
roman_zdrj
2002-08-20 13:04
2002.09.09
Использование запросов


1-27050
Demn
2002-08-27 10:20
2002.09.09
Как из чужой Dll-ки вызывать диалоги и функции


7-27252
woland
2002-06-28 15:58
2002.09.09
Изменения время и даты создания файла.