CDialog *m_pDlg = new CDialog(); 
//m_pDlg = new DialogShow();
    if(m_pDlg)    
    {    
        if(!m_pDlg->Create(IDD_DLGSHOW, this))     
        {    
            MessageBox( _T("对话框初始化失败"), _T("温情提示") );    
            return ;    
        } 
     }////////////////我用Create创建了一个对话框。DWORD* pResultBuf = NULL;  pDC= m_pDlg->GetDC();  //然后截取屏幕到为bmp到 pResultBuf中。为什么用如下代码显示不到上面的对话框中。 if(bm.CreateBitmap(497, 448,1,32, pBuffer))
{
   
CBrush brush;    
if(brush.CreatePatternBrush(&bm))
{

CBrush* pOldBrush = (CBrush*)pDC->SelectObject(&brush);    

pDC->FillRect(&CRect(rect.left + m_ShowOffsetX, rect.top + m_ShowOffsetY,    
            497, 448), &brush);    

pDC->SelectObject(pOldBrush);    

brush.DeleteObject();   
}
bm.DeleteObject();    
ReleaseDC(pDC); 
}

解决方案 »

  1.   

    CDialog *m_pDlg = new CDialog();  这个对话框没看到你ShowWindow啊m_pDlg->ShowWindow(SW_SHOW)
      

  2.   

    谢谢楼上的回复,我的对话框已经show出来了,(描述问题省略了。只挑了主要的代码)。 现在就是上面画刷画图没有显示出来。不知道哪里错了。
      

  3.   

    哪里忘了? if(bm.CreateBitmap(497, 448,1,32, pBuffer))这个pBuffer里面已经得到截取的位图信息了,我有写一个保存到本地的。但是就是下面那个代码显示不到对话框上。
      

  4.   

    你绘图的操作是放在WM_PAINT消息的响应函数OnPaint中吗?
      

  5.   

    不是。先是Create对话框,然后显示。然后取得对话框的DC,然后画的图。你看上面的代码
      

  6.   


    pBuffer 里面我已经截取了屏幕并以bmp格式存在pBuffer里面呀。
    我现在用GetDC取到对话框的DC,然后用画刷画出pBuffer里的内容来。
    不知道我上面的代码哪里出错了?
      

  7.   

    在pDC->SelectObject(pOldBrush);前面调用BitBlt函数 
      

  8.   

    哪有啊?我根本就没有看到BitBlt啊?
      

  9.   

    BitBlt 
    有一个hdc的参数,?咋取?
      

  10.   

    这个要看你的代码写在什么地方,如果写在OnPaint中的话,可以用CPaintDC,如果不在OnPaint中的话,可以用GetDC。
      

  11.   

    我现在是在对话框上有一个按钮,我点击这个按钮就create另一个对话框,同时把这个对话框的DC传进去执行。 OnPaint 函数执行不到。
      

  12.   

    引用 9 楼 feixue5199 的回复:
    在pDC->SelectObject(pOldBrush);前面调用BitBlt函数
    哪有啊?我根本就没有看到BitBlt啊?我是回复的楼主这句话
      

  13.   

    我现在是在对话框上有一个按钮,我点击这个按钮就create另一个对话框,同时把这个对话框的DC传进去执行。 OnPaint 函数执行不到。
    ===============
    你到底显示在哪个对话框上啊?第一个还是另一个啊?你传啊个DC给哪个啊?
      

  14.   

    楼主,不是已经调用了GetDC了么pDC= m_pDlg->GetDC();
      

  15.   


    第一个对话框上有一个按钮,点击后用的是create方法创建的第二个对话框, 然后在第一个对话框上有一个显示图像的函数,这个函数有个参数传入第二个话框的DC(m_pDlg->GetDC();), 然后用这个函数在第二个对话框显示图像。不知这样解释清楚没有?
      

  16.   

     if(bm.CreateBitmap(497, 448,1,32, pBuffer))
            {
       
                CBrush brush;    
                if(brush.CreatePatternBrush(&bm))
                {
                    
                    CBrush* pOldBrush = (CBrush*)pDC->SelectObject(&brush);    
                    
                    pDC->FillRect(&CRect(rect.left + m_ShowOffsetX, rect.top + m_ShowOffsetY,    
                497, 448), &brush);    
                    
                    pDC->SelectObject(pOldBrush);    
                    
                    brush.DeleteObject();   
                }
                bm.DeleteObject();    
                ReleaseDC(pDC); 
            }首先,你得测试下你这个代码在正常对话框上,能不能显示出你想要的图.
    如果能,那你得看看
    CRect(rect.left + m_ShowOffsetX, rect.top + m_ShowOffsetY, 497, 448),
    这个矩形所在的位置,是否不在你的new出来的对话框可见区域.
      

  17.   


       CDC   memDC;   
       CBitmap   memBitmap;   
       if(memDC.CreateCompatibleDC(pDC))
       {
       AfxMessageBox("ok1");
       }
       else
       {
       AfxMessageBox("error1");
       }
       if(memBitmap.CreateBitmap(497,448,1,32, pBuffer))
       {
       AfxMessageBox("ok2");
       }
       else
       {
       AfxMessageBox("error2");
       }
       CBitmap*   pOldBitmap= memDC.SelectObject(&memBitmap);    
       pDC->BitBlt(0,0,497,448,&memDC,0,0,SRCCOPY);     
       if(memDC.SelectObject(pOldBitmap))
       {
       AfxMessageBox("ok3");
       }
       else
       {
       AfxMessageBox("error3");
       }
       memBitmap.DeleteObject();    
       ReleaseDC(pDC); 
    上面的代码弹出error3 对话框。 不知道哪里有错。
      

  18.   

    上面的代码弹出error3 对话框。 不知道哪里有错
    ========
    能显示出来吗?我觉得是一定显示不出来。
      

  19.   


    memBitmap.CreateBitmap(497,448,1,32, pBuffer)
    要改成
    CreateCompatibleBitmap
    ========================================另外,你1楼的代码没问题,怀疑你绘图的区域有问题,你再检查一下
    CRect(rect.left + m_ShowOffsetX, rect.top + m_ShowOffsetY,497, 448);
      

  20.   

        bm.CreateCompatibleBitmap(pDC, 497, 448);
    //bm.CreateBitmap(497,448,1,32, pBuffer); 用上面的代码,我直接注释掉这一句,可以看到一个黑框在对话框里,说明区域是对的。
    但如何把pBuffer的内容显示出来。
      

  21.   

    bm.CreateCompatibleBitmap(pDC, 497, 448);
    //bm.CreateBitmap(497,448,1,32, pBuffer); 用上面的代码,我直接注释掉这一句,可以看到一个黑框在对话框里,说明区域是对的。
    但如何把pBuffer的内容显示出来。
    ===============
    你的pBuffer中是位图数据,你可以用
    DWORD SetBitmapBits(
       DWORD dwCount,
       const void* lpBits 
    );
    将pBuffer中的数据导入到一个CBitmap对象中去,然后显示。
      

  22.   

    问题解决了。不过采用的是另一种方法。
    先把pBuffer里的位图数据保存成bmp图片到本地硬盘。然后
    LoadImage 进来再BitBlt到客户区中。
    不过还有个问题就是创建出来的对话框总是闪动。
      

  23.   


    第二个对话框是Create出来的,好像OnInitDialog, OnPaint等函数都不执行。
    我这个对话框是做成半透明的,然后置顶在屏幕上。
    然后再在上面画一些东东。现在创建出的对话框总闪动。
      

  24.   


    第二个对话框在特定位置显示,并且是半透明的。然后在上面再显示一些东东。
    鼠标点上去不会有焦点。会透过这个对话框。 
    现在基本完成了,图也显示出来了。
    只不过会不定的闪动。
    高手们给个思路如何去闪动。OnInitDialog, OnPaint等函数都不执行;
    有什么办法没?
      

  25.   

    只不过会不定的闪动。
    高手们给个思路如何去闪动。OnInitDialog, OnPaint等函数都不执行;
    有什么办法没?
    ==============
    闪动的原因找到了吗?一般是重绘引起的。
      

  26.   


    应该是重绘引起的,一般情况应该可以在OnPaint来解决,现在不知道在哪解决?
      

  27.   

    在你要画的区域创建内存DC
    在内存dc上画就应该能解决
    CDC *pDC = GetDC();
    CDC MemDC;
    CDC Bitmap;
    MemDC.CreateCompatibleDC(pDC);
    Bitmap.LoadBitmap(IDB_GREEN);
    CBitmap *oldmap = MemDC.SelectObject(&Bitmap);
    pDC->BitBlt(0,0,rect.right,rect.bottom,&MemDC,0,0,SRCCOPY); 
    MemDC.SelectObject(oldmap);
    Bitmap.DeleteObject();
    MemDC.DeleteDC();
    ReleaseDC(pDC);
      

  28.   

    这种方法我试过,确实能行,但是LoadBitmap是个资源文件,我的图是实时更新的.
      

  29.   

    闪动?双缓冲贴图可以解决闪烁的问题。将要贴的图片贴到内存中,在把该内存DC给BitBlt到客户区