Forum
Please
Log In
to post a new message or reply to an existing one. If you are not registered, please
register.
NOTE: Some forums may be read-only if you are not currently subscribed to
our technical support services.
Subject |
Author |
Date |
|
Rado Manzela
|
Apr 7, 2011 - 6:52 AM
|
I set background color of cell this way:
c->BackColorSet(CExtGridCell::__ECS_NORMAL,bc); c->BackColorSet(CExtGridCell::__ECS_READ_ONLY,bc);
it works, but problem is that when I select the cell (full row selection), then I focus control outside the grid, selection is hidden (it’s ok), but cell is drawn with default white background. Can you fix it please? Thank you.
|
|
Technical Support
|
Apr 13, 2011 - 2:21 AM
|
We fixed colored cells handling code. Now BackColorSet() API works like you requested. Thank you. Please update the source code for the following two methods:
COLORREF CExtGridCell::OnQueryTextColor(
const CExtGridWnd & wndGrid,
CDC & dc,
LONG nVisibleColNo,
LONG nVisibleRowNo,
LONG nColNo,
LONG nRowNo,
INT nColType,
INT nRowType,
DWORD dwAreaFlags,
DWORD dwHelperPaintFlags
) const
{
__EXT_DEBUG_GRID_ASSERT_VALID( this );
if( (dwHelperPaintFlags&__EGCPF_PRINTING_TARGET_MASK) != 0 )
{
COLORREF clr = TextColorGet( CExtGridCell::__ECS_PPV );
if( clr == COLORREF(-1L) )
clr = TextColorGet( CExtGridCell::__ECS_ALL );
return clr;
}
COLORREF clr = // COLORREF(-1L); // use current DC text color if COLORREF(-1L)
wndGrid.OnGridCellQueryTextColor( *this, dc, nVisibleColNo, nVisibleRowNo, nColNo, nRowNo, nColType, nRowType, dwAreaFlags, dwHelperPaintFlags );
if( clr != COLORREF(-1L) )
return clr;
clr = TextColorGet( __ECS_ALL );
if( clr != COLORREF(-1L) )
return clr;
clr = COLORREF(-1L);
bool bHoverByColumn = ( (dwHelperPaintFlags&__EGCPF_HOVER_BY_COLUMN) != 0 ) ? true : false;
bool bHoverByRow = ( (dwHelperPaintFlags&__EGCPF_HOVER_BY_ROW) != 0 ) ? true : false;
bool bHighlightedBySelectedColumn = ( (dwHelperPaintFlags&__EGCPF_HIGHLIGHTED_BY_SELECTED_COLUMN) != 0 ) ? true : false;
bool bHighlightedBySelectedRow = ( (dwHelperPaintFlags&__EGCPF_HIGHLIGHTED_BY_SELECTED_ROW) != 0 ) ? true : false;
bool bHighlightedByFocusedColumn = ( (dwHelperPaintFlags&__EGCPF_HIGHLIGHTED_BY_FOCUSED_COLUMN) != 0 ) ? true : false;
bool bHighlightedByFocusedRow = ( (dwHelperPaintFlags&__EGCPF_HIGHLIGHTED_BY_FOCUSED_ROW) != 0 ) ? true : false;
bool bFocusedControl = ( (dwHelperPaintFlags&__EGCPF_FOCUSED_CONTROL) != 0 ) ? true : false;
bool bHighlightPressing = ( (dwHelperPaintFlags&(__EGCPF_HIGHLIGHTED_BY_PRESSED_COLUMN|__EGCPF_HIGHLIGHTED_BY_PRESSED_ROW)) != 0 ) ? true : false;
bool bReadOnly = ( ( GetStyle() & __EGCS_READ_ONLY ) != 0 ) ? true : false;
if( bHighlightPressing )
clr = TextColorGet( __ECS_HIGHLIGHT_PRESSING );
else if( bHighlightedByFocusedColumn || bHighlightedByFocusedRow )
clr = TextColorGet( __ECS_HIGHLIGHT_BY_FOCUS );
else if( bHighlightedBySelectedColumn || bHighlightedBySelectedRow )
clr = TextColorGet( __ECS_HIGHLIGHT_BY_SELECTION );
else if( bHoverByColumn && bHoverByRow )
clr = TextColorGet( __ECS_HOVERED );
else if( bHoverByColumn || bHoverByRow )
clr = TextColorGet( __ECS_HIGHLIGHT_BY_HOVER );
else if( ( dwAreaFlags & __EGBWA_OUTER_CELLS ) == 0
&& ( bFocusedControl || wndGrid.NoHideSelectionGet() )
&& wndGrid.SelectionGetForCellPainting( nColNo, nRowNo )
)
clr = TextColorGet( __ECS_SELECTED );
else if( bReadOnly )
clr = TextColorGet( __ECS_READ_ONLY );
else
clr = TextColorGet( __ECS_NORMAL );
if( clr != COLORREF(-1L) )
return clr;
if( bFocusedControl )
{
if( bHighlightPressing )
clr = wndGrid.OnSiwGetSysColor( COLOR_HIGHLIGHTTEXT );
else
{
if( ( dwAreaFlags & __EGBWA_OUTER_CELLS ) != 0 )
{
if( bHoverByColumn
|| bHoverByRow
|| bHighlightedBySelectedColumn
|| bHighlightedBySelectedRow
|| bHighlightedByFocusedColumn
|| bHighlightedByFocusedRow
)
clr = wndGrid.OnSiwGetSysColor( COLOR_HIGHLIGHTTEXT );
} // if( ( dwAreaFlags & __EGBWA_OUTER_CELLS ) != 0 )
else
if( wndGrid.SelectionGetForCellPainting( nColNo, nRowNo ) )
clr = wndGrid.OnSiwGetSysColor( COLOR_HIGHLIGHTTEXT );
} // else from if( bHighlightPressing )
} // if( bFocusedControl )
if( clr != COLORREF(-1L) )
return clr;
if( bReadOnly )
clr = wndGrid.OnSiwGetReadOnlyTextColor();
return clr;
}
COLORREF CExtGridCell::OnQueryBackColor(
const CExtGridWnd & wndGrid,
CDC & dc,
LONG nVisibleColNo,
LONG nVisibleRowNo,
LONG nColNo,
LONG nRowNo,
INT nColType,
INT nRowType,
DWORD dwAreaFlags,
DWORD dwHelperPaintFlags
) const
{
__EXT_DEBUG_GRID_ASSERT_VALID( this );
COLORREF clr = // COLORREF(-1L); // use current DC back color if COLORREF(-1L)
wndGrid.OnGridCellQueryBackColor( *this, dc, nVisibleColNo, nVisibleRowNo, nColNo, nRowNo, nColType, nRowType, dwAreaFlags, dwHelperPaintFlags );
if( clr != COLORREF(-1L) )
return clr;
if( IsInvisible() )
return COLORREF(-1L);
if( (dwHelperPaintFlags&__EGCPF_PRINTING_TARGET_MASK) != 0 )
{
COLORREF clr = BackColorGet( CExtGridCell::__ECS_PPV );
if( clr == COLORREF(-1L) )
clr = BackColorGet( CExtGridCell::__ECS_ALL );
return clr;
}
clr = BackColorGet( __ECS_ALL );
if( clr != COLORREF(-1L) )
return clr;
clr = COLORREF(-1L);
bool bHoverByColumn = ( (dwHelperPaintFlags&__EGCPF_HOVER_BY_COLUMN) != 0 ) ? true : false;
bool bHoverByRow = ( (dwHelperPaintFlags&__EGCPF_HOVER_BY_ROW) != 0 ) ? true : false;
bool bHighlightedBySelectedColumn = ( (dwHelperPaintFlags&__EGCPF_HIGHLIGHTED_BY_SELECTED_COLUMN) != 0 ) ? true : false;
bool bHighlightedBySelectedRow = ( (dwHelperPaintFlags&__EGCPF_HIGHLIGHTED_BY_SELECTED_ROW) != 0 ) ? true : false;
bool bHighlightedByFocusedColumn = ( (dwHelperPaintFlags&__EGCPF_HIGHLIGHTED_BY_FOCUSED_COLUMN) != 0 ) ? true : false;
bool bHighlightedByFocusedRow = ( (dwHelperPaintFlags&__EGCPF_HIGHLIGHTED_BY_FOCUSED_ROW) != 0 ) ? true : false;
bool bFocusedControl = ( (dwHelperPaintFlags&__EGCPF_FOCUSED_CONTROL) != 0 ) ? true : false;
bool bHighlightPressing = ( (dwHelperPaintFlags&(__EGCPF_HIGHLIGHTED_BY_PRESSED_COLUMN|__EGCPF_HIGHLIGHTED_BY_PRESSED_ROW)) != 0 ) ? true : false;
bool bReadOnly = ( ( GetStyle() & __EGCS_READ_ONLY ) != 0 ) ? true : false;
if( bHighlightPressing )
clr = BackColorGet( __ECS_HIGHLIGHT_PRESSING );
else if( bHighlightedByFocusedColumn || bHighlightedByFocusedRow )
clr = BackColorGet( __ECS_HIGHLIGHT_BY_FOCUS );
else if( bHighlightedBySelectedColumn || bHighlightedBySelectedRow )
clr = BackColorGet( __ECS_HIGHLIGHT_BY_SELECTION );
else if( bHoverByColumn && bHoverByRow )
clr = BackColorGet( __ECS_HOVERED );
else if( bHoverByColumn || bHoverByRow )
clr = BackColorGet( __ECS_HIGHLIGHT_BY_HOVER );
else if( ( dwAreaFlags & __EGBWA_OUTER_CELLS ) == 0
&& ( bFocusedControl || wndGrid.NoHideSelectionGet() )
&& wndGrid.SelectionGetForCellPainting( nColNo, nRowNo )
)
clr = BackColorGet( __ECS_SELECTED );
else if( bReadOnly )
clr = BackColorGet( __ECS_READ_ONLY );
else
clr = BackColorGet( __ECS_NORMAL );
if( clr != COLORREF(-1L) )
return clr;
if( bFocusedControl )
{
if( bHighlightPressing )
clr = wndGrid.OnSiwGetSysColor( COLOR_HIGHLIGHT );
else
{
if( ( dwAreaFlags & __EGBWA_OUTER_CELLS ) != 0 )
{
if( bHoverByColumn
|| bHoverByRow
|| bHighlightedBySelectedColumn
|| bHighlightedBySelectedRow
|| bHighlightedByFocusedColumn
|| bHighlightedByFocusedRow
)
clr = wndGrid.OnSiwGetSysColor( COLOR_HIGHLIGHT );
} // if( ( dwAreaFlags & __EGBWA_OUTER_CELLS ) != 0 )
else
if( wndGrid.SelectionGetForCellPainting( nColNo, nRowNo ) )
clr = wndGrid.OnSiwGetSysColor( COLOR_HIGHLIGHT );
} // else from if( bHighlightPressing )
} // if( bFocusedControl )
if( clr != COLORREF(-1L) )
return clr;
if( bReadOnly )
clr = wndGrid.OnSiwGetReadOnlyBackgroundColor();
return clr;
}
|
|
Rado Manzela
|
Apr 14, 2011 - 7:55 AM
|
|
|
Technical Support
|
Apr 9, 2011 - 7:38 AM
|
If the CExtGridCell::BackColorSet() method does not cover cover your grid coloring tasks, you should implement the CExtGridCell::OnQueryBackColor() or CExtGridWnd::OnGridCellQueryBackColor() virtual method. If the dwHelperPaintFlags parameter contains both __EGCPF_HIGHLIGHTED_BY_FOCUSED_COLUMN and __EGCPF_HIGHLIGHTED_BY_FOCUSED_ROW flags then the method should return a background color for the focused cell.
|
|
Rado Manzela
|
Apr 12, 2011 - 8:20 AM
|
I’m using more types of cells so it would me lot of overloading and creating of new cell types. I’ve removed all BackColorSet() and tried to do this:
COLORREF CMyGridWnd::OnGbwQueryBackColor( CDC & dc, LONG nVisibleColNo, LONG nVisibleRowNo, LONG nColNo, LONG nRowNo, INT nColType, INT nRowType, DWORD dwAreaFlags, DWORD dwHelperPaintFlags ) const { TRACE("row=%d col=%d PF=%x\n",nRowNo,nColNo,dwHelperPaintFlags); if (nRowType == 0 && nColType == 0 && !(dwHelperPaintFlags&__EGCPF_HIGHLIGHTED_BY_SELECTED_ROW) && !(dwHelperPaintFlags&__EGCPF_HIGHLIGHTED_BY_FOCUSED_ROW) && !(dwHelperPaintFlags& __EGCPF_FOCUSED_CONTROL) ) { return RGB(255,0,0); }
return __super::OnGbwQueryBackColor( dc, nVisibleColNo, nVisibleRowNo, nColNo, nRowNo, nColType, nRowType, dwAreaFlags, dwHelperPaintFlags); }
but it is unusable, because I can see in trace output that when I select one row in grid, it is called for all cells only with __EGCPF_FOCUSED_CONTROL flag set (also for other rows, which are not selected). Is it another bug or am I missing something?
BTW BackColorSet() still has strange behaviour, I think it should correctly handle situation with unfocused grid when selection is hidden.
|
|