我从CWnd派生CShowWnd类。在基于对话框的工程CMyDlg中创建CShowWnd子窗口来显示动态数据。CShowWnd中成员m_pMemDC,m_pBitmap分别为消除闪烁的内存DC和位图。
代码如下:
BOOL CShowAudio01Dlg::OnInitDialog()
{...
 m_ShowWnd.Create(NULL,NULL,WS_VISIBLE|WS_CHILD,rect,this,100);
 m_ShowWnd.Init();
 ...
}
void CShowWnd::Init()
{...
 CClientDC dc(this);
 GetClientRect(&rect);
 m_pMemDC->CreateCompatibleDC(&dc);
 m_pBitmap->CreateCompatibleBitmap(&dc,m_nWidth,m_nHeight);
 ...
}
void CShowWnd::OnPaint()
{
   CPaintDC dc(this); // device context for painting
   CBitmap *pOldBit=m_pMemDC->SelectObject(m_pBitmap);
   MyDraw(m_pMemDC);
   dc.BitBlt(0,0,m_nWidth,m_nHeight,m_pMemDC,m_nWidth,m_nHeight,SRCCOPY);
   m_pMemDC->SelectObject(pOldBit);
   // Do not call CWnd::OnPaint() for painting messages
}
void CShowWnd::MyDraw(CDC *pDC)
{
  为我的画图操作;
}
该程序在Win2k中运行正常,但在Win98下运行不正常(m_ShowWnd子窗口画屏)。
我发现是内存位图m_pBitmap为桌面的内容.难道CreateCompatibleBitmap(&dc,m_nWidth,m_nHeight)不是dc中的内容吗?在Win2k下是好的。
请大虾指点迷津,本人万分感激!

解决方案 »

  1.   

    代码好像没问题,
    建议将编译的obj文件全部删除重新编译一下。
      

  2.   

    把代码完整地贴出来,另外CreateCompatibleBitmap后m_pBitmap的内容是随机的,
    为桌面内容也不奇怪
      

  3.   

    chinaqianhu(乾瑚)
    建议将编译的obj文件全部删除重新编译一下。
    我已试过了,所有obj文件包括exe文件都重新编译过。但没用。
    FlyingSch(BoyWithWings)
    把代码完整地贴出来,另外CreateCompatibleBitmap后m_pBitmap的内容是随机的,
    为桌面内容也不奇怪
    代码我已经贴出来了。
    CShowWnd重载了Create,但在函数体内每加其他的代码。
    重载了Timer
    void CShowWnd::OnTimer(UINT nIDEvent) 
    {
        // TODO: Add your message handler code here and/or call default
        InvalidateWnd();
        CWnd::OnTimer(nIDEvent);
    }
    自定义函数
    void CShowWnd::InvalidateWnd()
    只是改变显示图形的坐标,就InvalidateRect(rect,FALSE);
    void CShowWnd::MyDraw(CDC *pDC,int nIdex)
    {
       if(m_bUpOrDown[nIdex]){
          //判断动态图形变化的方向。
          if(m_nPrevPos[nIdex]-1<m_nGreenPos)
              pDC->SelectObject(m_pGreenBrush);  //根据位置选不同颜色的刷子
          else if(m_nPrevPos[nIdex]-1<m_nYellowPos)
              pDC->SelectObject(m_pYellowBrush);  //根据位置选不同颜色的刷子
          else
              pDC->SelectObject(m_pRedBrush);  //根据位置选不同颜色的刷子
       }
       else{
          pDC->SelectStockObject(BLACK_BRUSH);   //黑刷子抹去前一时刻的图形
       }
       pDC->Rectangle(CRect(m_nX[nIdex],m_nY[nIdex],m_nX[nIdex]+m_nStepX,
                m_nY[nIdex]+m_nStepY));    \\绘矩形
       pDC->SelectStockObject(BLACK_BRUSH);\\释放选如pDC的刷子
    }
    OnPaint我早已贴出来了,只是上次贴的略去了参数nIdex;原代码如下
    for(int i=0;i<PORT;i++) MyDraw(m_pMemDC,i);
    CreateCompatibleBitmap后m_pBitmap的内容有时不是桌面内容,它是当前窗口的内容,如当前没有窗口,就为桌面。好象是在考屏(但内容不是很清楚),但我没有涉及到元文件设备啊。
    同一机器,用Win2k和Win98启动是不一样的结果,CreateCompatibleBitmap在Win98下有什么不同吗?我以前在Win98下也用过CreateCompatibleBitmap,但没有问题啊。
      

  4.   

    to FlyingSch(BoyWithWings) 
       你的m_p*Brush是怎样创建的?
    class CShowWnd : public CWnd
    {
      ...
      public:
        CDC     *m_pMemDC;
        CBitmap *m_pBitmap;
        CBrush  *m_pYellowBrush,*m_pBlueBrush,*m_pRedBrush;
      ...
    }
    以上为定义。
    CShowWnd::CShowWnd()
    {
      m_pMemDC=new CDC;
      m_pBitmap=new CBitmap;
      m_pGreenBrush=new CBrush;
      m_pGreenBrush->CreateSolidBrush(RGB(0x00,0xFF,0x00));
      m_pYellowBrush=new CBrush;
      m_pYellowBrush->CreateSolidBrush(RGB(0xFF,0xFF,0x00));
      m_pRedBrush=new CBrush;
      m_pRedBrush->CreateSolidBrush(RGB(0xFF,0x00,0x00));
    }
    我是这样创建的,应该和刷子没关系。是位图的原因。
      

  5.   

    dc.BitBlt(0,0,m_nWidth,m_nHeight,m_pMemDC,m_nWidth,m_nHeight,SRCCOPY)
    to
    dc.BitBlt(0,0,m_nWidth,m_nHeight,m_pMemDC,0,0,SRCCOPY)
      

  6.   

    原来写贴是写错了,这个错误已修正。我的问题是Win2k下可一运行,可Win98下的屏幕画屏,
    Win2K和Win98的内存DC有什么不同吗?
      

  7.   

    gz
    Win2K和Win98的内存DC应该是相同的,会不会调用的动态库不同,你试一下静态链接看看.
    另外stdafx.h中好象也有定义不版本的地方
      

  8.   

    try it:
    change
    void CShowWnd::Init()
    {...
     CClientDC dc(this);
     GetClientRect(&rect);
     m_pMemDC->CreateCompatibleDC(&dc);
     m_pBitmap->CreateCompatibleBitmap(&dc,m_nWidth,m_nHeight);
     ...
    }
    tovoid CShowWnd::Init()
    {...
     CDC *pDC=GetDC();
     GetClientRect(&rect);
     m_pMemDC->CreateCompatibleDC(pDC);
     m_pBitmap->CreateCompatibleBitmap(pDC,m_nWidth,m_nHeight);
     ...
     ReleaseDC(pDC);
    }