Page 1 of 2

wxGrid: Как сделать отступы внутри я

Posted: Tue Jul 27, 2010 6:58 am
by Mojo
Столкнулся с неожиданной проблемой.

Спрашивал у капиталистов, но они тоже не знают....

Нарисовал значится я борта ячейки методом wxGridCellRenderer вроде все нормально работает.

Но когда в ячейке текст, то расстояние от начала текста, до левого борта очень маленькое при толщине борта 1 пкс. а если толщина борта 2 пкс. то и вовсе текст прилипает к левому борту.

Image

В 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
А как ты им пользуешься. wxGrid переписываешь?

http://forums.wxwidgets.org/viewtopic.p ... ngrenderer

Posted: Thu Jul 29, 2010 6:41 am
by Mojo
borr_1 wrote:А как ты им пользуешься. wxGrid переписываешь?

http://forums.wxwidgets.org/viewtopic.p ... ngrenderer
Нет, просто в методе 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_1 wrote:
Mojo wrote: Нет, просто в методе Draw там где я рисую бордюры, там же и пытаюсь нарисовать текст...
Надо наследоваться от wxGrid и так как у wxGrid метод DrawTextRectangle не виртуальный нужно просто скопировать код в твой класс-наследник и отрехтовать его как тебе надо. Вот еть пример в сети
http://boinc.berkeley.edu/svn/branches/ ... idCtrl.cpp
http://boinc.berkeley.edu/svn/branches/ ... GridCtrl.h

Он хоть и громоздкий, но мне как-то помог.
Спасибо 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); 

}

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

Вот картинка:

Image