我刚刚接触到vtk这方面的知识,还是个新手
我想请教高手,vtk中有个mpr功能,我看了很多别人发部的帖子,他处理完图片后,使用的是vtk自己的绘画窗口,显示的图像效果,我想请问下能不能用dc 把这些对象图像给画出来 如果是分数不够的话我可以开贴加分
我想请教高手,vtk中有个mpr功能,我看了很多别人发部的帖子,他处理完图片后,使用的是vtk自己的绘画窗口,显示的图像效果,我想请问下能不能用dc 把这些对象图像给画出来 如果是分数不够的话我可以开贴加分
void CMapXViewView::SaveHwndToBmpFile(HWND hWnd, LPCTSTR lpszPath)
{
HDC hDC = ::GetWindowDC(hWnd); //直接获取窗体句柄
ASSERT(hDC); HDC hMemDC = ::CreateCompatibleDC(hDC);
ASSERT(hMemDC); RECT rc;
::GetWindowRect(hWnd, &rc); HBITMAP hBitmap = ::CreateCompatibleBitmap(hDC, rc.right - rc.left -5, rc.bottom - rc.top-5);
ASSERT(hBitmap); HBITMAP hOldBmp = (HBITMAP)::SelectObject(hMemDC, hBitmap);
::PrintWindow(hWnd, hMemDC, PW_CLIENTONLY); //拷贝句柄进入内存句柄,保留你VTK的图像
//::StretchBlt() BITMAP bitmap = {0};
::GetObject(hBitmap, sizeof(BITMAP), &bitmap);
BITMAPINFOHEADER bi = {0};
BITMAPFILEHEADER bf = {0}; CONST int nBitCount = 24;
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = bitmap.bmWidth;
bi.biHeight = bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = nBitCount;
bi.biCompression = BI_RGB;
DWORD dwSize = ((bitmap.bmWidth * nBitCount + 31) / 32) * 4 * bitmap.bmHeight; HANDLE hDib = GlobalAlloc(GHND, dwSize + sizeof(BITMAPINFOHEADER));
LPBITMAPINFOHEADER lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
*lpbi = bi; ::GetDIBits(hMemDC, hBitmap, 0, bitmap.bmHeight, (BYTE*)lpbi + sizeof(BITMAPINFOHEADER), (BITMAPINFO*)lpbi, DIB_RGB_COLORS); try
{
CFile file;
file.Open(lpszPath, CFile::modeCreate | CFile::modeWrite);
bf.bfType = 0x4d42;
dwSize += sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bf.bfSize = dwSize;
bf.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); file.Write((BYTE*)&bf, sizeof(BITMAPFILEHEADER));
file.Write((BYTE*)lpbi, dwSize);
file.Close();
}
catch(CFileException* e)
{
e->ReportError();
e->Delete();
} GlobalUnlock(hDib);
GlobalFree(hDib); ::SelectObject(hMemDC, hOldBmp);
::DeleteObject(hBitmap);
::DeleteObject(hMemDC);
::ReleaseDC(hWnd, hDC);
}
如果这还不行,只能直接获取::GetDesktopWindow()来获取窗体句柄来截图呈现。
PS:由于GDI和GDI+和OpenGL,D3D实现机制有很大差异,可能这个方法不一定能行。视频直接通过截图是获取不到得。不知道PrintWindow是否做了相关措施没。可以尝试下
不知道这样行不行