本帖最后由 VisualEleven 于 2014-05-21 11:59:44 编辑

解决方案 »

  1.   

    你对话框是放什么里面?view里面吗?很有可能是对话框父窗口onsize 前画了一次,onsize之后又画了一次,两次用getclientrect获得的尺寸不同。
      

  2.   

    在父类什么都没干啊,ONsize什么都没干啊,我还有其他的对话框,也是同样的代码,但是其他的对话框实现很正常,只有这个有问题,对话框里也没什么设置了啊
      

  3.   

    lz的代码基本应该没有问题,红色的位置加入相关代码试试BOOL CXue_char::OnEraseBkgnd(CDC* pDC)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    CBitmap bitmap;
    bitmap.LoadBitmapA(IDB_BTM_ABC);
    BITMAP bmp;
    bitmap.GetBitmap(&bmp);
    CDC dccompatible;
    dccompatible.CreateCompatibleDC(pDC);
    dccompatible.SelectObject(&bitmap);
    CRect rect;
    GetClientRect(&rect);
    //CreateRectRgn 创建和窗口一样大的区域
    //将创建的区域选入pDC

    pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dccompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
    //恢复区域
    //删除创建的区域
    return true;
    //return CDialogEx::OnEraseBkgnd(pDC);
    }
      

  4.   

    CRect rect;
    GetClientRect(&rect);我就是用这句话获取到的VIEW的矩形区域
    后面用StretchBlt函数将图片放在这个矩形区域里的,我还有其他的几个对话框,都是用的一样的代码,就这个显示不正常,很奇怪,这个对话框里面什么重绘的都没写过,是不是要手动加一个,重绘下窗口?
      

  5.   

    5L不是告诉你要按红色的提示,添加几条代码了吗?你按提示把相关代码添加进去因为绘画背景的时候,pDC的裁剪区应该只有需要重绘的部分,不是整个窗口,因此应该将整个裁剪区扩大,否则,你StretchBlt过去的原来已经有的部分,被裁剪掉了
      

  6.   

    刚才试了下,到时第1次打开的时候确实是完整的一个了,但是下一页时,图片还会在显示一次大点的,而且,发音按钮,音标和单词的STATIC控件显示都不正常
      

  7.   

    pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dccompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);如果 要 合成 就不能 用 SRCCOPY
      

  8.   

    在父类什么都没干啊,ONsize什么都没干啊,我还有其他的对话框,也是同样的代码,但是其他的对话框实现很正常,只有这个有问题,对话框里也没什么设置了啊
    不是说你做了什么,是view在显示的过程中会调用onsize几次,会引起onerasebkgnd.
      

  9.   

    在父类什么都没干啊,ONsize什么都没干啊,我还有其他的对话框,也是同样的代码,但是其他的对话框实现很正常,只有这个有问题,对话框里也没什么设置了啊
    不是说你做了什么,是view在显示的过程中会调用onsize几次,会引起onerasebkgnd.
    你可以试试:
    如图,我在OnEraseBkgnd里贴图
    BOOL CXue_char::OnEraseBkgnd(CDC* pDC)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    static BOOL bfirst=TRUE;
    if(bfirst)
    {
    bfirst=false;
    }else{
    CBitmap bitmap;
    bitmap.LoadBitmapA(IDB_BTM_ABC);
    BITMAP bmp;
    bitmap.GetBitmap(&bmp);
    CDC dccompatible;
    dccompatible.CreateCompatibleDC(pDC);
    dccompatible.SelectObject(&bitmap);
    CRect rect;
    GetClientRect(&rect);
    pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dccompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
    }
    return true;
    //return CDialogEx::OnEraseBkgnd(pDC);
    }
    但是显示的结果,是会明显看到第1次显示一个小一点的图片,然后在显示拉伸后的图片,切换到别的界面,然后在切换回来就可以正常显示了,可以看的出来明显是切换使窗口重绘了,但是我想问的是对话框的背景图片重绘,在哪实现呢?
      

  10.   

    为什么
    static BOOL bfirst=TRUE;
    if(bfirst)
    {
    bfirst=false;
    }
      

  11.   

    OnEraseBkgnd(pDC);里永远是return true;
    一切都在OnPaint里完成
      

  12.   

    就是onsize引起的第一次擦除不画图。
      

  13.   

    onpaint里可直接实现整张图的替换
      

  14.   

    OnEraseBkgnd直接return TRUE,OnPaint/OnDraw()中绘图