没有fillsolidrect函数的MFC Paint值

时间:2016-05-12 05:44:40

标签: c++ mfc

如上图所示,背景图像使用CDC绘制,图像是资源图像项,否则永远不会重绘。

现在,我将重新绘制背景图像上的值,使用cclientdc绘制,

但是当我使用setbackmode(TRANSPARENT)时,该值将恢复。

所以我使用CRect FillSolidRect绘制白色背景

如何在不使用白色背景的情况下重新绘制值。

CClientDC dc(this);

dc.SelectObject(&fontTextMode);

dc.TextOutW(rectClient.right - 100,
                rectClient.bottom - 100,
                _T("Picture"),
                8);

for(int i=0; i< GetRealTestPoint(); i ++)
{
dc.SetTextColor(RealArray.GetAt(i).GetCurveColor());

        dc.FillSolidRect(sRealPictureMode.aryRectData[i], RGB(255,255,255));

        dc.SetBkMode(TRANSPARENT);

        strOutput.Format(_T("%s"), 
            RealArray[i].GetCurveName());
        dc.DrawText(strOutput, sRealPictureMode.aryRectName[i], DT_LEFT);

        if(abs(fTestAvgTemp - RealArray[i].GetCurrentData()) <= 5 && i < GetRealTestPoint())
        {
            strOutput.Format(_T("%.2f (%.2f)"), 
                RealArray[i].GetCurrentData(), fTestAvgTemp - RealArray[i].GetCurrentData());
        } else {
            strOutput.Format(_T("%.2f"), 
                RealArray[i].GetCurrentData());
        }
        if (i < 15)
        {
            if ((fTestAvgTemp + fTestTolerateTemp) > RealArray[i].GetCurrentData() &&
                (fTestAvgTemp - fTestTolerateTemp) < RealArray[i].GetCurrentData())
            {
                dc.SetTextColor(RGB(0, 255, 0));
            }
            else
            {
                dc.SetTextColor(RGB(255, 0, 0));
            }
        } 
        else
        {
            dc.SetTextColor(RGB(0, 0, 0));
        }

        dc.TextOutW(sRealPictureMode.aryRectData[i].left,
                    sRealPictureMode.aryRectData[i].top,
                    strOutput,
                    strOutput.GetLength());
        //sRealPictureMode.aryStcData[i]->SetWindowTextW(strOutput);
    }
    ReleaseDC(&dc);

绘制背景(代码将绘制一次)

CBitmap bmp;
int bmWidth = 0;
int bmHeight = 0;

BITMAP bm;

// 計算圖片長寬
if(nSelPic == RECORD_NINE_TEST_POINT)
{
    bmp.LoadBitmapW(IDB_BITMAP_RECORD_NINE_TEST);
}

if(nSelPic == RECORD_FIFTEEN_TEST_POINT)
{
    bmp.LoadBitmapW(IDB_BITMAP_RECORD_FIFTEEN_TEST);
}

bmp.GetBitmap( &bm );
bmWidth = bm.bmWidth;
bmHeight = bm.bmHeight;

CClientDC dc(this);

dc.FillSolidRect(sRealtimeRect.rectCurve, RGB(255, 255, 255));

dc.Rectangle(sRealtimeRect.rectCurve.left,
    sRealtimeRect.rectCurve.top,
    bmWidth,
    bmHeight);

/*CBrush brush(&bmp);
dc.FillRect(CRect(sRealtimeRect.rectCurve.left,
sRealtimeRect.rectCurve.top,
sRealtimeRect.rectCurve.Width(),
sRealtimeRect.rectCurve.Height()),
&brush);*/
CDC dcMem;
if(dcMem.m_hDC == NULL) dcMem.CreateCompatibleDC(&dc);
// select the source bitmao into the memory DC
CBitmap* pOldBitmap = (CBitmap*)dcMem.SelectObject(&bmp);
// get the bitmap data
BITMAP bbmp = {0};
bmp.GetBitmap(&bbmp);
// transfer the bitmap into paint DC using a transparent color  
dc.TransparentBlt(sRealtimeRect.rectCurve.left, sRealtimeRect.rectCurve.top, bmWidth, bmHeight, // destination coordinates and sizes
    &dcMem,                            // source DC
    0, 0, bmWidth, bmHeight,   // source coordinates and sizes
    RGB(0, 0, 0));                   // transparent color
// restore DC / free GDI objects 
dcMem.SelectObject(pOldBitmap);
pOldBitmap = NULL;

我按以下方式更改代码

//dc.FillSolidRect(sRealPictureMode.aryRectData[i], RGB(255,255,255));

UpdateWindow();

dc.SetBkMode(TRANSPARENT);
//dc.SetBkColor(GetSysColor(COLOR_WINDOWTEXT));

glob

1 个答案:

答案 0 :(得分:0)

问题是:你有一个带有背景图像的合成场景和一个透明的渲染文字;你想改变文字。所以 - 你需要先删除以前渲染的文本。

有两种方法可以做到:

  1. 在致电TextOut()之前,请取消该标签的边界矩形,并通过调用UpdateWindow()强制立即绘制背景。
  2. 同样可以通过为每个标签创建透明窗口并简单地更新其文本来实现。