我写了一个程序,希望将一个窗口内的内容在另一个窗口中显示
        HDC hdc1;                          //原窗口DC
HDC hdc2;                          //目的窗口DC
RECT rect1;                        //原窗口客户区
RECT rect2;                        //目的窗口客户区
hdc1 = GetDC(hWnd1);
hdc2 = GetDC(hWnd2);
GetClientRect(hWnd1,&rect1);
GetClientRect(hWnd2,&rect2);
BitBlt(hdc2,rect2.left,rect2.top,(rect2.right-rect2.left),(rect2.top-rect2.bottom),
hdc1,rect1.left,rect1.top,SRCCOPY);

ReleaseDC(hWnd1,hdc1);
ReleaseDC(hWnd2,hdc2); InvalidateRect(hWnd2,&rect2,TRUE);两个窗口是由同一个进程产生
运行后,出现两个窗口
但和想象的不一样
目的窗口中并未显示原窗口中的内容不是BitBlt()可否这样用?
还是必须建立兼容DC?

解决方案 »

  1.   

    窗口用自己的单独的DC,不用和主窗口的兼容DC。BitBlt也没有问题。看看你的hdc2是不是有效,随便用它在窗口上画点什么,看看出来不。
      

  2.   

    你看看你所要复制的所要表示的矩形区域是否有效?我感觉这个bitblt里面的(rect2.top-rect2.bottom)有点不对吧.    
      

  3.   

    HDC hdc1;                          //原窗口DC
        HDC hdc2;                          //目的窗口DC
        RECT rect1;                        //原窗口客户区
        RECT rect2;                        //目的窗口客户区
    hdc1 = GetDC()->m_hDC;
    hdc2 = ::GetWindowDC(AfxGetMainWnd()->m_hWnd);    GetClientRect(&rect1);
        AfxGetMainWnd()->GetClientRect(&rect2);
    BitBlt(hdc2,0,0,(rect1.right-rect1.left),(rect1.bottom-rect1.top),
            hdc1,0,0,SRCCOPY);
        
    ::ReleaseDC(m_hWnd,hdc1);
    ::ReleaseDC(GetParent()->m_hWnd,hdc2);
      

  4.   

    theApp.m_pMainWnd->GetDlgItem(IDC_LEFT_3)->MoveWindow(ptStartBtn.x,ptStartBtn.y,bmpInfo.bmWidth,bmpInfo.bmHeight);theApp.m_pMainWnd->GetDlgItem(IDC_LEFT_3)->ShowWindow(SW_SHOW);
        
    theApp.m_pMainWnd->GetDC()->StretchBlt(ptStartBtn.x,ptStartBtn.y,bmpInfo.bmWidth,bmpInfo.bmHeight,&memDC,
    0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,SRCCOPY);
    我先将一个Picture(类型为Bitmap)控件移动到某一位置,然后在某一位置显示出来,最后在这位置用StretchBlt绘制该控件的热点效应。可总是不行,跟踪后发现StretchBlt正常绘制了,我怀疑是MoveWindow还没使这picture控件移动到位,或还没来得及重绘该控件窗口我就利用StretchBlt绘制热点效果图了,后来该控件重绘冲掉了StretchBlt所绘制图。
      

  5.   


    我这个程序是个简单的SDK程序
    不是MFCBitBlt(hdc2,0,0,(rect1.right-rect1.left),(rect1.bottom-rect1.top),
            hdc1,0,0,SRCCOPY);为什么要把坐标变为0?
      

  6.   


    hdc2也有效的,在hdc2上输出了一段文字,可以显示的
      

  7.   


    那就好办了,把在hdc1上能够直接显示的BitBlt函数的第一个参数直接换成hdc2,也一定能够显示。
    找BitBlt函数参数的差异吧。
      

  8.   


    在hdc1上能够直接显示的BitBlt函数的第一个参数直接换成hdc2 ?? 
    这是什么意思???
      

  9.   

    可以这样用Lz源码中这句错了而已 rect2.top-rect2.bottom
    应该是 rect2.bottom-rect2.top
      

  10.   


    已经改过来了,但还是不行
    我是在win7系统下运行的
    是不是win7下运行没有效果
      

  11.   


    我也是Win7没问题,你看是不是你那个InvalidateRect把窗口重绘了?去掉看看
      

  12.   

    BOOL BitBlt(
      HDC hdcDest, // 目标DC句柄
      int nXDest,  // 目标矩形左上角x坐标
      int nYDest,  // 目标矩形左上角y坐标
      int nWidth,  // 目标矩形width
      int nHeight, // 目标矩形height
      HDC hdcSrc,  // 源DC句柄
      int nXSrc,   // 源矩形左上角x坐标
      int nYSrc,   // 源矩形左上角y坐标
      DWORD dwRop  // 光栅操作码(raster operation code)定义源矩形彩色数据如何与目标矩形彩色数据结合,以达到最终色彩。
    ); 
    BitBlt(hdc2,rect2.left,rect2.top,(rect2.right-rect2.left),(rect2.top-rect2.bottom),
            hdc1,rect1.left,rect1.top,SRCCOPY);
    rect2.top-rect2.bottom不是正的吧,换成rect2.bottom-rect2.top