Page 1 of 1

wxGridCellStringRenderer и SelectCell

Posted: Wed Dec 05, 2012 6:43 am
by borr_1
Хочу подсвечивать определенные ячейки после попадания на них курсора делаю:

Code: Select all

class CursorCellRenderer : public wxGridCellStringRenderer
		{
		public:
			virtual void 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); //
				//////////////////////////////////////////////////////////////////////////////
				wxColor color;
				color.Set(73, 140, 214);
				if(row == grid.GetCursorRow() && col == grid.GetCursorColumn())
					dc.SetBrush(wxBrush(color));
				else
					dc.SetBrush(wxBrush(grid.GetDefaultCellBackgroundColour()));
				dc.DrawRectangle(rect);	
				dc.DrawText(grid.GetCellValue(row, col), rect.GetX()+3, rect.GetY()+3);
			}
		};

//и

GridJournal->SetDefaultRenderer(new CursorCellRenderer);
Но для того чтобы по перемещению курсора ячейка подсвечивалась нужно делать все тот же Grid->Refresh(). Можно как-нибудь обойтись без него?

Re: wxGridCellStringRenderer и SelectCell

Posted: Wed Dec 05, 2012 2:16 pm
by Mojo
А почему не нравится Refresh/ForceRefresh? Если это работает, то в чем проблема?

Re: wxGridCellStringRenderer и SelectCell

Posted: Wed Dec 05, 2012 4:59 pm
by Mojo
Еще не понятно, курсор двигается мышкой или клавиатурой? Если клавиатурой, то у меня вот это работает:

Code: Select all

// В GUI
m_grid1->Connect( wxEVT_GRID_SELECT_CELL, wxGridEventHandler( MainFrameBase::OnGridSelectCell ), NULL, this );

// В главном фрейме
void MainFrame::OnGridSelectCell( wxGridEvent& event )
{
    m_grid1->ForceRefresh();
    event.Skip();
}

Хоть и с Refresh, но работает все отлично.

Re: wxGridCellStringRenderer и SelectCell

Posted: Thu Dec 06, 2012 3:56 am
by borr_1
Какая разница чем он двигается, все равно селектцелл отрабатывает. Refresh/ForceRefresh нормально работает в Win 7 в более старых версиях Win видно мерцание при рефреш. И так бы мне не пришлось обрабатывать SelectCell и втыкать в него этот рефрешь - думал может я что-то не знаю.

Re: wxGridCellStringRenderer и SelectCell

Posted: Thu Dec 06, 2012 10:21 am
by Mojo
borr_1 wrote:Какая разница чем он двигается, все равно селектцелл отрабатывает. Refresh/ForceRefresh нормально работает в Win 7 в более старых версиях Win видно мерцание при рефреш. И так бы мне не пришлось обрабатывать SelectCell и втыкать в него этот рефрешь - думал может я что-то не знаю.
Ща проверил в Xubuntu 12.04 вообще не мерцает. Проверил в Win Vista не мерцает, но если клик попадает не в ячейку а на сетку, то заголовки рядов один раз моргает, но и то не каждый раз. Это все если мышкой кликать, если клавой, то вообще ничего не мерцает. Так же попробовал добавить кнопку и в нее рефреш, так же ничего не мерцает. Вечером на Win XP попробую, возможно, где-то у тебя, что-то не так.....

Re: wxGridCellStringRenderer и SelectCell

Posted: Thu Dec 06, 2012 12:23 pm
by borr_1
пошел проверил на машине с XP все нормально... вроде... выходит у меня подсознание что-то не то выдало

Re: wxGridCellStringRenderer и SelectCell

Posted: Thu Dec 06, 2012 2:41 pm
by Mojo
Я тоже проверил на ХР, работает отлично, даже при клике по сетке мерцания нет.

Re: wxGridCellStringRenderer и SelectCell

Posted: Sun Dec 09, 2012 2:05 pm
by amk_tt
Мерцание возникает оттого, что контрол сперва стирается, а на его место рисуется обновлённое изображение. Если на это уходит менее 1/20 секунды, глаз просто ничего не успевает заметить. Но иногда этого времени не хватает.
Двойная буферизация (как в 3D-графике), устраняющая мерцание, при отрисовке GUI как правило не используется.