Sally_pp study

  博客园  :: 首页  ::  :: 联系 :: 订阅 订阅  :: 管理

【转】VC++

整体换成CString:

int     3;
double f1=3.22;
CString   str,str1;
str.Format("%d",   f);
str1.Format(".2f",f1);
MessageBox(str);
MessageBox(str1);

保存CBitmap图片到硬盘的两种方法:

void WriteBmp(CBitmap   *PBitmap)
{
 BITMAPINFO   *m_pBMI;  
    BYTE   *m_pDIBData;  
    BITMAPFILEHEADER   bfh;  
    BITMAPINFOHEADER   bi;  
    BITMAP   BM;  
    PBitmap->GetObject(sizeof(BM),&BM);  
    CClientDC   dc(this);  
    bi.biSize      sizeof(BITMAPINFOHEADER);  
    bi.biWidth      BM.bmWidth;  
    bi.biHeight        BM.bmHeight;  
    bi.biPlanes        1;  
    bi.biBitCount      24;  
    bi.biCompression    0;  
    bi.biSizeImage      0;  
    bi.biXPelsPerMeter    0;  
    bi.biYPelsPerMeter    0;  
    bi.biClrUsed      0;  
    bi.biClrImportant    0;  
           
    bfh.bfType=0x4d42;  
    bfh.bfOffBits=sizeof(bfh)+sizeof(BITMAPINFOHEADER);  
    bfh.bfSize=bfh.bfOffBits+BM.bmWidth*BM.bmHeight*3;  
    bfh.bfReserved1=0;  
    bfh.bfReserved2=0;  
     
    m_pBMI=(BITMAPINFO*)new   char[sizeof(BITMAPINFO)];  
          m_pDIBData=(BYTE*)new   char[bfh.bfSize-bfh.bfOffBits];  
     
    memcpy(m_pBMI,&bi,sizeof(BITMAPINFOHEADER));  
    GetDIBits(dc.GetSafeHdc(),   (HBITMAP)PBitmap->GetSafeHandle(),   0l,   (DWORD)bi.biHeight,  
      (LPVOID)m_pDIBData,(LPBITMAPINFO)m_pBMI,   (DWORD)DIB_RGB_COLORS);  
      CFile   file;  
    if(!file.Open("d:\\002.bmp",CFile::modeCreate|CFile::modeWrite))  
    
      MessageBox("error!");  
      return;  
    
    file.Write(&bfh,sizeof(bfh));  
    file.Write(m_pBMI,sizeof(BITMAPINFOHEADER));  
    file.Write(m_pDIBData,BM.bmWidth*BM.bmHeight*3);  
    file.Close();  


bool SaveBitmapToFile(CBitmap   *bitmap,LPSTR   lpFileName)   //hBitmap   为刚才的屏幕位图句柄   lpFileName   为位图文件名  
           
 HBITMAP   hBitmap;  
 HDC hDC; //设备描述表  
 int iBits; //当前显示分辨率下每个像素所占字节数  
 WORD                         wBitCount; //位图中每个像素所占字节数  
 DWORD                       dwPaletteSize=0, //定义调色板大小,   位图中像素字节大小   ,位图文件大小   ,   写入文件字节数  
  dwBmBitsSize,  
  dwDIBSize,   dwWritten;  
 BITMAP                     Bitmap; //位图属性结构  
 BITMAPFILEHEADER       bmfHdr; //位图文件头结构  
 BITMAPINFOHEADER       bi; //位图信息头结构    
 LPBITMAPINFOHEADER   lpbi; //指向位图信息头结构  
 HANDLE                     fh,   hDib,   hPal,hOldPal=NULL; //定义文件,分配内存句柄,调色板句柄  

 //计算位图文件每个像素所占字节数  
 hBitmap    (HBITMAP)*bitmap;  
 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   if   (iBits   <=   24)  
  wBitCount    24;  
 else if ( iBits <= 32 )
  wBitCount = 32;

 //计算调色板大小  
 if   (wBitCount   <=   8)  
  dwPaletteSize    (1   <<     wBitCount)    sizeof(RGBQUAD);  

 //设置位图信息头结构  
 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.biClrUsed                    0;  
 bi.biClrImportant              0;  

 dwBmBitsSize    ((Bitmap.bmWidth    wBitCount+31)/32)      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,  
  (LPBITMAPINFO   
  lpbi,   DIB_RGB_COLORS);  

 //恢复调色板        
 if   (hOldPal)  
  
  SelectPalette(hDC,   (HPALETTE)hOldPal,   TRUE);  
  RealizePalette(hDC);  
  ::ReleaseDC(NULL,   hDC);  
  

 //创建位图文件          
 fh    CreateFile(lpFileName,   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;  
 

posted on 2011-06-01 15:40  Sally_pp  阅读(202)  评论(0)    收藏  举报