wxGrid: Как сделать отступы внутри я Topic is solved
-
- Super wx Problem Solver
- Posts: 401
- Joined: Wed Sep 21, 2005 8:17 am
- Location: Rostov-on-Don, Southern Russia
wxGrid: Как сделать отступы внутри я
Столкнулся с неожиданной проблемой.
Спрашивал у капиталистов, но они тоже не знают....
Нарисовал значится я борта ячейки методом wxGridCellRenderer вроде все нормально работает.
Но когда в ячейке текст, то расстояние от начала текста, до левого борта очень маленькое при толщине борта 1 пкс. а если толщина борта 2 пкс. то и вовсе текст прилипает к левому борту.
В HTML есть такое свойство "padding-left" специально для этих целей, что бы установить расстояние от левого края до начала текста.
Можно конечно добавить к тексту пробел, типа _T(" ") или отцентровать текст по середине, но первый вариант не красивый и главное не практичный, а второй вариант не подходит, потому как нужно что бы текст был слева.
Вобщем, нужно как-то сделать отступы слева внутри ячейки.
У кого какие есть идеи братва? Где копать? Тут главное идея и зацепка.....
Спрашивал у капиталистов, но они тоже не знают....
Нарисовал значится я борта ячейки методом wxGridCellRenderer вроде все нормально работает.
Но когда в ячейке текст, то расстояние от начала текста, до левого борта очень маленькое при толщине борта 1 пкс. а если толщина борта 2 пкс. то и вовсе текст прилипает к левому борту.
В HTML есть такое свойство "padding-left" специально для этих целей, что бы установить расстояние от левого края до начала текста.
Можно конечно добавить к тексту пробел, типа _T(" ") или отцентровать текст по середине, но первый вариант не красивый и главное не практичный, а второй вариант не подходит, потому как нужно что бы текст был слева.
Вобщем, нужно как-то сделать отступы слева внутри ячейки.
У кого какие есть идеи братва? Где копать? Тут главное идея и зацепка.....
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
-
- Super wx Problem Solver
- Posts: 362
- Joined: Wed Mar 07, 2007 8:10 am
- Location: Russia, Shakhty
Мужики переписывали wxGridCellStringRenderer
http://forums.wxwidgets.org/viewtopic.p ... light=icon
Там только осталось сделать
А там добавь отступы сам.
Как-то так. Или вообще перерисовать самому.
ЗЫ посмотри в сторону wxAdvTable
http://forums.wxwidgets.org/viewtopic.p ... light=icon
Там только осталось сделать
Code: Select all
grid.DrawTextRectangle(dc, grid.GetCellValue(row, col),
rect, hAlign, vAlign);
Как-то так. Или вообще перерисовать самому.
ЗЫ посмотри в сторону wxAdvTable
Last edited by borr_1 on Tue Jul 27, 2010 7:55 am, edited 1 time in total.
WinXP SP3, wx-2.8.10, MinGW-4.4.1, gdb-7.1.2, eclipse
-
- wxWorld Domination!
- Posts: 1471
- Joined: Tue Nov 14, 2006 7:58 am
- Location: Saint-Petersburg, Russia
Re: wxGrid: Как сделать отступы внутр
Так а сам текст внутри ячейки ты как выводишь? Если у тебя есть свой рендерер для рисования бордюра, что мешает самому и текст в ячейке рисовать (с нужными отступами)?Mojo wrote:Столкнулся с неожиданной проблемой.
Спрашивал у капиталистов, но они тоже не знают....
Нарисовал значится я борта ячейки методом wxGridCellRenderer вроде все нормально работает.
Но когда в ячейке текст, то расстояние от начала текста, до левого борта очень маленькое при толщине борта 1 пкс. а если толщина борта 2 пкс. то и вовсе текст прилипает к левому борту.
OS: Windows XP Pro
Compiler: MSVC++ 7.1
wxWidgets: 2.8.10
Compiler: MSVC++ 7.1
wxWidgets: 2.8.10
-
- Super wx Problem Solver
- Posts: 401
- Joined: Wed Sep 21, 2005 8:17 am
- Location: Rostov-on-Don, Southern Russia
Пасиб зёма, попробую, о результатах доложу позже.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
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
-
- Super wx Problem Solver
- Posts: 401
- Joined: Wed Sep 21, 2005 8:17 am
- Location: Rostov-on-Don, Southern Russia
Re: wxGrid: Как сделать отступы внутр
Текст в ячейке не рисую через рендерер, просто ввожу значение в ячеку как в Эселе или Калк (ОпенОфис) затем считываю через m_grid1->GetCellValue() и сохраняю содержимое ячеек и все настройки и свойства ячейки в xml-файле.tan wrote:Так а сам текст внутри ячейки ты как выводишь? Если у тебя есть свой рендерер для рисования бордюра, что мешает самому и текст в ячейке рисовать (с нужными отступами)?Mojo wrote:Столкнулся с неожиданной проблемой.
Спрашивал у капиталистов, но они тоже не знают....
Нарисовал значится я борта ячейки методом wxGridCellRenderer вроде все нормально работает.
Но когда в ячейке текст, то расстояние от начала текста, до левого борта очень маленькое при толщине борта 1 пкс. а если толщина борта 2 пкс. то и вовсе текст прилипает к левому борту.
Не знаю, как это будет выглядеть, если ввожу текст в ячейку вручную, а в ячейке рендерер для текста... получается, что мне нужно сначала считать значение ячейки, потом передать его рендереру, а затем рендерер должен снова установить значение этой ячейки? На сколько это будет эффективная логика.... не уверен...
Вообще концепцию я позаимствовал из 1С или из Экселя или из Калк, я ввожу значение ячеек, затем рисую ВИЗУАЛЬНО бордюры ячеек и сохраняю все в xml-файл.
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
-
- Super wx Problem Solver
- Posts: 401
- Joined: Wed Sep 21, 2005 8:17 am
- Location: Rostov-on-Don, Southern Russia
Можно конечно добавлять пробел между борюром и текстом, но если данные будут сохраняться в базу данных, или же считываться от туда, то каждый раз придется удалять или добалять пробел, если полей немного, это не заметно, а если 10 тыс, или 100 тыс. или миллион, то это будет замедлять работу проги....midisa wrote:Сталкивался с той же проблемой под windows, в различных репортах. Выход выбирал только один - Рисовал свои квадратики а уже в цикле смотрелось более менее красиво.
Во всех репортах край ячейки вплотную к тексту идет (из тех что видел) ComponentOne, Cristal Report, HexTeck...
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
-
- Super wx Problem Solver
- Posts: 401
- Joined: Wed Sep 21, 2005 8:17 am
- Location: Rostov-on-Don, Southern Russia
Похоже, что действительно копать нужно тут, именно в grid. .... эта идея заинтересовала....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
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
-
- Super wx Problem Solver
- Posts: 401
- Joined: Wed Sep 21, 2005 8:17 am
- Location: Rostov-on-Don, Southern Russia
Ничего не получается..... через grid.DrawTextRectangle(dc, grid.GetCellValue(row, col), rect, hAlign, vAlign); вроде бы должно работать, но при запуске текст позиционеруется не рендером а по умолчанию, только если кликать по ячейкам то позиционируется как надо, но старый текст остается на прежнем месте, т.е. в одной ячейке два текста, один из рендерера, а другой из ячейки. Вроде бы простая задача, отступ слева, но в wxGrid решить целая проблема.....
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
-
- Super wx Problem Solver
- Posts: 362
- Joined: Wed Mar 07, 2007 8:10 am
- Location: Russia, Shakhty
А как ты им пользуешься. wxGrid переписываешь?
http://forums.wxwidgets.org/viewtopic.p ... ngrenderer
http://forums.wxwidgets.org/viewtopic.p ... ngrenderer
WinXP SP3, wx-2.8.10, MinGW-4.4.1, gdb-7.1.2, eclipse
-
- Super wx Problem Solver
- Posts: 401
- Joined: Wed Sep 21, 2005 8:17 am
- Location: Rostov-on-Don, Southern Russia
Нет, просто в методе Draw там где я рисую бордюры, там же и пытаюсь нарисовать текст...borr_1 wrote:А как ты им пользуешься. wxGrid переписываешь?
http://forums.wxwidgets.org/viewtopic.p ... ngrenderer
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
-
- Super wx Problem Solver
- Posts: 362
- Joined: Wed Mar 07, 2007 8:10 am
- Location: Russia, Shakhty
Надо наследоваться от wxGrid и так как у wxGrid метод DrawTextRectangle не виртуальный нужно просто скопировать код в твой класс-наследник и отрехтовать его как тебе надо. Вот еть пример в сетиMojo wrote: Нет, просто в методе Draw там где я рисую бордюры, там же и пытаюсь нарисовать текст...
http://boinc.berkeley.edu/svn/branches/ ... idCtrl.cpp
http://boinc.berkeley.edu/svn/branches/ ... GridCtrl.h
Он хоть и громоздкий, но мне как-то помог.
WinXP SP3, wx-2.8.10, MinGW-4.4.1, gdb-7.1.2, eclipse
-
- Super wx Problem Solver
- Posts: 401
- Joined: Wed Sep 21, 2005 8:17 am
- Location: Rostov-on-Don, Southern Russia
Спасибо borr за интересные файлы кажись это то, что нужно!borr_1 wrote:Надо наследоваться от wxGrid и так как у wxGrid метод DrawTextRectangle не виртуальный нужно просто скопировать код в твой класс-наследник и отрехтовать его как тебе надо. Вот еть пример в сетиMojo wrote: Нет, просто в методе Draw там где я рисую бордюры, там же и пытаюсь нарисовать текст...
http://boinc.berkeley.edu/svn/branches/ ... idCtrl.cpp
http://boinc.berkeley.edu/svn/branches/ ... GridCtrl.h
Он хоть и громоздкий, но мне как-то помог.
Я пытался именно через DrawTextRectangle рисовать текст, но его почему-то не видно, только когда кликаю по гриду, он проскакивает в верхней первой ячейке, хотя я его позиционировал во второй....
Ща попробую, сделать как в этих файлах... о результатах отчитаюсь.
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
-
- Super wx Problem Solver
- Posts: 362
- Joined: Wed Mar 07, 2007 8:10 am
- Location: Russia, Shakhty
Посмотри что у меня вышло с 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);
WinXP SP3, wx-2.8.10, MinGW-4.4.1, gdb-7.1.2, eclipse
-
- Super wx Problem Solver
- Posts: 401
- Joined: Wed Sep 21, 2005 8:17 am
- Location: Rostov-on-Don, Southern Russia
При редактировании ячейки и должно все сбиваться, потому, что во время редактирования рендерер отключается и включается editor ща попытаюсь твой код собрать....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);
добавлено:
Попробовал, идея хорошая без бордюра все работает, но когда рисую левый бордюр толще 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);
}
Вот картинка:
Last edited by Mojo on Thu Jul 29, 2010 9:17 am, edited 1 time in total.
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0