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

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

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

Post by Mojo »

Столкнулся с неожиданной проблемой.

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

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

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

Image

В HTML есть такое свойство "padding-left" специально для этих целей, что бы установить расстояние от левого края до начала текста.


Можно конечно добавить к тексту пробел, типа _T(" ") или отцентровать текст по середине, но первый вариант не красивый и главное не практичный, а второй вариант не подходит, потому как нужно что бы текст был слева.

Вобщем, нужно как-то сделать отступы слева внутри ячейки.

У кого какие есть идеи братва? Где копать? Тут главное идея и зацепка.....
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post 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
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
tan
wxWorld Domination!
wxWorld Domination!
Posts: 1471
Joined: Tue Nov 14, 2006 7:58 am
Location: Saint-Petersburg, Russia

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

Post by tan »

Mojo wrote:Столкнулся с неожиданной проблемой.

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

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

Но когда в ячейке текст, то расстояние от начала текста, до левого борта очень маленькое при толщине борта 1 пкс. а если толщина борта 2 пкс. то и вовсе текст прилипает к левому борту.
Так а сам текст внутри ячейки ты как выводишь? Если у тебя есть свой рендерер для рисования бордюра, что мешает самому и текст в ячейке рисовать (с нужными отступами)?
OS: Windows XP Pro
Compiler: MSVC++ 7.1
wxWidgets: 2.8.10
midisa
Earned some good credits
Earned some good credits
Posts: 113
Joined: Tue Jun 22, 2010 4:15 pm
Contact:

Post by midisa »

Сталкивался с той же проблемой под windows, в различных репортах. Выход выбирал только один - Рисовал свои квадратики :-) а уже в цикле смотрелось более менее красиво.

Во всех репортах край ячейки вплотную к тексту идет (из тех что видел) ComponentOne, Cristal Report, HexTeck...
Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Post 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
Пасиб зёма, попробую, о результатах доложу позже.
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

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

Post by Mojo »

tan wrote:
Mojo wrote:Столкнулся с неожиданной проблемой.

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

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

Но когда в ячейке текст, то расстояние от начала текста, до левого борта очень маленькое при толщине борта 1 пкс. а если толщина борта 2 пкс. то и вовсе текст прилипает к левому борту.
Так а сам текст внутри ячейки ты как выводишь? Если у тебя есть свой рендерер для рисования бордюра, что мешает самому и текст в ячейке рисовать (с нужными отступами)?
Текст в ячейке не рисую через рендерер, просто ввожу значение в ячеку как в Эселе или Калк (ОпенОфис) затем считываю через m_grid1->GetCellValue() и сохраняю содержимое ячеек и все настройки и свойства ячейки в xml-файле.

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

Вообще концепцию я позаимствовал из 1С или из Экселя или из Калк, я ввожу значение ячеек, затем рисую ВИЗУАЛЬНО бордюры ячеек и сохраняю все в xml-файл.
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Post by Mojo »

midisa wrote:Сталкивался с той же проблемой под windows, в различных репортах. Выход выбирал только один - Рисовал свои квадратики :-) а уже в цикле смотрелось более менее красиво.

Во всех репортах край ячейки вплотную к тексту идет (из тех что видел) ComponentOne, Cristal Report, HexTeck...
Можно конечно добавлять пробел между борюром и текстом, но если данные будут сохраняться в базу данных, или же считываться от туда, то каждый раз придется удалять или добалять пробел, если полей немного, это не заметно, а если 10 тыс, или 100 тыс. или миллион, то это будет замедлять работу проги....
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Post 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. .... эта идея заинтересовала....
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Post by Mojo »

Ничего не получается..... через 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
borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post by borr_1 »

А как ты им пользуешься. wxGrid переписываешь?

http://forums.wxwidgets.org/viewtopic.p ... ngrenderer
WinXP SP3, wx-2.8.10, MinGW-4.4.1, gdb-7.1.2, eclipse
Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Post by Mojo »

borr_1 wrote:А как ты им пользуешься. wxGrid переписываешь?

http://forums.wxwidgets.org/viewtopic.p ... ngrenderer
Нет, просто в методе Draw там где я рисую бордюры, там же и пытаюсь нарисовать текст...
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post 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

Он хоть и громоздкий, но мне как-то помог.
WinXP SP3, wx-2.8.10, MinGW-4.4.1, gdb-7.1.2, eclipse
Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Post 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 рисовать текст, но его почему-то не видно, только когда кликаю по гриду, он проскакивает в верхней первой ячейке, хотя я его позиционировал во второй....

Ща попробую, сделать как в этих файлах... о результатах отчитаюсь.
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post 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);	
WinXP SP3, wx-2.8.10, MinGW-4.4.1, gdb-7.1.2, eclipse
Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Post 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
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
Post Reply