怎样生成一位图,128*128,底色黑,正中为字“hello”,字体在程序中修改。 怎样在程序中生成这样一位图呢?比如保存为1.bmp 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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; } Sorry,Release( m_hWnd , dc);应为::ReleaseDC( hDispHwnd , dc); lanstar200(码雅哥布林) ,这段代码非常适合,可是中间的字的显示区域的背景色不和位图的一样,我设为透明,就显示不出字了,怎么解决? 把SetBkColor(dcMem , RGB(255,255,255));SetTextColor(dcMem , RGB(0,0,0,));改成SetBkMode(dcMem , TRANSPARENT);SetTextColor(dcMem , RGB(255,255,255)); RGB(0,0,0)是黑色,跟背景色相同了,设成其他颜色就OK了 怎么改了SetBkColor(dcMem , RGB(255,0,0));还是底色黑色? //字体logFont.lfHeight = 20; //字体高度lstrcpy(logFont.lfFaceName, _T("Arial"));//字体名称//字体颜色改变下面两个函数的RGB值SetBkColor(dcMem , RGB(0,0,0));//背景色SetTextColor(dcMem , RGB(255,255,255));//字体颜色 调用了SetBkColor就不能再用SetBkMode(dcMem , TRANSPARENT);了这句是使用透明背景色 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); } VS2005 C++ 连接 oracle问题 DrawCli例子中的DrawTool类 用nmake编译的问题: don't know how to make "*.pch" 怎样通过向按钮发送消息 来实现 貌似点击的操作? 格式化输出小问题 CListCtrl和CImageList如何配合使用? 春节想一点源代码回家看一看,学习学习,一般大的工程。 NetShareAdd怎么不行啊 无奈了,求高手解决OCX在IIS网站下无法加载问题 怎样在不用ATL和MFC的情况下做一个嵌入主页的ACTIVEX控件,并且能够调用其属性。 令人匪夷所思的问题? 如何改变标题栏的高度?
在对话框上放一个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;
}
Release( m_hWnd , dc);
应为::ReleaseDC( hDispHwnd , dc);
SetBkColor(dcMem , RGB(255,255,255));
SetTextColor(dcMem , RGB(0,0,0,));
改成
SetBkMode(dcMem , TRANSPARENT);
SetTextColor(dcMem , RGB(255,255,255));
logFont.lfHeight = 20; //字体高度
lstrcpy(logFont.lfFaceName, _T("Arial"));//字体名称
//字体颜色改变下面两个函数的RGB值
SetBkColor(dcMem , RGB(0,0,0));//背景色
SetTextColor(dcMem , RGB(255,255,255));//字体颜色
{
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);
}