Professional UI Solutions
Site Map   /  Register
 
 

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.

Forums » Prof-UIS Tech Support » Cell border color bug Collapse All
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

thank you

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.