Page 1 of 2
wxGrid: Как сделать отступы внутри я
Posted: Tue Jul 27, 2010 6:58 am
by Mojo
Столкнулся с неожиданной проблемой.
Спрашивал у капиталистов, но они тоже не знают....
Нарисовал значится я борта ячейки методом wxGridCellRenderer вроде все нормально работает.
Но когда в ячейке текст, то расстояние от начала текста, до левого борта очень маленькое при толщине борта 1 пкс. а если толщина борта 2 пкс. то и вовсе текст прилипает к левому борту.
В HTML есть такое свойство "padding-left" специально для этих целей, что бы установить расстояние от левого края до начала текста.
Можно конечно добавить к тексту пробел, типа _T(" ") или отцентровать текст по середине, но первый вариант не красивый и главное не практичный, а второй вариант не подходит, потому как нужно что бы текст был слева.
Вобщем, нужно как-то сделать отступы слева внутри ячейки.
У кого какие есть идеи братва? Где копать? Тут главное идея и зацепка.....
Posted: Tue Jul 27, 2010 7:45 am
by borr_1
Мужики переписывали wxGridCellStringRenderer
http://forums.wxwidgets.org/viewtopic.p ... light=icon
Там только осталось сделать
Code: Select all
grid.DrawTextRectangle(dc, grid.GetCellValue(row, col),
rect, hAlign, vAlign);
А там добавь отступы сам.
Как-то так. Или вообще перерисовать самому.
ЗЫ посмотри в сторону wxAdvTable
Re: wxGrid: Как сделать отступы внутр
Posted: Tue Jul 27, 2010 7:46 am
by tan
Mojo wrote:Столкнулся с неожиданной проблемой.
Спрашивал у капиталистов, но они тоже не знают....
Нарисовал значится я борта ячейки методом wxGridCellRenderer вроде все нормально работает.
Но когда в ячейке текст, то расстояние от начала текста, до левого борта очень маленькое при толщине борта 1 пкс. а если толщина борта 2 пкс. то и вовсе текст прилипает к левому борту.
Так а сам текст внутри ячейки ты как выводишь? Если у тебя есть свой рендерер для рисования бордюра, что мешает самому и текст в ячейке рисовать (с нужными отступами)?
Posted: Tue Jul 27, 2010 9:23 am
by midisa
Сталкивался с той же проблемой под windows, в различных репортах. Выход выбирал только один - Рисовал свои квадратики
а уже в цикле смотрелось более менее красиво.
Во всех репортах край ячейки вплотную к тексту идет (из тех что видел) ComponentOne, Cristal Report, HexTeck...
Posted: Tue Jul 27, 2010 2:26 pm
by Mojo
borr_1 wrote:Мужики переписывали wxGridCellStringRenderer
http://forums.wxwidgets.org/viewtopic.p ... light=icon
Там только осталось сделать
Code: Select all
grid.DrawTextRectangle(dc, grid.GetCellValue(row, col),
rect, hAlign, vAlign);
А там добавь отступы сам.
Как-то так. Или вообще перерисовать самому.
ЗЫ посмотри в сторону wxAdvTable
Пасиб зёма, попробую, о результатах доложу позже.
Re: wxGrid: Как сделать отступы внутр
Posted: Tue Jul 27, 2010 2:36 pm
by Mojo
tan wrote:Mojo wrote:Столкнулся с неожиданной проблемой.
Спрашивал у капиталистов, но они тоже не знают....
Нарисовал значится я борта ячейки методом wxGridCellRenderer вроде все нормально работает.
Но когда в ячейке текст, то расстояние от начала текста, до левого борта очень маленькое при толщине борта 1 пкс. а если толщина борта 2 пкс. то и вовсе текст прилипает к левому борту.
Так а сам текст внутри ячейки ты как выводишь? Если у тебя есть свой рендерер для рисования бордюра, что мешает самому и текст в ячейке рисовать (с нужными отступами)?
Текст в ячейке не рисую через рендерер, просто ввожу значение в ячеку как в Эселе или Калк (ОпенОфис) затем считываю через m_grid1->GetCellValue() и сохраняю содержимое ячеек и все настройки и свойства ячейки в xml-файле.
Не знаю, как это будет выглядеть, если ввожу текст в ячейку вручную, а в ячейке рендерер для текста... получается, что мне нужно сначала считать значение ячейки, потом передать его рендереру, а затем рендерер должен снова установить значение этой ячейки? На сколько это будет эффективная логика.... не уверен...
Вообще концепцию я позаимствовал из 1С или из Экселя или из Калк, я ввожу значение ячеек, затем рисую ВИЗУАЛЬНО бордюры ячеек и сохраняю все в xml-файл.
Posted: Tue Jul 27, 2010 3:07 pm
by Mojo
midisa wrote:Сталкивался с той же проблемой под windows, в различных репортах. Выход выбирал только один - Рисовал свои квадратики
а уже в цикле смотрелось более менее красиво.
Во всех репортах край ячейки вплотную к тексту идет (из тех что видел) ComponentOne, Cristal Report, HexTeck...
Можно конечно добавлять пробел между борюром и текстом, но если данные будут сохраняться в базу данных, или же считываться от туда, то каждый раз придется удалять или добалять пробел, если полей немного, это не заметно, а если 10 тыс, или 100 тыс. или миллион, то это будет замедлять работу проги....
Posted: Tue Jul 27, 2010 3:18 pm
by Mojo
borr_1 wrote:Мужики переписывали wxGridCellStringRenderer
http://forums.wxwidgets.org/viewtopic.p ... light=icon
Там только осталось сделать
Code: Select all
grid.DrawTextRectangle(dc, grid.GetCellValue(row, col),
rect, hAlign, vAlign);
А там добавь отступы сам.
Как-то так. Или вообще перерисовать самому.
ЗЫ посмотри в сторону wxAdvTable
Похоже, что действительно копать нужно тут, именно в grid. .... эта идея заинтересовала....
Posted: Wed Jul 28, 2010 3:53 pm
by Mojo
Ничего не получается..... через grid.DrawTextRectangle(dc, grid.GetCellValue(row, col), rect, hAlign, vAlign); вроде бы должно работать, но при запуске текст позиционеруется не рендером а по умолчанию, только если кликать по ячейкам то позиционируется как надо, но старый текст остается на прежнем месте, т.е. в одной ячейке два текста, один из рендерера, а другой из ячейки. Вроде бы простая задача, отступ слева, но в wxGrid решить целая проблема.....
Posted: Thu Jul 29, 2010 5:22 am
by borr_1
Posted: Thu Jul 29, 2010 6:41 am
by Mojo
Нет, просто в методе Draw там где я рисую бордюры, там же и пытаюсь нарисовать текст...
Posted: Thu Jul 29, 2010 7:11 am
by borr_1
Mojo wrote:
Нет, просто в методе Draw там где я рисую бордюры, там же и пытаюсь нарисовать текст...
Надо наследоваться от wxGrid и так как у wxGrid метод DrawTextRectangle не виртуальный нужно просто скопировать код в твой класс-наследник и отрехтовать его как тебе надо. Вот еть пример в сети
http://boinc.berkeley.edu/svn/branches/ ... idCtrl.cpp
http://boinc.berkeley.edu/svn/branches/ ... GridCtrl.h
Он хоть и громоздкий, но мне как-то помог.
Posted: Thu Jul 29, 2010 7:15 am
by Mojo
Спасибо borr за интересные файлы кажись это то, что нужно!
Я пытался именно через DrawTextRectangle рисовать текст, но его почему-то не видно, только когда кликаю по гриду, он проскакивает в верхней первой ячейке, хотя я его позиционировал во второй....
Ща попробую, сделать как в этих файлах... о результатах отчитаюсь.
Posted: Thu Jul 29, 2010 8:40 am
by borr_1
Посмотри что у меня вышло с wxGridCellStringRenderer. единственная проблема при редактировании ячейки все сбивается
Code: Select all
class MyGridCellRenderer : public wxGridCellStringRenderer
{
public:
virtual void Draw(wxGrid& grid,
wxGridCellAttr& attr,
wxDC& dc,
const wxRect& rect,
int row, int col,
bool isSelected)
{
dc.DrawRectangle(rect.GetX()-1, rect.GetY()-1, rect.GetWidth()+2, rect.GetHeight()+2);
dc.SetBackgroundMode( wxTRANSPARENT );
dc.SetTextForeground( grid.GetCellTextColour(row,col) );
dc.SetFont( grid.GetCellFont(row,col) );
dc.DrawText(grid.GetCellValue(row, col), rect.GetX()+5, rect.GetY());
}
};
//и потом
grid->SetCellRenderer(0,0, new MyGridCellRenderer);
Posted: Thu Jul 29, 2010 8:45 am
by Mojo
borr_1 wrote:Посмотри что у меня вышло с wxGridCellStringRenderer. единственная проблема при редактировании ячейки все сбивается
Code: Select all
class MyGridCellRenderer : public wxGridCellStringRenderer
{
public:
virtual void Draw(wxGrid& grid,
wxGridCellAttr& attr,
wxDC& dc,
const wxRect& rect,
int row, int col,
bool isSelected)
{
dc.DrawRectangle(rect.GetX()-1, rect.GetY()-1, rect.GetWidth()+2, rect.GetHeight()+2);
dc.SetBackgroundMode( wxTRANSPARENT );
dc.SetTextForeground( grid.GetCellTextColour(row,col) );
dc.SetFont( grid.GetCellFont(row,col) );
dc.DrawText(grid.GetCellValue(row, col), rect.GetX()+5, rect.GetY());
}
};
//и потом
grid->SetCellRenderer(0,0, new MyGridCellRenderer);
При редактировании ячейки и должно все сбиваться, потому, что во время редактирования рендерер отключается и включается editor ща попытаюсь твой код собрать....
добавлено:
Попробовал, идея хорошая без бордюра все работает, но когда рисую левый бордюр толще 3 пкс., то Rectangle растягивает его, на всю ячейку.... т.е. нужно повидимому передвигать текст не Rectangle, а путем прямого позиционирования текста...
Скорее всего, нужно копать в первом варианте который ты предложил.
Я делаю так:
Code: Select all
void LeftBorder::Draw(wxGrid& grid, wxGridCellAttr& attr, wxDC& dc, const wxRect& rect, int row, int col, bool isSelected)
{
wxGridCellStringRenderer::Draw(grid, attr, dc, rect, row, col, isSelected);
wxPen left_pen = wxPen();
left_pen.SetColour(0, 0, 0);
left_pen.SetWidth(3);
dc.SetPen( left_pen );
//dc.SetBrush(wxBrush(wxColour(255, 255, 255), wxTRANSPARENT));
//dc.SetClippingRegion(myrect);
//wxDCClipper clip(dc, rect);
wxRect myrect;
myrect.x = rect.x + 8;
myrect.y = rect.y + 2;
dc.DrawLine( rect.x, rect.y, rect.x, rect.y + rect.height);
grid.DrawTextRectangle(dc, grid.GetCellValue(row, col), myrect);
}
Но когда ввожу текст в ячейку, то он не позиционируется рендером, а непосредственно гридом, но когда начинаю кликать по ячейкам, то текст позиционируется рендером, но значение установленное в ячейке не стирается и получается два текста в ячейке, один тот который я ввел, а другой который считал и установил рендерер...
Вот картинка: