CRichEditCtrl 里面的内容保存成bmp格式

hglem1 2011-11-01 09:42:32
如图,要怎么做呢?

请各位说说相关的函数 或者方法,谢谢大家了
...全文
63 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hglem1 2011-11-02
  • 打赏
  • 举报
回复
现在我的问题是 怎么才能把 CRichEditCtrl里面的内容 保存到dc中。。。
hglem1 2011-11-02
  • 打赏
  • 举报
回复
HBITMAP CRichEditTestView::GetWindowBitmap(HWND hWnd) //RichEdit的hWnd
{
typedef BOOL ( __stdcall *pPrintWindow )(HWND hWnd,HDC hdcBlt,UINT nFlags);
RECT rect;

::GetWindowRect(hWnd,&rect);

HDC hScrDC=::GetDC(hWnd);//创建屏幕DC
HDC hMemDC=CreateCompatibleDC(hScrDC);//创建内存DC
HBITMAP bitmap=::CreateCompatibleBitmap(hScrDC,rect.right-rect.left,rect.bottom-rect.top);//创建兼容位图
HBITMAP OldBitmap=(HBITMAP)::SelectObject(hMemDC,bitmap);//把位图选进内存DC

//p(hWnd,hMemDC,0);
::PrintWindow(hWnd, hMemDC, 0);


//HDC d;
//HWND hw;
//hw = ::GetDesktopWindow();
//d = ::GetWindowDC( hw );
//::BitBlt( d, 0, 0, 200, 200, hMemDC, 0, 0, SRCCOPY );

::SelectObject(hMemDC,OldBitmap);

::DeleteDC(hMemDC);//删除内存DC
::ReleaseDC(NULL,hScrDC);//释放屏幕DC


/************************************************************************/
/* HBITMAP TO BMP */
/************************************************************************/
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(_T("DISPLAY"), NULL, NULL, NULL);
iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
DeleteDC(hDC);
// wBitCount=1;
if (iBits <= 1) wBitCount = 1;
else if (iBits <= 4) wBitCount = 4;
else if (iBits <= 8) wBitCount = 8;
else wBitCount = 24;

GetObject(bitmap, 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, bitmap, 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);
}

CString pathFile = _T("C:\ABC.bmp");
fh = CreateFile(pathFile, GENERIC_WRITE,0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);

if (fh == INVALID_HANDLE_VALUE)
return NULL;

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 bitmap;
}
用户 昵称 2011-11-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hglem1 的回复:]
参照楼上的方法 保存下来的bmp是全黑色的。。
[/Quote]
俺没对richedit做过测试,不过对窗口做测试是没有问题的,请贴代码出来。
hglem1 2011-11-02
  • 打赏
  • 举报
回复
参照楼上的方法 保存下来的bmp是全黑色的。。
凌乱哥 2011-11-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jennyvenus 的回复:]
C/C++ code
HBITMAP GetWindowBitmap(HWND hWnd)
{
typedef BOOL ( __stdcall *pPrintWindow )(HWND hWnd,HDC hdcBlt,UINT nFlags);
RECT rect;
HMODULE h;
h = LoadLibrary( "user32.dll" )……
[/Quote]...楼上的强大
用户 昵称 2011-11-01
  • 打赏
  • 举报
回复
HBITMAP GetWindowBitmap(HWND hWnd)  
{
typedef BOOL ( __stdcall *pPrintWindow )(HWND hWnd,HDC hdcBlt,UINT nFlags);
RECT rect;
HMODULE h;
h = LoadLibrary( "user32.dll" );
pPrintWindow p;
if( h )
{
p = ( pPrintWindow )::GetProcAddress( h, "PrintWindow" );
}

::GetWindowRect(hWnd,&rect);

HDC hScrDC=::GetDC(hWnd); //创建屏幕DC
HDC hMemDC=CreateCompatibleDC(hScrDC); //创建内存DC
HBITMAP bitmap=::CreateCompatibleBitmap(hScrDC,rect.right-rect.left,rect.bottom-rect.top); //创建兼容位图
HBITMAP OldBitmap=(HBITMAP)::SelectObject(hMemDC,bitmap); //把位图选进内存DC

p(hWnd,hMemDC,0);

//HDC d;
//HWND hw;
//hw = ::GetDesktopWindow();
//d = ::GetWindowDC( hw );
//::BitBlt( d, 0, 0, 200, 200, hMemDC, 0, 0, SRCCOPY );

::SelectObject(hMemDC,OldBitmap);

::DeleteDC(hMemDC) ; //删除内存DC
::ReleaseDC(NULL,hScrDC) ; //释放屏幕DC

return bitmap;
}


这个就能取得某一个窗口图片到bitmap了,然后就可以保存成文件了。
凌乱哥 2011-11-01
  • 打赏
  • 举报
回复
我有类似的代码和程序,得找找
凌乱哥 2011-11-01
  • 打赏
  • 举报
回复
设计一个截图并保存成bmp格式的功能不就行了。但是如果内容过多的话。。。。。。可以代码控制滚动条试试,使得所有的内容都截图下来,具体的实现你分别去搜搜“截图”和“代码控制滚动条”

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧