C++ DrawText刷新问题-文本消失

C++ DrawText刷新问题-文本消失,c++,gdi,drawtext,C++,Gdi,Drawtext,我正在使用Objective Grid,希望有一个网格单元控件,可以显示图标和文本。因此,我以RogueWave的示例()为例,对其进行如下修改 最初文本呈现正确,但如果我在网格中刷新相关单元格,文本将消失。如果我更新整个网格,或者甚至通过将单元格拖离屏幕再拖回来来刷新单元格,文本会重新出现,直到它再次消失。看起来像是油漆或油漆的问题,但我不知道如何解决它。有什么想法吗 谢谢 //----------------------------------------------------------

我正在使用Objective Grid,希望有一个网格单元控件,可以显示图标和文本。因此,我以RogueWave的示例()为例,对其进行如下修改

最初文本呈现正确,但如果我在网格中刷新相关单元格,文本将消失。如果我更新整个网格,或者甚至通过将单元格拖离屏幕再拖回来来刷新单元格,文本会重新出现,直到它再次消失。看起来像是油漆或油漆的问题,但我不知道如何解决它。有什么想法吗

谢谢

//------------------------------------------------------------------------------
void CGXIconControl::Draw(CDC* pDC, CRect rect, ROWCOL nRow, ROWCOL nCol, const CGXStyle& style, const CGXStyle* pStandardStyle)
//------------------------------------------------------------------------------
{
    BOOL b;

    ASSERT(pDC != NULL && pDC->IsKindOf(RUNTIME_CLASS(CDC)));
    // ASSERTION-> Invalid Device Context ->END
    ASSERT(nRow <= Grid()->GetRowCount() && nCol <= Grid()->GetColCount());
    // ASSERTION-> Cell coordinates out of range ->END
    ASSERT_VALID(pDC);
    DrawBackground(pDC, rect, style);
    pDC->SetBkMode(TRANSPARENT);

    if (rect.right <= rect.left || rect.Width() <= 1 || rect.Height() <= 1)
    {
        return;
    }
    CString str = style.GetIncludeValue() ? style.GetValue() : _T("");

    CString sTxtBefore = _T("");
    CString sTxtAfter = _T("");

    int nHAlign = style.GetHorizontalAlignment();
    int nVAlign = style.GetVerticalAlignment();

    // Save these value to restore them when done drawing
    COLORREF crOldTextColor = pDC->GetTextColor();
    COLORREF crOldBkColor = pDC->GetBkColor();

    if (!style.GetEnabled())
    {
        pDC->SetTextColor(::GetSysColor(COLOR_GRAYTEXT));
    }

    CBrush Brush;
    Brush.CreateSolidBrush(style.GetEnabled() ? ::GetSysColor(COLOR_WINDOWTEXT) : ::GetSysColor(COLOR_GRAYTEXT));
    LOGBRUSH lBrush = { 0 };
    Brush.GetLogBrush(&lBrush);
    CBrush* pOldBrush = (CBrush*)pDC->SelectStockObject(NULL_BRUSH);

    CPen linePen;
    linePen.CreatePen(PS_SOLID, 1, &lBrush);
    CPen* pOldPen = pDC->SelectObject(&linePen);

    // Set font bold if necessary
    CFont* pCurfont = pDC->GetCurrentFont();
    LOGFONT lf;
    CFont font;
    if (pCurfont)
    {
        pCurfont->GetLogFont(&lf);
    }

    if (style.GetFont().GetBold())
    {
        lf.lfWeight = FW_BOLD;
    }
    font.CreateFontIndirect(&lf);
    CFont* pOldFont = pDC->SelectObject(&font);

    int nIcoStart = str.Find(_T("#ICO"));
    if (nIcoStart == -1)
    {
        // We didn't find an icon indicator, so just draw the text
        pDC->DrawText(str, rect, DT_SINGLELINE|nHAlign|nVAlign);
    }
    else
    {
        sTxtBefore = str.Left(nIcoStart);
        CSize szBefore = pDC->GetTextExtent(sTxtBefore);

        int nIconEnd = str.Find(_T(")"), nIcoStart);
        CString strIDResource = str.Mid(nIcoStart + 5, nIconEnd - (nIcoStart + 5));
        UINT nIDResource = _ttoi(strIDResource);

        // Load the highest bit-depth available
        HICON hIcon = NULL;
        hIcon = LoadResourceIcon(nIDResource, m_nIconSize, m_nIconSize, 32);
        hIcon == NULL ? LoadResourceIcon(nIDResource, m_nIconSize, m_nIconSize, 24) : NULL;
        hIcon == NULL ? LoadResourceIcon(nIDResource, m_nIconSize, m_nIconSize, 16) : NULL;
        hIcon == NULL ? LoadResourceIcon(nIDResource, m_nIconSize, m_nIconSize, 8) : NULL;

        sTxtAfter = str.Right(str.GetLength() - nIconEnd - 1);
        CSize szAfter = pDC->GetTextExtent(sTxtAfter);

        CRect rectCell = CGXControl::GetCellRect(nRow, nCol, rect, &style);
        CRect rectBefore = rectCell;
        CRect rectAfter = rectCell;
        int nTotalWidth = szBefore.cx + m_nIconSize + szAfter.cx;

        // Calculate positions
        int nTop, nLeft;

        switch (nHAlign)
        {
            case DT_LEFT:
            {
                rectBefore.right = rectBefore.left + szBefore.cx;
                nLeft = rectBefore.right;
                rectAfter.left = nLeft + m_nIconSize;
                rectAfter.right = rectAfter.left + szAfter.cx;
            } break;

            case DT_CENTER:
            {
                rectBefore.left = (rectCell.right - rectCell.Width() / 2) - nTotalWidth / 2;
                rectBefore.right = rectBefore.left + szBefore.cx;

                nLeft = rectBefore.right;

                rectAfter.left = nLeft + m_nIconSize;
                rectAfter.right = rectAfter.left + szAfter.cx;
            } break;

            case DT_RIGHT:
            {
                // Work from the right
                rectAfter.right = rectCell.right;
                rectAfter.left = rectAfter.right - szAfter.cx;
                nLeft = rectAfter.left - m_nIconSize;
                rectBefore.right = nLeft;
                rectBefore.left = rectBefore.right - szBefore.cx;
            } break;
        }

        switch (nVAlign)
        {
            case DT_TOP:
                nTop = rectCell.top;
                break;

            case DT_VCENTER:
                nTop = rectCell.top + (rectCell.Height() / 2 - m_nIconSize / 2);
                break;

            case DT_BOTTOM:
                nTop = rectCell.bottom - m_nIconSize;
                break;
        }

        if (!sTxtBefore.IsEmpty())
        {
            pDC->DrawText(sTxtBefore, rectBefore, DT_SINGLELINE|nHAlign|nVAlign);
        }

        b = ::DrawIconEx(pDC->m_hDC, nLeft, nTop, hIcon, m_nIconSize, m_nIconSize, 0, NULL, DI_NORMAL);
        b = ::DestroyIcon(hIcon);

        if (!sTxtAfter.IsEmpty())
        {
            pDC->DrawText(sTxtAfter, rectAfter, DT_SINGLELINE|nHAlign|nVAlign);
        }
    }

    // Reset original values
    pDC->SetTextColor(crOldTextColor);
    pDC->SetBkColor(crOldBkColor);
    pDC->SelectObject(pOldBrush);
    pDC->SelectObject(pOldPen);
    pDC->SelectObject(pOldFont);

    // Child Controls: spin-buttons, hotspot, combobox btn, ...
    CGXControl::Draw(pDC, rect, nRow, nCol, style, pStandardStyle);
}
//------------------------------------------------------------------------------
无效CGXIconControl::Draw(CDC*pDC,rect rect,ROWCOL nRow,ROWCOL nCol,const CGXStyle&style,const CGXStyle*pStandardStyle)
//------------------------------------------------------------------------------
{
布尔b;
断言(pDC!=NULL&&pDC->IsKindOf(运行时类(CDC));
//断言->无效设备上下文->结束
断言(nRow GetRowCount()&&nCol GetColCount());
//断言->单元格坐标超出范围->结束
断言有效(pDC);
牵引地面(pDC、rect、style);
pDC->SetBkMode(透明);
if(rect.right SetTextColor(::GetSysColor(COLOR_GRAYTEXT));
}
CBrush刷;
CreateSolidBrush(style.GetEnabled()?::GetSysColor(COLOR\u WINDOWTEXT):::GetSysColor(COLOR\u GRAYTEXT));
LOGBRUSH lBrush={0};
grash.GetLogBrush(&lBrush);
CBrush*pOldBrush=(CBrush*)pDC->SelectStockObject(NULL_笔刷);
CPen-linePen;
linePen.CreatePen(PS_SOLID、1和lBrush);
CPen*pOldPen=pDC->SelectObject(&linePen);
//如有必要,将字体设置为粗体
CFont*pCurfont=pDC->GetCurrentFont();
LOGFONT-lf;
CFont字体;
如果(pCurfont)
{
pCurfont->GetLogFont(&lf);
}
if(style.GetFont().GetBold())
{
lf.lfWeight=FW_粗体;
}
font.CreateFontIndirect(&lf);
CFont*pOldFont=pDC->SelectObject(&font);
int nIcoStart=str.Find(_T(#ICO));
如果(开始==-1)
{
//我们没有找到图标指示器,所以只需绘制文本即可
pDC->DrawText(str、rect、DT|U单线| nAlign | nAlign);
}
其他的
{
sTxtBefore=str.Left(开始);
CSize szBefore=pDC->GetTextExtent(sTxtBefore);
int nIconEnd=str.Find(_T(“)”),nIcoStart);
CString strIDResource=str.Mid(nIcoStart+5,nIconEnd-(nIcoStart+5));
UINT NIDROURCE=_ttoi(strIDResource);
//加载可用的最高位深度
HICON-HICON=NULL;
hIcon=LoadResourceIcon(nIDResource,m_nIconSize,m_nIconSize,32);
hIcon==NULL?LoadResourceIcon(nIDResource,m_nIconSize,m_nIconSize,24):NULL;
hIcon==NULL?LoadResourceIcon(nIDResource,m_nIconSize,m_nIconSize,16):NULL;
hIcon==NULL?LoadResourceIcon(nIDResource,m_nIconSize,m_nIconSize,8):NULL;
sTxtAfter=str.Right(str.GetLength()-nIconEnd-1);
CSize szAfter=pDC->GetTextExtent(sTxtAfter);
正确的rectCell=CGXControl::GetCellRect(nRow、nCol、rect和style);
正确的直肠前=直肠细胞;
正确的直肠后=直肠细胞;
int nTotalWidth=szBefore.cx+m_nIconSize+szAfter.cx;
//计算位置
int nTop,nLeft;
开关(nAlign)
{
案例DT_左:
{
rectBefore.right=rectBefore.left+szBefore.cx;
nLeft=rectBefore.right;
rectAfter.left=nLeft+m_nIconSize;
rectfeater.right=rectfeater.left+szAfter.cx;
}中断;
案例研究中心:
{
rectBefore.left=(rectCell.right-rectCell.Width()/2)-nTotalWidth/2;
rectBefore.right=rectBefore.left+szBefore.cx;
nLeft=rectBefore.right;
rectAfter.left=nLeft+m_nIconSize;
rectfeater.right=rectfeater.left+szAfter.cx;
}中断;
案例右:
{
//从右边做起
rectfeater.right=rectCell.right;
rectfeater.left=rectfeater.right-szAfter.cx;
nLeft=rectfafter.left-m_nIconSize;
rectBefore.right=nLeft;
rectBefore.left=rectBefore.right-szBefore.cx;
}中断;
}
开关(nVAlign)
{
案例DT_顶部:
nTop=rectCell.top;
打破
案例DT_VCENTER:
nTop=rectCell.top+(rectCell.Height()/2-m_nIconSize/2);
打破
案例DT_底部:
nTop=rectCell.bottom-m_nIconSize;
打破
}
如果(!sTxtBefore.IsEmpty())
{
pDC->DrawText(sTxtBefore、rectBefore、DT|u SINGLELINE | nAlign | nAlign);
}
b=::DrawIconEx(pDC->m_hDC,nLeft,nTop,hIcon,m_nIconSize,m_nIconSize,0,NULL,DI_NORMAL);
b=::破坏图标(hIcon);
如果(!sTxtAfter.IsEmpty())
{
pDC->DrawText(sTxtAfter、rectAfter、DT|u SINGLELINE | nAlign | nAlign);
}
}
//重置原始值
pDC->SetTextColor(crOldTextColor);
pDC->SetBkColor(crOldBkColor);
pDC->SelectObject(pOldBrush);
pDC->选择对象(pOldPen);
pDC->选择对象(pOldFont);
//子控件:旋转按钮,热点,组合框btn。。。
CGXControl::Draw(pDC、rect、nRow、nCol、style、pStandardStyle);
}

删除所有这些代码,只需使用默认字体、画笔和钢笔画出文本“hello”,这种情况还会发生吗?如果是这样,那么它可能与此特定代码无关。请尝试删除
CBrush*pOldBrush=(CBrush*)pDC->SelectStockObject(NULL_笔刷)
和刚刚从DCU获得画笔在涉及用户交互和/或绘画的情况下,我
::嘟嘟声
事件以不影响焦点(通过点击断点并结束而最终丢失)