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

Вниз

Вопрос про событие OnDrawCell стандартного StringGrid a   Найти похожие ветки 

 
KIR ©   (2003-01-05 14:24) [0]

Народ, что-то я никак не могу допереть, как это сделать. Задача следующая: требуется чтобы, если текст не влезает в одну строку, он разбивался на несколько и соответственно увеличивалась высота строки. Это-то ясно:

procedure TForm.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];
StringGrid1.Canvas.FillRect(Rect);
R := Rect;
R.Right := R.Right-2;
R.Left := R.Left+2;
al := DT_CENTER or DT_END_ELLIPSIS or DT_NOPREFIX or DT_WORDBREAK;
hi := DrawTextEx(StringAlignGrid1.Canvas.Handle, PChar(S), Length(S), R, al or DT_CALCRECT, nil);
If StringAlignGrid1.RowHeights[ARow] < hi then
StringAlignGrid1.RowHeights[ARow] := hi+2;
DrawTextEx(StringAlignGrid1.Canvas.Handle, PChar(S),-1,R,al,nil);
end;

Но при этом требуется выровнять этот текст по центру и по вертикали, и по горизонтали. Но DT_VCENTER совместно с DT_WORDBREAK не работает, как быть?
Мало того, если не требуется увеличения высоты строки (текст влезает в одну строку), то и DT_CENTER не хочет центрировать текст, а выводит его с левого края.


 
Calm ©   (2003-01-05 15:41) [1]

Наверное, подразумевается, что в подобных случаях разработчики пользуются объектом Canvas и его методами. Но тогда придется вычислять расположение текста вручную...

Хотя может можно и DrawTextEx, не знаю. Но Canvas.TextOut() точно прокатит.


 
KIR ©   (2003-01-05 16:32) [2]

Странно то, что мой случай не такой уж нетривиальный: ровнять текс значит можно как хочешь, вот только отцентрировать нельзя... Наверняка, ведь Excel центрирует с помощью DrawTextEx...


 
down   (2003-01-05 16:59) [3]

По поводу DT_VCENTER в хелпе написано:
DT_VCENTER Centers text vertically (single line only)

DT_CENTER + DT_WORDBREAK работпет нормально, проверь, влезает ли текст в прямоугольник по вертикали.



 
KIR ©   (2003-01-05 17:49) [4]

Из хелпа
DT_VCENTER Centers text vertically ( single line only).

Как может DT_SINGLELINE сочетаться с DT_WORDBREAK?


 
down   (2003-01-05 18:03) [5]

Никак, в этом-то и суть.


 
KIR ©   (2003-01-05 19:12) [6]

А все-таки, как отцентрировать по вертикали текст при помощи функции DrawTextEx, используя параметр DT_WORDBREAK? Неужили никак? Снова повторюсь, как же это делает Excel?


 
down   (2003-01-05 19:32) [7]


> А все-таки, как отцентрировать по вертикали текст при помощи
> функции DrawTextEx, используя параметр DT_WORDBREAK? Неужили
> никак?

Угу, никак.

> Снова повторюсь, как же это делает Excel?

Не знаю, но можно сделать так:
Вызываешь DrawText с DT_CALCRECT, полученный прямоугольник центрируешь в прямоугольнике ячейки и выводишь текст в него.


 
KIR ©   (2003-01-05 19:35) [8]

Ммм... как-то кривовато выходит...


 
down   (2003-01-05 19:54) [9]

Значит, неправильно выравниваешь.


 
Keymaster ©   (2003-01-05 20:09) [10]

Когда-то сам с этим столкнулся.
Решение нашёл в Сanvas.TextOut()


 
KIR ©   (2003-01-05 22:12) [11]

То есть все-таки надо рабртать конкретно со StringGrid.Canvas. А на какое событие это вешать? На OnDrawCell?



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

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

Наверх




Память: 0.49 MB
Время: 0.018 c
14-49202
Сатир
2002-12-25 14:49
2003.01.16
Задача для разминки мозгов


3-48920
Mariya
2002-12-21 13:20
2003.01.16
Index


1-48975
ShaH
2003-01-06 15:12
2003.01.16
Как в проект Delphi подключить модуль написанный на C++ Builder e


4-49368
Шишкин Илья
2002-12-01 16:29
2003.01.16
Своя панель в Internet Explorer


14-49251
Cr@sh
2002-12-24 19:19
2003.01.16
Меня загребают....2 - меня загребли...