想要在一张已经显示在 Dialog 上的图片上面截取一块区域并且生成文件,比如 100X100 Pixels 的,我用 BitBlt 的方法,数据写入内存,然后数据生成文件,截是截下来了,文件也可以预览,但是问题是生成的文件预览的时候只是原来需要截取区域图像的一部分,它一个区域,这是怎么回事,而察看文件信息时,确实是 100X100 Pixels 啊,但为何生成的文件只有一部分呢?这是怎么回事,是不是哪里需要设置一下啊?

解决方案 »

  1.   


    int  LHxxDISPLAY_SAVEBMP( char*  FileName,int x,int y,int w,int h )  
    {  
    /*
    HDC hDC = ::GetDC(NULL); //获取屏幕DC
    COLORREF clr = ::GetPixel(hDC, ptCursor.x, ptCursor.y); //获取当前鼠标点像素值D3dCom.tp1.x=GetRValue(clr);
    D3dCom.tp1.y=GetGValue(clr); //分解出绿色值
    D3dCom.tp1.z=GetBValue(clr); //分解出蓝色值
    ::ReleaseDC(NULL, hDC); //释放屏幕DC
    */
    HBITMAP  hBitmap;
    RECT rect;
    //获得屏幕分辩率
    rect.left=x;
    rect.top=y;
    rect.right=w+rect.left;
    rect.bottom=h+rect.top;
    // rect.right=GetSystemMetrics(SM_CXSCREEN);
    // rect.bottom=GetSystemMetrics(SM_CYSCREEN);
    //调用截屏函数
    hBitmap=(HBITMAP)GetScreen(&rect);           //设备描述表  
               HDC  hDC;  
               //当前分辨率下每象素所占字节数  
               int  iBits;  
               //位图中每象素所占字节数  
               WORD  wBitCount;  
               //定义调色板大小,  位图中像素字节大小  ,位图文件大小  ,  写入文件字节数    
               DWORD  dwPaletteSize=0,  dwBmBitsSize=0,  dwDIBSize=0,  dwWritten=0;    
               //位图属性结构    
               BITMAP  Bitmap;      
               //位图文件头结构  
               BITMAPFILEHEADER  bmfHdr;      
               //位图信息头结构    
               BITMAPINFOHEADER  bi;      
               //指向位图信息头结构      
               LPBITMAPINFOHEADER  lpbi;      
               //定义文件,分配内存句柄,调色板句柄    
               HANDLE  fh,  hDib,  hPal,hOldPal=NULL;    
                 
               //计算位图文件每个像素所占字节数    
               hDC  =  CreateDC("DISPLAY",  NULL,  NULL,  NULL);  
               iBits  =  GetDeviceCaps(hDC,  BITSPIXEL)  *  GetDeviceCaps(hDC,  PLANES);    
               DeleteDC(hDC);    
               if  (iBits  <=  1)                        wBitCount  =  1;    
               else  if  (iBits  <=  4)              wBitCount  =  4;    
               else  if  (iBits  <=  8)              wBitCount  =  8;    
               else                                                              wBitCount  =  24;    
                 
               GetObject(hBitmap,  sizeof(Bitmap),  (LPSTR)&Bitmap);  
               bi.biSize                                    =  sizeof(BITMAPINFOHEADER);  
               bi.biWidth                                    =  Bitmap.bmWidth;  
               bi.biHeight                                    =  Bitmap.bmHeight;  
               bi.biPlanes                                    =  1;  
               bi.biBitCount                        =  wBitCount;  
               bi.biCompression            =  BI_RGB;  
               bi.biSizeImage                        =  0;  
               bi.biXPelsPerMeter            =  0;  
               bi.biYPelsPerMeter            =  0;  
               bi.biClrImportant            =  0;  
               bi.biClrUsed                        =  0;  
                 
               dwBmBitsSize  =  ((Bitmap.bmWidth  *  wBitCount  +  31)  /  32)  *  4  *  Bitmap.bmHeight;  
                 
               //为位图内容分配内存    
               hDib  =  GlobalAlloc(GHND,dwBmBitsSize  +  dwPaletteSize  +  sizeof(BITMAPINFOHEADER));    
               lpbi  =  (LPBITMAPINFOHEADER)GlobalLock(hDib);    
               *lpbi  =  bi;    
     
               //  处理调色板      
               hPal  =  GetStockObject(DEFAULT_PALETTE);    
               if  (hPal)    
               {    
                           hDC  =  ::GetDC(NULL);    
                           hOldPal  =  ::SelectPalette(hDC,  (HPALETTE)hPal,  FALSE);    
                           RealizePalette(hDC);    
               }  
     
               //  获取该调色板下新的像素值    
               GetDIBits(hDC,  hBitmap,  0,  (UINT)  Bitmap.bmHeight,  (LPSTR)lpbi  +  sizeof(BITMAPINFOHEADER)    
                                       +dwPaletteSize,            (BITMAPINFO  *)lpbi,  DIB_RGB_COLORS);    
                 
               //恢复调色板      
               if  (hOldPal)    
               {    
                           ::SelectPalette(hDC,  (HPALETTE)hOldPal,  TRUE);    
                           RealizePalette(hDC);    
                           ::ReleaseDC(NULL,  hDC);    
               }    
     
               //创建位图文件      
               fh  =  CreateFile(FileName,  GENERIC_WRITE,0,  NULL,  CREATE_ALWAYS,    
                                                               FILE_ATTRIBUTE_NORMAL    |  FILE_FLAG_SEQUENTIAL_SCAN,  NULL);    
                 
               if  (fh  ==  INVALID_HANDLE_VALUE)    return  FALSE;    
                 
               //  设置位图文件头    
               bmfHdr.bfType  =  0x4D42;  //  "BM"    
               dwDIBSize  =  sizeof(BITMAPFILEHEADER)  +  sizeof(BITMAPINFOHEADER)  +  dwPaletteSize  +  dwBmBitsSize;      
               bmfHdr.bfSize  =  dwDIBSize;    
               bmfHdr.bfReserved1  =  0;    
               bmfHdr.bfReserved2  =  0;    
               bmfHdr.bfOffBits  =  (DWORD)sizeof(BITMAPFILEHEADER)  +  (DWORD)sizeof(BITMAPINFOHEADER)  +  dwPaletteSize;    
               //  写入位图文件头    
               WriteFile(fh,  (LPSTR)&bmfHdr,  sizeof(BITMAPFILEHEADER),  &dwWritten,  NULL);    
               //  写入位图文件其余内容    
               WriteFile(fh,  (LPSTR)lpbi,  dwDIBSize,  &dwWritten,  NULL);    
               //清除      
               GlobalUnlock(hDib);    
               GlobalFree(hDib);    
               CloseHandle(fh);    
     
               return  TRUE;  
    }  这个是截图
      

  2.   

    运用下坐标变换呢,或者BitBlt那个可以缩放的函数(具体那个忘了)。
      

  3.   

    解决了,是我实现的方法的问题,我用一个 Static ,100 X 100 来模拟截取的区域,实际上用 GetClientRect 发现是 175 X 175,真是庸人自扰,还是谢谢大家了!