300元钱求解“带有背景位图的编辑框滚动闪烁问题”
    一个带有背景位图和滚动条的编辑框,点击滚动条实现了文字滚动(位图不滚动)。但有缺陷,在滚动时(特别是单行滚动时),位图有闪动。怎样解决此闪烁现象?
备有压缩文件(全部源代码与资源文件)。告知Email索取。
解答、提供源代码(或改正的)均可。付款方式:电汇(最好是建行龙卡)等。主要代码如下:// bEdit.h : header file
public:
CBrush m_brush ;
BOOL  bFirst;
CBitmap m_bitmap,*oldBmp;
CDC memDC;// bEdit.cpp : implementation fileCbEdit::CbEdit()
{
bFirst=TRUE;                       // 首次背景刷新标记。
m_bitmap.LoadBitmap(IDB_BITMAP1);  // IDB_BITMAP1为256色bmp位图。
  COLORREF m_clrBack ;
m_clrBack=RGB (0 , 0 , 255); 
m_brush.CreateSolidBrush(m_clrBack );}CbEdit::~CbEdit()
{
}BOOL CbEdit::OnEraseBkgnd(CDC* pDC) 
{
CRect re; 
GetClientRect(&re);//得到Edit控件的外框,即背景区域
if(bFirst){
memDC.CreateCompatibleDC(pDC);
oldBmp=memDC.SelectObject(&m_bitmap);
m_bitmap.DeleteObject();
bFirst=FALSE;
}
pDC->BitBlt(0,0,re.Width(),re.Height(),&memDC,0,0,SRCCOPY);
pDC->SelectObject(oldBmp);
return TRUE;
}HBRUSH CbEdit::CtlColor(CDC* pDC, UINT nCtlColor) 
{
pDC->SetBkMode(TRANSPARENT);
return m_brush;
}void CbEdit::OnLButtonDown(UINT nFlags, CPoint point) 
{
Invalidate();
CEdit::OnLButtonDown(nFlags, point);
}void CbEdit::OnVscroll() 
{
Invalidate();
}void CbEdit::OnChange() 
{
Invalidate();
}

解决方案 »

  1.   

    如果其它地方没有问题,可以这样修改试一下,发过来吧
    我的信箱:[email protected]
    BOOL CbEdit::OnEraseBkgnd(CDC* pDC) 
    {
    CRect re; 
    GetClientRect(&re);//得到Edit控件的外框,即背景区域

    memDC.CreateCompatibleDC(pDC);
    oldBmp=memDC.SelectObject(&m_bitmap);

    pDC->BitBlt(0,0,re.Width(),re.Height(),&memDC,0,0,SRCCOPY);
    pDC->SelectObject(oldBmp); return FALSE;//修改为FALSE
    }CbEdit::~CbEdit()
    {
      m_bitmap.DeleteObject();//和其它的一些后期消除代码
    }
      

  2.   

    BOOL CbEdit::OnEraseBkgnd(CDC* pDC) 
    {
    CRect re; 
    GetClientRect(&re);//得到Edit控件的外框,即背景区域
    if(bFirst){
    memDC.CreateCompatibleDC(pDC);
    oldBmp=memDC.SelectObject(&m_bitmap);
    bFirst=FALSE;
             pDC->BitBlt(0,0,re.Width(),re.Height(),&memDC,0,0,SRCCOPY);
             memDC.SelectObject(oldBmp);
                      memDC.DeleteDC()
    }
             else pDC->BitBlt(0,0,re.Width(),re.Height(),&memDC,0,0,SRCCOPY);         return TRUE;
    }
    CbEdit::~CbEdit()
    {
        m_bitmap.DeleteObject();
    }
      

  3.   

    dz_w(快乐之星) 的代码好象也不行
       我搞不定,兄弟,不好意思,能力有限,没办法帮你
      

  4.   

    Sorry了,没看懂就发了
    [email protected]给我代码。
      

  5.   

    给我发一个吧:
    [email protected]
      

  6.   

    我也试一下吧!
    [email protected]
      

  7.   

    BOOL CbEdit::OnEraseBkgnd(CDC* pDC) 
    {
    CRect re; 
    GetClientRect(&re);//得到Edit控件的外框,即背景区域
    memDC.CreateCompatibleDC(pDC);
    oldBmp=memDC.SelectObject(&m_bitmap);
    pDC->StretchBlt(0,0,re.Width(),re.Height(),&memDC,0,0, 48, 48, SRCCOPY);
    memDC.SelectObject(oldBmp);
    memDC.DeleteDC();
    return TRUE;
    }CbEdit::~CbEdit()
    {
        m_bitmap.DeleteObject();
    }void CbEdit::OnVscroll() 
    {
    CEdit::OnVScroll(nSBCode, nPos, pScrollBar);
    Invalidate();
    }
      

  8.   

    谢谢大家!!给上面各位朋友的文件已发出,如果没有收到,请通知我。[email protected]
    问题好象不在OnEraseBkgnd()中。
      

  9.   

    我也觉得是的,问题不在OnEraseBkgnd()中,MFC我不熟,不过我认为在向下移动的开始时候好象背景根本没有固定,还有拖动的时候也是的
      

  10.   

    dz_w(快乐之星) :
     谢谢,你用的这个消息我也试过,还是那样,问题并没有得到解决。
    void CbEdit::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
    {
    //Invalidate();   //版本1,在此位置使用该函数。
    CEdit::OnVScroll(nSBCode, nPos, pScrollBar);
    Invalidate(); //版本2,在此位置使用该函数。}
      

  11.   

    还是要感谢dz_w(快乐之星),拖动滚动条时的,拖尾现象没有了,闪烁依然存在。
    声明一下,奖金只能给问题的最终解决者,不支解,不好意思!只好给你分数了。 
    luogucai(萝卜) 文件已发出,请查收。
      

  12.   

    有的时候,我们开发了一套很有市场价值的软件,可是发觉市场销售量却很低,原来真正的原因是软件的包装不够漂亮。公司采取各种渠道来解决问题。招聘大量的美工人员,可是,却发觉程序员的水平跟不上步伐,专门设立一个研究部门,却发觉需要花费巨额的人力物力,采用第三方控件吧,却要支费大量的注册费用或者版权使用费用,而且一般都以动态链接库*.DLL 或者控件*.OCX 绑定到我们的软件中。并且,控件功能扩展需要花费一定的升级费用才能够实现。您希望一次花费为数不多的费用就能弥补所有的不足吗...皮肤类不以任何形式的控件*.OCX,动态链接库*.DLL出售给用户,所以,你不必担心是否以源代码的方式出售给用户
        皮肤工作室皮肤类(VC开发企业版)暑假期间正在热销中,优惠活动截至到2003.9月。售价仅仅人民币500元整(终身使用版权);并且,在功能上可以任意扩展,真可谓手到擒来。具体包括皮肤对话框,皮肤按扭,皮肤进度条,皮肤控制条,皮肤动画标签类,皮肤面版类... 全部功能都以源代码的方式出售,使你可以制作真正意义上的具有自主版权皮肤功能的软件,还在等什么,赶快行动吧!!!
       真正令我们心动的时刻到了,同时随送的一些经典皮肤示例源代码包括多彩取色机XP,鼠标记录机,多彩影音伴侣等等
    你如果希望购买我们的产品,请到我们网站的购买方式页面 http://www.skin-studio.com/bankcard.htm了解更多信息
      

  13.   

    skinstudio:
        你的皮肤类,有我要的这个编辑框吗(即编辑框背景是位图,垂直滚动条滚动时,背景不动,文字滚动)?不要我买回来,没有所要的东西,我只想要这个功能。
      

  14.   

    to rdr :
      请发一份给我, 我不信是不可能解决的问题!
      [email protected]
      

  15.   

    在CODEPROJECT上有很多你要的东西,你可以考虑用双缓冲技术来实现
      

  16.   

    发过来,我看看先:
    [email protected]
      

  17.   

    [email protected]
       给我也发 一份。
      

  18.   

    搞定了吗? 我搞定了,给我你的邮箱[email protected]
      

  19.   

    taotao4629:
         [email protected] 请您尽快发来。非常感谢!
      

  20.   

    我也来试试哈
    [email protected]
      

  21.   

    解决动画闪烁问题的方法目前只有多缓冲区,信守一个原则就永远不会出现闪烁问题那就是
    “对于与屏幕相关联的DC句丙,第n屏图像与第n+1屏图之间有且只有一次贴图操作”
      

  22.   

    taotao4629:
       谢谢!已收到,并已回复,但问题没有解决。   所有索要源码的朋友,源码文件均已发出。若没收到,请与我联系。[email protected]
       此问题不是动画闪烁,好象与多缓冲无关,现在是背景图有跳动,目的是要背景图不动,好象与scrollwindow函数有关系。
      

  23.   

    辛苦下面两位朋友了!!!qfly():
           已收到,但是附件不能打开,请您尽快再发一次。 taotao4629(pirate):
          已收到,但滚动条已经失效,失去应用意义,需要您完善。
      

  24.   

    很感谢下面两位朋友,辛苦了!!!
     qfly() :
       已收到,但是附件不能打开,请您尽快再发一次。taotao4629(pirate):
       已收到,背景是不闪了,但滚动条失效,失去了应用意义,需要完善。
      

  25.   

    问题已经被qfly()解决。  taotao4629(pirate):
        不好意思,让您辛苦了,您的程序仍有缺陷。我给您一份qfly()发来的程序(执行文件)。  非常感谢二位及各位朋友的关心!
      

  26.   

    周未休息,哎错过了这三百块钱,哈哈!void CbEdit::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
    {
    // TODO: Add your message handler code here and/or call default

    CEdit::OnVScroll(nSBCode, nPos, pScrollBar);
    Invalidate();
    }
      

  27.   

    楼主或qfly():能不能告知是如何解决的?
      

  28.   

    chenxudongfirst(dongdong)
     DeautyFan(悲情浪子) 
     luogucai(萝卜)  三位请收取答复邮件。