代码片段: CRect rc;
m_pWnd = new CWnd;
rc.SetRect(StartX, StartY,StartX+SH_WIDTH, StartY+SH_HEIGHT);
m_SHHQpWnd->CreateEx(0,AfxRegisterWndClass(CS_CLASSDC|CS_SAVEBITS|CS_HREDRAW|CS_VREDRAW),
"",WS_POPUP|WS_VISIBLE,rc,this,0);
m_pThread = new CWinThread;
m_pThread = AfxBeginThread(ShowAll,(LPVOID)(m_pWnd->m_hWnd));
UINT SHShowAll(LPVOID pParam)
{
CWnd *pWnd = new CWnd;
CDC *pdc;
pWnd->Attach((HWND) pParam);
pdc = pWnd->GetDC();

CRect rc;
rc.SetRect(0, 0, SH_WIDTH, SH_HEIGHT); CDC memdc;
CBrush Brush,*pOldBrush;
CBitmap Bitmap, *pOldBitmap;
CFont font,*poldfont;
memdc.CreateCompatibleDC(pdc);
Brush.CreateSolidBrush(RGB(0,0,0));
pOldBrush = memdc.SelectObject(&Brush);
Bitmap.CreateCompatibleBitmap(pdc, rc.Width(), rc.Height());
pOldBitmap = memdc.SelectObject(&Bitmap);
font.CreateFont(SH_FONT_SIZE,0,0,0,FW_NORMAL,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,        
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH | FF_SWISS,"楷_GB2312");                 
poldfont = memdc.SelectObject(&font);
memdc.SetBkMode(TRANSPARENT);
memdc.SetTextColor(RGB(255,255,0));
pdc->BitBlt(0,0,SH_WIDTH,SH_HEIGHT,&memdc,0,0,SRCCOPY); //pdc->FillSolidRect(rc, RGB(0,0,0));

CDC memdc1;
CBrush Brush1, *pOldBrush1;
CBitmap Bitmap1, *pOldBitmap1;
CFont font1, *poldfont1;
CRect rc1;

memdc1.CreateCompatibleDC(pdc);
Brush1.CreateSolidBrush(RGB(0,0,0));
pOldBrush1 = memdc1.SelectObject(&Brush1);

rc1.SetRect(0, 0, SH_DENG_WIDTH, SH_DENG_HEIGHT);
Bitmap1.CreateCompatibleBitmap(pdc, rc1.Width(), rc1.Height());
pOldBitmap1 = memdc1.SelectObject(&Bitmap1);

font1.CreateFont(16,0,0,0,FW_NORMAL,FALSE,FALSE,0,GB2312_CHARSET,OUT_DEFAULT_PRECIS,        
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH | FF_SWISS, "楷体_GB2312"); poldfont1 = memdc1.SelectObject(&font1);
memdc1.SetBkMode(TRANSPARENT);
memdc1.SetTextColor(RGB(255,0,0));                 while(1)
                 {
                           。。
                           //  在memdc1上写内容,并以某种方式逐步拷贝到memdc上,最后再拷贝到pdc上显示
                           。。
for (int t = 0; t < 7; t ++)
{
memdc.BitBlt(0, t*32, SH_WIDTH-1, SH_DENG_HEIGHT, &memdc, 1, t*32, SRCCOPY);
memdc.BitBlt(SH_WIDTH-1, t*32, 1, SH_DENG_HEIGHT, &memdc, 0, t*32+32, SRCCOPY); 
}

memdc.BitBlt(0, t*32, SH_WIDTH-1, SH_DENG_HEIGHT, &memdc, 1, t*32, SRCCOPY);
memdc.BitBlt(192-1, t*32, 1, SH_DENG_HEIGHT, &memdc1, CurPos, 0, SRCCOPY);                           CurPos = CurPos + 1; // 每次递进一个像素点

pdc->BitBlt(0, 0, SH_WIDTH, SH_HEIGHT, &memdc, 0, 0, SRCCOPY);

Sleep(5);
                  }}问题:用以上方式的显示过程有明显的抖动,但是前面AfxRegisterWndClass函数的参数为CS_CLASSDC|CS_SAVEBITS|CS_HREDRAW|CS_VREDRAW时比为NULL时的抖动要小,但是仔细看还是能看出来,请各位兄弟帮帮看看,已经用了双缓冲了,为什么还会抖动?谢谢!

解决方案 »

  1.   

    m_SHHQpWnd就create了一下?贴的这一堆代码也没用到啊?m_SHHQpWnd就是m_pWnd?
      

  2.   

    不好意思,写错了,m_SHHQpWnd就是m_pWnd,应该是
    m_pWnd->CreateEx(0,AfxRegisterWndClass(CS_CLASSDC|CS_SAVEBITS|CS_HREDRAW|CS_VREDRAW),
    "",WS_POPUP|WS_VISIBLE,rc,this,0);
      

  3.   

    你先把SHShowAll这个函数精简下,如果抖动的画即时画几个字串它也会抖吧,以此来检测双缓冲是否真的用对了;
    另外,你开个线程AfxBeginThread(ShowAll,(LPVOID)(m_pWnd->m_hWnd));
    已经把窗口句柄传进去了,为什么还要在线程函数SHShowAll里new个CWnd哩,
    UINT SHShowAll(LPVOID pParam)
    {
    CWnd *pWnd = new CWnd;
    CDC *pdc;
    pWnd->Attach((HWND) pParam);
    pdc = pWnd->GetDC();
    ...
    要拿m_pWnd的DC根据句柄直接拿就是了...
      

  4.   

    加上子窗体剪裁试试WS_CLIPCHILDREN
      

  5.   

    重载OnEraseBkgnd(){return true;}试试
      

  6.   

    怎么重载OnEraseBkgnd,我的窗口是动态创建的?
      

  7.   

    动态创建你就是指的CWnd* pWnd = new Cwnd; pWnd->createEX?
    看你的代码是不用处理OnEraseBkgnd了,
    MSDN:
    LPCTSTR AFXAPI AfxRegisterWndClass(
       UINT nClassStyle,
       HCURSOR hCursor = 0,
       HBRUSH hbrBackground = 0,
       HICON hIcon = 0 
    ); 
    hbrBackground 
    Specifies a handle to the brush resource to be installed in each window created from the window class. If you use the default of 0, you will have a NULL background brush, and your window will, by default, not erase its background while processing WM_ERASEBKGND. 
    至于你抖动问题不太清楚了~