用bitblt画背景图不成功!

tokens 2008-12-31 09:50:02
以前画背景图,一般都在onPaint(), Erase背景时用,一般用CDC memDC,
画好后,再bitblt到背景上,从没出过问题..

现在需要用到timer来控件背景中某一块区域色彩变化(不用控件)
就设2000ms刷新背景,但就是不成功..

没办法,写了个测试程序,才发现只有第一次能成功.后来就不正确了..

initdialog里做初始化:
m_BkgMap.LoadBitmap( IDB_TEST ); //IDB_TEST为一张黄色的图,现在做得和窗口一样大来测试
m_TimeRect = CRect(40, 40, 40+65, 40+60 );
SetTimer( 1, 2000, NULL );

在ontimer()中调用此函数:

void CmyestDlg::showTime( )
{
static int testit = 1;
CDC *myDC = GetDC();
CDC memDC;
memDC.CreateCompatibleDC(myDC);

#if 0
//如果每次都选入图,就成功.
CBitmap tmpBmp;
tmpBmp.LoadBitmap( IDB_TEST );
CBitmap *oldBmp = memDC.SelectObject(&tmpBmp);
#else
//m_BkgMap已经事先选入的,就只能第1次成功.(m_BkgMap没在其他地方用)
CBitmap *oldBmp = memDC.SelectObject(&m_BkgMap);
#endif
if( testit % 2 )
{
myDC->BitBlt(m_TimeRect.left, m_TimeRect.top, m_TimeRect.Width(), m_TimeRect.Height(), &memDC,m_TimeRect.left, m_TimeRect.top,SRCCOPY);
TRACE0("do it---\n");
goto abcde;
}

memDC.FillSolidRect(m_TimeRect, RGB(255,0,0));
myDC->BitBlt(m_TimeRect.left, m_TimeRect.top, m_TimeRect.Width(), m_TimeRect.Height(), &memDC,m_TimeRect.left, m_TimeRect.top,SRCCOPY);

abcde:
testit ++;
memDC.SelectObject( oldBmp );
memDC.DeleteDC();
}

这只是一个测试程序,按逻辑应该是显示黄,红,黄,红....
但真实的却是黄,红,红,红....

...全文
279 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
tokens 2008-12-31
  • 打赏
  • 举报
回复
半天打不开csdn,
IDB_TEST 是一幅黄色的图

91program,要发工程给你看吗
91program 2008-12-31
  • 打赏
  • 举报
回复
噢!看懂了。

LZ打印一下testit 的值看看。
91program 2008-12-31
  • 打赏
  • 举报
回复
在OnTimer中,LZ只设置了红色,并没有设置黄色啊!

所以后继显示的都是红色。
91program 2008-12-31
  • 打赏
  • 举报
回复
LZ的黄色在哪里设置的?
tokens 2008-12-31
  • 打赏
  • 举报
回复
if( testit % 2 )
{
//这里本应该每次都是显示背景图的黄色的,但现实却只有第1次.
myDC->BitBlt(m_TimeRect.left, m_TimeRect.top, m_TimeRect.Width(), m_TimeRect.Height(), &memDC,m_TimeRect.left, m_TimeRect.top,SRCCOPY);
TRACE0("do it---\n");
goto abcde;
}
tokens 2008-12-31
  • 打赏
  • 举报
回复
那里有#if 0 #else #endif 控制着..
并写了说明了.
wade_2003 2008-12-31
  • 打赏
  • 举报
回复

我觉得是这里有问题:两个取相同的变量名?LZ再研究研究。

CBitmap *oldBmp = memDC.SelectObject(&tmpBmp);
#else
//m_BkgMap已经事先选入的,就只能第1次成功.(m_BkgMap没在其他地方用)
CBitmap *oldBmp = memDC.SelectObject(&m_BkgMap);
tokens 2008-12-31
  • 打赏
  • 举报
回复
1.坐标没问题地,我要的就是那样的坐标.

2.
ReleaseDC(myDC)加过,
myDC->DeleteDC();也加过,和这个无关.

3.和
bmp = CreateCompatibleBitmap(*myDC,65,60);

oldBitmap = (HBITMAP *)SelectObject(memDC,bmp);
这两行有关..

如果把这两行去掉,并改m_TimeRect = CRect(0, 0, 65, 60 );
也是一样的效果的.
91program 2008-12-31
  • 打赏
  • 举报
回复
第一:坐标不对!
第二:GetDC后必须调用ReleaseDC

接下来是代码的问题,FillSolidRect绘图失败!
下面的代码可以实现,LZ自己研究研究:
static int testit = 1;
CDC *myDC = GetDC();
CDC memDC;
CBitmap *oldBmp;
HBITMAP bmp,*oldBitmap;

memDC.CreateCompatibleDC(myDC);
bmp = CreateCompatibleBitmap(*myDC,65,60);
oldBmp = memDC.SelectObject(&m_BkgMap);

//m_BkgMap已经事先选入的,就只能第1次成功.(m_BkgMap没在其他地方用)

RETAILMSG(1,(TEXT("==%d\r\n"),testit));
if( testit % 2 )
{
//memDC.FillSolidRect(m_TimeRect, RGB(255,255,0));
myDC->BitBlt(m_TimeRect.left, m_TimeRect.top, m_TimeRect.Width(), m_TimeRect.Height(), &memDC,0, 0,SRCCOPY);
TRACE0("do it---\n");
goto abcde;
}

oldBitmap = (HBITMAP *)SelectObject(memDC,bmp);
memDC.FillSolidRect(m_TimeRect, RGB(255,0,0));
memDC.ExtTextOut(m_TimeRect.left,m_TimeRect.top,ETO_CLIPPED,m_TimeRect,TEXT("Red"),NULL);
myDC->BitBlt(m_TimeRect.left, m_TimeRect.top, m_TimeRect.Width(), m_TimeRect.Height(), &memDC,m_TimeRect.left, m_TimeRect.top,SRCCOPY);

abcde:
testit ++;
memDC.SelectObject( oldBmp );
memDC.DeleteDC();
ReleaseDC(myDC);
tokens 2008-12-31
  • 打赏
  • 举报
回复
sungoco2,这个不是我想要的..呵..
memDC中一定要是图,

不解的是,为什么这幅图只能第一次选入memDC时才正确,
第N次再选入这图时,得到的即是填入过红色的图了.
sungoco2 2008-12-31
  • 打赏
  • 举报
回复
if( testit % 2 )
{
//
memDC.FillSolidRect(m_TimeRect, RGB(0,0,255));
//

myDC->BitBlt(m_TimeRect.left, m_TimeRect.top, m_TimeRect.Width(), m_TimeRect.Height(), &memDC,m_TimeRect.left, m_TimeRect.top,SRCCOPY);
TRACE0("do it---\n");
goto abcde;
}

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧