HDC hScrDC,hMemDC; 
HBITMAP hBitmap,hOldBitmap; 
int  nWidth=::GetSystemMetrics(SM_CXSCREEN);   
int  nHeight=::GetSystemMetrics(SM_CYSCREEN);
HDC MyDC=::GetDC(m_hWnd);
hScrDC=CreateDC(L"DISPLAY",NULL,NULL,NULL); //这个和下面那一句我试了下效果一样.不知道有什么区别
//hScrDC=::GetDC(NULL);
hMemDC=CreateCompatibleDC(hScrDC); 
hBitmap=CreateCompatibleBitmap(hScrDC,nWidth,nHeight); 
hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap); 
BitBlt(hMemDC,0,0,nWidth,nHeight,hScrDC,0,0,SRCCOPY); 
hBitmap=(HBITMAP)SelectObject(hMemDC,hOldBitmap); 这样貌似就得到了一个屏幕图象的HBITMAP
我不知道这样得到的HBITMAP和(HBITMAP)LoadImage(NULL,"pic1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);这样得到的HBITMAP有什么不同...
还有.我试着输出hBitmap想看看它指向的地址结果发现这貌似并不是一个地址...小弟刚接触这个请大哥们讲解讲解

解决方案 »

  1.   

    不一样啊,::GetDC(NULL); 获取的是屏幕DC啊
      

  2.   

    HDC GetDC( 
      HWND hWnd
    ); 
    Parameters
    hWnd 
    Handle to the window whose device context is to be retrieved. If this value is NULL, GetDC retrieves the device context for the entire screen. HDC CreateDC( 
      LPCTSTR lpszDriver, 
      LPCTSTR lpszDevice, 
      LPCTSTR lpszOutput, 
      CONST DEVMODE* lpInitData
    );
    Parameters
    lpszDriver 
    [in] Long pointer to a null-terminated string that specifies the file name of a driver. If this parameter is set to NULL, the system returns a screen DC. 
    根据MSDN解释,我个人认为CreateDC的第一个参数设为NULL也可以返回screen DC。
    MSDN上的例子是这样调用这个函数的hIC = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);
    这样就是专门用于获取显示设备的DC
    这样得到的HBITMAP与LoadImage得到的HBITMAP是一样的,都是位图句柄,图像信息存放在内存中。
      

  3.   

    上面是新建一个DC
    后面是得到本窗口的DCHBITMAP也是一样
    你的是create的,LoadImage是具体以个位图的句柄
      

  4.   

    HBITMAP是个句柄,其实就是一个整型值。句柄跟指针是不一样的,句柄的值一般都不是数据块的地址。而是一个索引号,系统内部会有一个索引号到地址的映射表。真正的地址是由系统在那个表里查出来用的,你不能拿句柄当指针用。
      

  5.   

    谢谢大家..
    最后问一下
    如果我想用GetBitmapBits函数把那个HBITMAP读入到一个buf中该怎么写呢?
    因为这个函数有个参数是这个位图的大小~~~
      

  6.   

            BITMAP bm;
            GetObject(hBitmap,sizeof(bm),&bm);
    GetBitmapBits(hBitmap,bm.bmWidth*bm.bmHeight*每位占的字节数,buf);
    这个每位占的字节数怎么得到呢????还有我这样做了一后buf里是什么??只有象素数据还是有其他的东西.
      

  7.   

    哦.知道了.刚才没注意看BITMAP这个结构
    GetBitmapBits(hBitmap,bm.bmWidth*bm.bmHeight*bm.bmBitsPixel,buf);
    这样就可以了..我这样做了一后buf里是什么??只有象素数据还是有其他的东西.
      

  8.   

    我这样做了一后buf里是什么??只有象素数据还是有其他的东西.
    ===========
    应该是数据,具体的说就每一个点的RGB值
      

  9.   

    GetBitmapBits的第2个参数到底是什么我看网上还有说是bm.bmHeight*bm.bmWidthBytes
      

  10.   

    同意4楼,你的hBitmap本来就不是指针,而是HBITMAP句柄,这种句柄的数量是系统事先就规定死了的,用户不能创建句柄,只能够从系统事先创建好的句柄中分配得到,我曾经看到过这样一个程序,它证明了这一点。
      

  11.   

    11楼说得不完全正确,当位图有调色板(256色及以下的位图都使用调色板)时,像素值只是位图像素的RGB颜色在调色板中真实颜色值的索引号。