求问如何获取文字的位图图像 如题,想要把文字加到一个图片中去,应该从何着手?有api可用么? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在内存DC中创建位图,将位图选入内存DC中,然后,用内存DC进行绘制字体,这样,你绘制的内容都在位图上了,只要将位图保存到文件中就可以了 . 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); SetBkMode(dcMem, TRANSPARENT); SetTextColor(dcMem, RGB(255,255,255)); SIZE size; GetTextExtentPoint32(dcMem, _T("Hello"), 5, &size); TextOut(dcMem, (128 - size.cx)/2, (128 - size.cy)/2, _T("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); BOOL 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; } 如何直接把图片拖进单文档内显示 求个比较图片比较快的算法【VC】 请教SDI中pDoc->UpdateAllViews(NULL)问题 怎么添加服务?用函数还是直接写注册表? 如何从dll里创建一对话框? 我是初学者提个傻问题,请问VC编程中#pragma once是什么意思? Dialog的一个button如何控制程序的进度,例如暂停,继续等,求大神指导 如何将vb一个控件的hwnd传递给dll???????? 很菜的问题 再问一遍dll的问题。 请问,有人知道网络蚂蚁、网际快车的进度窗口是如何实现的吗?(不是悬浮的那个窗口) 动态链接库dll做的对话框里能不能添加播放视频的控件
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货