如上图所示,背景图像使用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));
答案 0 :(得分:0)
问题是:你有一个带有背景图像的合成场景和一个透明的渲染文字;你想改变文字。所以 - 你需要先删除以前渲染的文本。
有两种方法可以做到:
TextOut()
之前,请取消该标签的边界矩形,并通过调用UpdateWindow()
强制立即绘制背景。