我想把屏幕截取下来放在一个CBitmap上,可用HDC  hcdc=::GetDC(NULL);为什么获得HDC时总是空值呢?请大家指点一下,谢谢啦

解决方案 »

  1.   

    你给它设置了NULL肯定就是空值了,直接GetDC();就可以的
      

  2.   

    GetDC(NULL)表示获得整个屏幕的,1楼不要瞎说:)获得失败后,你应该用GetLastError看看到底有没有什么错误可能的原因:你的程序和屏幕在不同desktop上(如密码输入窗口就是这样),系统禁止跨desktop去访问
      

  3.   

    GetDC()获得是CDC类型,我这样已经试过了,
    cdc *pdc=getDC();
    hdc hcdc=pdc->GetSafeHdc();
    这样得到的hdc仍然是空值,不知道是为什么
      另外请帮我看看下面这段代码在哪出问题了      HDC  hcdc=::GetDC(NULL);//获得屏幕DC
         HDC  MDC=CreateCompatibleDC(hcdc);  //获得兼容DC
         HBITMAP Bhandle=CreateCompatibleBitmap(hcdc,RectWidth,RectHeight);     
         //Bhandle=SelectObject(MDC,Bhandle);  //这句话总报错,不知道怎么改;
         SelectObject(MDC,Bhandle);   //
         BitBlt(MDC,0,0,RectWidth,RectHeight,hcdc,100,100,SRCCOPY);     
         CBitmap   *oBmp=CBitmap::FromHandle(Bhandle);//保存到了一CBitmap
          return   oBmp;       
      

  4.   

    回复2楼,HDC  hcdc=::GetDC(NULL);运行后只是空值,但并不报错,只是hcdc的各个变量值都是无法计算的,运行如下代码,都可以通过,只是最后返回的OBMP是空值   
          HDC  hcdc=::GetDC(NULL);//获得屏幕DC 
         HDC  MDC=CreateCompatibleDC(hcdc);  //获得兼容DC 
         HBITMAP Bhandle=CreateCompatibleBitmap(hcdc,RectWidth,RectHeight);    
         //Bhandle=SelectObject(MDC,Bhandle);  //这句话总报错,不知道怎么改; 
          SelectObject(MDC,Bhandle);  // 
         BitBlt(MDC,0,0,RectWidth,RectHeight,hcdc,100,100,SRCCOPY);    
         CBitmap  *oBmp=CBitmap::FromHandle(Bhandle);//保存到了一CBitmap 
         return  oBmp; 
      请您再帮我看看,谢谢啦
      

  5.   

    ::GetDC(NULL)是获取屏幕DC的,没错;所以返回为空的话,就应该用GetLastError看看错误信息;既然这里错了,下面代码再看就没有意义,何况还有很多错误。
      

  6.   

        HDC  hcdc=::GetDC(NULL);//获得屏幕DC 
        HDC  MDC=CreateCompatibleDC(hcdc);  //获得兼容DC 
        HBITMAP hbmpOld;
        HBITMAP Bhandle=CreateCompatibleBitmap(hcdc,RectWidth,RectHeight);    
        hbmpOld = SelectObject(MDC,Bhandle);  
         SelectObject(MDC,Bhandle);  // 你把兼容DC里之前的东西存入另外一个HBITMAP应该就行了.
      

  7.   

    不要总指望系统主动向你“报”错,我不是叫你去用GetLastError查错么?!
    系统返回NULL,已经是“报错”了,你还希望它怎么报呢?
      

  8.   

    回复8楼,谢谢啦,可是我不知道怎么用GetLastError查错。不过上面的问题不需要解决了,我又有个新问题了,我将屏幕保存到BITMAP,然后将bitmap直接画到statics上,这样做可以吗?我这样做了一下,编译运行都可以通过,但statics上没有图像,这是为什么呢? 不好意思,我是个新手,所以问题比较多也比较不会抓要点问,请您多多指教,谢谢啦
      

  9.   

    HDC hcdc=::GetDC(NULL);//获得屏幕DC 
    if (hcdc==NULL)
    {
    LPVOID lpMsgBuf;
    FormatMessage( 
        FORMAT_MESSAGE_ALLOCATE_BUFFER | 
        FORMAT_MESSAGE_FROM_SYSTEM | 
        FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        GetLastError(),
        0, // Default language
        (LPTSTR) &lpMsgBuf,
        0,
        NULL 
    );MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
    }