怎样在程序中生成这样一位图呢?比如保存为1.bmp

解决方案 »

  1.   

    DEMO
    在对话框上放一个Static,ID:IDC_STATIC_BMP用于显示BMP
    一个Button用于生成BMP.void CTestDlg::OnButton1() 
    {
    HWND hDispHwnd = GetDlgItem(IDC_STATIC_BMP)->GetSafeHwnd();
    HDC dc = ::GetDC(hDispHwnd);
    HDC dcMem;
    dcMem = ::CreateCompatibleDC(dc); HBITMAP hBitmap = ::CreateCompatibleBitmap(dc , 128 ,128);
    HBITMAP hOldBm = (HBITMAP)::SelectObject(dcMem , hBitmap);
    SetBkColor(dcMem , RGB(255,255,255));
    SetTextColor(dcMem , RGB(0,0,0)); LOGFONT logFont;
    memset(&logFont, 0, sizeof(LOGFONT));
    logFont.lfHeight = 20; 
    lstrcpy(logFont.lfFaceName, _T("Arial")); HFONT hFont = CreateFontIndirect(&logFont); HFONT oldFont = (HFONT)SelectObject( dcMem , hFont); SetBkColor(dcMem , RGB(255,255,255));

    SetTextColor(dcMem , RGB(0,0,0,));
    SIZE size;
    GetTextExtentPoint32(dcMem , "Hello" , 5 , &size); TextOut(dcMem , (128 - size.cx) /2 , (128 - size.cy) /2 , "Hello" , 5);

    BitBlt( dc , 0 , 0 , 128 , 128 , dcMem , 0 , 0 ,  SRCCOPY);
    SelectObject(dcMem , hOldBm);
    SelectObject(dcMem , oldFont);
    ::DeleteDC(dcMem);
    SaveBmp(hBitmap , "E:\\Temp.bmp");
    DeleteObject(hBitmap);
    DeleteObject(hFont);
    ::ReleaseDC( m_hWnd , dc);

    }BOOL CTestDlg::SaveBmp(HBITMAP hBitmap, CString FileName)
    {
    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.   

    Sorry,
    Release( m_hWnd , dc);
    应为::ReleaseDC( hDispHwnd , dc);
      

  3.   

    lanstar200(码雅哥布林) ,这段代码非常适合,可是中间的字的显示区域的背景色不和位图的一样,我设为透明,就显示不出字了,怎么解决?
      

  4.   


    SetBkColor(dcMem , RGB(255,255,255));
    SetTextColor(dcMem , RGB(0,0,0,));
    改成
    SetBkMode(dcMem , TRANSPARENT);
    SetTextColor(dcMem , RGB(255,255,255));
      

  5.   

    RGB(0,0,0)是黑色,跟背景色相同了,设成其他颜色就OK了
      

  6.   

    怎么改了SetBkColor(dcMem , RGB(255,0,0));还是底色黑色?
      

  7.   

    //字体
    logFont.lfHeight = 20; //字体高度
    lstrcpy(logFont.lfFaceName, _T("Arial"));//字体名称
    //字体颜色改变下面两个函数的RGB值
    SetBkColor(dcMem , RGB(0,0,0));//背景色
    SetTextColor(dcMem , RGB(255,255,255));//字体颜色
      

  8.   

    调用了SetBkColor就不能再用SetBkMode(dcMem , TRANSPARENT);了这句是使用透明背景色
      

  9.   

    void CTestDlg::OnButton1() 
    {
    HWND hDispHwnd = GetDlgItem(IDC_STATIC_BMP)->GetSafeHwnd();
    HDC dc = ::GetDC(hDispHwnd);
    HDC dcMem;
    dcMem = ::CreateCompatibleDC(dc); HBITMAP hBitmap = ::CreateCompatibleBitmap(dc , 128 ,128);
    HBITMAP hOldBm = (HBITMAP)::SelectObject(dcMem , hBitmap);

    LOGBRUSH logbr;
    memset(&logbr , 0 , sizeof(LOGBRUSH));
    logbr.lbColor = RGB(255,0,0);//这里改变位图背景
    logbr.lbStyle = BS_SOLID;
    HBRUSH hBrush = CreateBrushIndirect(&logbr);
    HBRUSH oldbr = (HBRUSH)SelectObject(dcMem , hBrush); RECT rt = {0,0,128,128};
    FillRect(dcMem , &rt , hBrush);
    LOGFONT logFont;
    memset(&logFont, 0, sizeof(LOGFONT));
    logFont.lfHeight = 20; 
    lstrcpy(logFont.lfFaceName, _T("Arial")); HFONT hFont = CreateFontIndirect(&logFont); HFONT oldFont = (HFONT)SelectObject( dcMem , hFont); //SetBkColor( dcMem , RGB(255,0,0));
    SetBkMode(dcMem , TRANSPARENT);
    SetTextColor(dcMem , RGB(255,255,255)); SIZE size;
    GetTextExtentPoint32(dcMem , "Hello" , 5 , &size); TextOut(dcMem , (128 - size.cx) /2 , (128 - size.cy) /2 , "Hello" , 5);

    BitBlt( dc , 0 , 0 , 128 , 128 , dcMem , 0 , 0 ,  SRCCOPY);
    SelectObject(dcMem , hOldBm);
    SelectObject(dcMem , oldFont);
    SelectObject(dcMem , oldbr);
    ::DeleteDC(dcMem);
    SaveBmp(hBitmap , "E:\\Temp.bmp");
    DeleteObject(hBitmap);
    DeleteObject(hFont);
    DeleteObject(hBrush);
    ::ReleaseDC( hDispHwnd , dc);

    }