最近写了个可以让文字左右滚动的CStatic类,出了点小问题!源代码如下:
BOOL CSkinStatic::OnEraseBkgnd(CDC* pDC) 
{
return TRUE;
}
void CSkinStatic::OnPaint() 
{
CPaintDC dc(this); 
CDC memDC;
memDC.CreateCompatibleDC(&dc); memDC.SelectObject(hbmp);
memDC.SetBkMode(TRANSPARENT);
memDC.TextOut(m_NowPos, 50, "hello baby");
dc.BitBlt(0, 0, 100, 100, &memDC, 0, 0, SRCCOPY);
}
void CSkinStatic::OnTimer(UINT nIDEvent) 
{
m_NowPos++;
Invalidate();
CStatic::OnTimer(nIDEvent);
}
void CSkinStatic::Start()
{
SetTimer(1, 50, NULL);
HBITMAP hbmp;
hbmp = (HBITMAP)LoadImage(AfxGetInstanceHandle(),    "hello.bmp",IMAGE_BITMAP,0,0,
  LR_LOADFROMFILE|LR_CREATEDIBSECTION);
}
在这个类中我把HBITMAP hbmp定义成成员函数,而在start()中加载位图资源LoadImage(),在Onpaint()中调用hbmp,但是运行程序时在“hello baby”移动过的地方留下黑色的残影(文字是黑色的)!但是如果我将hbmp定义、加载位图函数搬到Onpaint()中的话,残影就消失了!!!
void CSkinStatic::OnPaint()
{
CPaintDC dc(this); 
CDC memDC;
memDC.CreateCompatibleDC(&dc);
HBITMAP hbmp;
hbmp = (HBITMAP)LoadImage(AfxGetInstanceHandle(),    "hello.bmp",IMAGE_BITMAP,0,0,
  LR_LOADFROMFILE|LR_CREATEDIBSECTION);
memDC.SelectObject(hbmp);
memDC.SetBkMode(TRANSPARENT);
memDC.TextOut(m_NowPos, 50, "hello baby");
dc.BitBlt(0, 0, 100, 100, &memDC, 0, 0, SRCCOPY);
}到底hbmp定义为成员变量和定义为局部变量有什么区别??请高手解答!!!

解决方案 »

  1.   

    执行了
    memDC.SelectObject(hbmp);
    随后memDC.TextOut是写在hbmp上的。你的hbmp就被修改了。
    当你把hbmp定义为成员变量,那么hbmp只LoadImage一次。
    所以就会出现黑色的残留影像(这应该是没有擦除的文字)
    如果你把 hbmp定义为局部变量,每次都LoadImage,hbmp的修改就不会被保存下来。
    所以就没有残留影像。
    这里关键有两点:
    1 SelectObject之后对memDC的绘画是对hbmp进行的
    2 局部变量和成员变量本身没有什么太大意义,关键是你的LoadImage的时机。
    另外,注意你用完hbmp之后要DeleteObject(hbmp),防止资源泄漏不好意思,好像说得不太清楚
      

  2.   

    请问如何解决这个问题??
    我的意思是说:hbmp还是要定义为成员变量,只加载一次位图资源,如果每次刷新都加载一次位图资源,我怕会影响重画的效率!!!!!
      

  3.   

    你可以另外创建一个内存位图, 选进这个内存DC, 然后用BitBlt在内存DC上画你载入的位图,再TextOut文字最后BitBlt到你的DC上
      

  4.   

    新的OnPaint()
    void CSkinStatic::OnPaint() 
    {
    CPaintDC dc(this); 
    CDC memDC,memDC2;
    memDC.CreateCompatibleDC(&dc);
    memDC2.CreateCompatibleDC(&dc);
             CBitmap bmp;
             bmp.CreateCompatibleBitmap(&memDC2); memDC.SelectObject(hbmp);
             memDC2.BitBlt(0,0,100,100,&memDC,0,0,SRCCOPY);
    memDC2.SetBkMode(TRANSPARENT);
    memDC2.TextOut(m_NowPos, 50, "hello baby");
    dc.BitBlt(0, 0, 100, 100, &memDC2, 0, 0, SRCCOPY);
    }
      

  5.   

    我试过了,不行呀!!!
    静态控件背景一片空白!!
    程序没有把memDC复制到memDC2中去!!!
      

  6.   

    在楼上的代码中不小心掉了
    memDC2.SelectObject(&bmp);
    另外,CreateCompatibleBitmap要加上宽度和高度参数
      

  7.   

    我成功了!!!!!ukyoking(乐易)兄还漏了个错误,bmp.CreateCompatibleBitmap(&memDC2);中的memDC2要改成dc,不然只能创建单色位图!!!!