void __fastcall TMainForm::StringGrid1DrawCell(TObject *Sender, int ACol,
int ARow, TRect &Rect, TGridDrawState State)
{
COLORREF clSel = RGB(255, 0, 0); // цвет текста для выделения красный
clSel = ColorBox1->Selected; // выбираем цвет текста для выделения
COLORREF clNorm;
AnsiString text = StringGrid1->Cells[ACol][ARow];
StringGrid1->Canvas->FillRect(Rect);
TRect r=Rect;
InflateRect(&r,0,0);
HDC hdc;
hdc = StringGrid1->Canvas->Handle;
clNorm = GetTextColor(hdc); // сохраним цвет чтобы потом его вернуть
int l = text.Length();
int offset=0; //смещение след буквы для канвы
int w=0; // ширина символа на канве
int h=0;
for (int i=1; i <= text.Length(); i++)
{
offset = offset + w;
r.Left = r.Left + w + 0.5;
w = StringGrid1->Canvas->TextWidth((text.SubString(i,1)).c_str());
SetTextColor(hdc,clNorm);//норм цвет
if (ACol == 0)
{
if (My_SetTextColor(text, i, ARow))
{
SetTextColor(hdc,clSel);//меняем цвет на выделенный
};
};
// а вот теперь рисуем буковку
TextOut(hdc, Rect.Left+offset, Rect.Top, (text.SubString(i,1)).c_str(), 1);
}
SetTextColor(hdc,clNorm);// вернем на место цвет
}
Разноцветные буквы в StringGrid
Сам текст рисую:
DrawText( ((TStringGrid*)Sender)->Canvas->Handle, text.c_str(), text.Length(), &r, DT_WORDBREAK);
Это можно сделать только выводя по одной букве, меняя цвет (Canvas->Font->Color) в нужном месте. Геморно определять размеры букв и расстояние между ними.
А примерно хотябы где искать?
Какими функциями?
Получаешь HDC (GetDC) контрола и начинаешь рисовать TextOut, увеличивая отступ перед выводом каждой буквы.
Времени много - буду учиться.
Если напишешь, запости сюда, было бы неплохо в FAQ вставить.
Цитата:
Если напишешь, запости сюда, было бы неплохо в FAQ вставить.
Правда пришлось отказаться от DrawText, но может потом добавлю вывод в несколько строк (сейчас не прёт, да и так хорошо - сделал подсказку на длинные строки)
Код:
Код:
bool __fastcall TMainForm::My_SetTextColor(AnsiString text, int i, int ARow)
{
bool es = false;
AnsiString tmp = ExtractFileName(text); //у меня тута полный путь, а нуна тока имя файла
int offset = text.AnsiPos(tmp)-1; //к-во символов для смещения
int pos=0; //позиция текста который надо выделить цветом в строке
int l = Text2Hilite.Length(); //длина текста который надо выделить
int c=0; //счетчик повторения нужного текста
while ( tmp.AnsiPos(Text2Hilite) > 0 ) //ищем текст
{
pos = tmp.AnsiPos(Text2Hilite)+offset+c*l; //находим позицию в text со смещением
if (i < pos)
{
return false; // буква раньше нужного текста
}
else
{
for (int e=pos; e < pos+l; e++)
{
if (i == e)
{
return true; //вот где она!
};
};
};
tmp = tmp.Delete(tmp.AnsiPos(Text2Hilite), l); //продолжаем искать
c++;
pos = 0;//сам не знаю зачем... пока отлаживал работало...
};
return es; //возвращаем цвет обратно в функцию
}
{
bool es = false;
AnsiString tmp = ExtractFileName(text); //у меня тута полный путь, а нуна тока имя файла
int offset = text.AnsiPos(tmp)-1; //к-во символов для смещения
int pos=0; //позиция текста который надо выделить цветом в строке
int l = Text2Hilite.Length(); //длина текста который надо выделить
int c=0; //счетчик повторения нужного текста
while ( tmp.AnsiPos(Text2Hilite) > 0 ) //ищем текст
{
pos = tmp.AnsiPos(Text2Hilite)+offset+c*l; //находим позицию в text со смещением
if (i < pos)
{
return false; // буква раньше нужного текста
}
else
{
for (int e=pos; e < pos+l; e++)
{
if (i == e)
{
return true; //вот где она!
};
};
};
tmp = tmp.Delete(tmp.AnsiPos(Text2Hilite), l); //продолжаем искать
c++;
pos = 0;//сам не знаю зачем... пока отлаживал работало...
};
return es; //возвращаем цвет обратно в функцию
}
Если кто-нибудь может чего-нибудь тут оптимизировать - ОЧЕНЬ ПРОШУ!