Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос про событие OnDrawCell стандартного StringGrid a


KIR ©   (2003-01-05 14:24:00) 

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

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не хочет центрировать текст, а выводит его с левого края.


KIR   (2003-01-05 22:12:00) [1]

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


Keymaster   (2003-01-05 20:09:00) [2]

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


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

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


KIR   (2003-01-05 19:35:00) [4]

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


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


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

Угу, никак.

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

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


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

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


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

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


KIR   (2003-01-05 17:49:00) [8]

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

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


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

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

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


KIR   (2003-01-05 16:32:00) [10]

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


Calm   (2003-01-05 15:41:00) [11]

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо