BOOL CBitMap1Dlg::OnInitDialog()
{
    ...
    CPaintDC dc(this);    // 创建内存兼容DC
    m_memDC.CreateCompatibleDC(&dc);    CBitmap memBit ;
    memBit.CreateCompatibleBitmap(&dc, 1000, 1000);     // 内存位图大小
    pSizeBmp = memDC.SelectObject(&memBit);
    // 创建临时兼容内存DC, 用于贴到memDC中
    CBitmap memDC_temp;
    memDC_temp.CreateCompatibleDC(&dc);    //  背景 
    bit0.LoadBitmap(IDB_BG);
    memDC_temp.SelectObject(&bit0);
    memDC.BitBlt(0, 0, 1000, 1000, &memDC_temp, 0, 0, SRCCOPY);
    memDC_temp.SelectObject(pSizeBmp);
    // 贴其他图片
    ...
}void CBitMap1Dlg::OnPaint() 
{
    CPaintDC dc(this); // device context for painting

    // 把m_memDC画到dc上
    dc.BitBlt(0, 0, 1000, 1000, &m_memDC, 0, 0, SRCCOPY);
    memDC.SelectObject(pSizeBmp);
}我是用一个m_memDC做内存DC,每次将memDC_temp的位图贴到m_memDC中,最后在OnPaint函数中一次贴到窗口中。问题:程序启动,显示图片,但是移动窗口时,即再次调用OnPaint,为什么图片就没了?

解决方案 »

  1.   

    应该要把OnInitDialog()里面做的一些操作移到::OnPaint()里面吧
      

  2.   

    dc.BitBlt(0, 0, 1000, 1000, &m_memDC, 0, 0, SRCCOPY);
    //  memDC.SelectObject(pSizeBmp);  
      

  3.   

    没有实时刷新 使用Invalidate(),或者OnInitDialog()里面做的一些操作移到::OnPaint()里
      

  4.   

    你再OnInitialDialog函数中定义的临时对象在函数执行后全部消失了,所以内存DC中没有可以画的位图。所以应该把OnInitialDialog函数中的内容放到OnPaint里面。
      

  5.   

    同意wyjkk(宝宝不乖)。你要是觉得代码太凌乱了,就把画图过程放到一个函数里,然后再放到OnPaint里,这样程序会更清晰。
      

  6.   

    覆盖CDialog::OnPaint()是个怪异的方法,就算能成功,也可能遗留一些古怪的bug。
    应该自己写一个控件,放在dialog里,所有的画图有这个控件自己完成。
    不想自己写控件,可以考虑subclass一个static控件。