Форум: "Основная";
Текущий архив: 2003.01.16;
Скачать: [xml.tar.bz2];
ВнизВопрос про событие 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c