8
Hallo, ich hoffe ihr könnt mir helfen...
Ich habe in meinem Programm eine Methode zum Erstellen eines Screenshots integriert, und dabei folgendes Problem:
Die Methode für den Screenshot funzt soweit gut (habe ich hier im Forum gefunden)...s.u. DC2Bitmap()
Der eigentliche Aufruf sieht folgendermaßen aus: User wählt einen Namen für das Bitmap aus, und dann wird der Screenshot erstellt. Das Problem: Der Screenshot enthält leider nicht nur den eigentlich gewünschten Screenshot des Views, sondern auch den CFileDialog?? Was habe ich übersehen? Muß man nach dem Aufruf des CFileDialog irgendeine Art von Release - Methode aufrufen, damit es klappt?
Vielen Dank schonmal ...!
CString sFilename;
static char BASED_CODE szFilter[] = "Bitmap-Dateien (.bmp)|.bmp||";
int nRes, nwidth,nheight;
CWinApp * pApp = AfxGetApp();
CWnd * wnd = pApp->GetMainWnd();
HDC hdc = NULL;
hdc = ::GetWindowDC(wnd->m_hWnd);
CFileDialog ldFile(false, ".bmp", "test.bmp", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);
nRes = ldFile.DoModal();
if (nRes == IDOK)
sFilename = ldFile.GetPathName();
CRect r;
CMyBView * pView = (CMyView this->GetActiveView() pView->GetWindowRect(&r);
nwidth = r.Width();
nheight = r.Height();
this->DC2Bitmap(hdc,nwidth,nheight,sFilename.GetBuffer(0));
int CMainFrame::DC2Bitmap(HDC hdc, int width, int height, char *filename)
{
// Aus Gerätekontext einen Screenshot machen und speichern
HDC hdc2;
HBITMAP aBmp;
BITMAPINFO bi;
HGDIOBJ OldObj;
void *dibvalues;
HANDLE fileHandle;
BITMAPFILEHEADER bmfh;
BITMAPINFOHEADER bmih;
DWORD bytes_write;
DWORD bytes_written;
hdc2=CreateCompatibleDC(hdc);
ZeroMemory(&bmih,sizeof(BITMAPINFOHEADER));
bmih.biSize=sizeof(BITMAPINFOHEADER);
bmih.biHeight=height;
bmih.biWidth=width;
bmih.biPlanes=1;
bmih.biBitCount=24;
bmih.biCompression=BI_RGB;
bmih.biSizeImage = ((((bmih.biWidth * bmih.biBitCount) + 31) & ~31) >> 3) * bmih.biHeight;
bmih.biXPelsPerMeter = 0;
bmih.biYPelsPerMeter = 0;
bmih.biClrImportant = 0;
bi.bmiHeader=bmih;
aBmp=CreateDIBSection(hdc,&bi,DIB_RGB_COLORS,(void**)&dibvalues,NULL,NULL);
if (aBmp==NULL)
{
OutputDebugString("CreateDIBSection failed!\n");
return 0;
}
OldObj=SelectObject(hdc2,aBmp);
BitBlt(hdc2,0,0,width,height,hdc,0,0,SRCCOPY);
ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER));
bmfh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
bmfh.bfSize=(3*bmih.biHeight*bmih.biWidth)+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
bmfh.bfType=0x4d42;
bmfh.bfReserved1 = 0;
bmfh.bfReserved2 = 0;
fileHandle=CreateFile(filename,GENERIC_READ | GENERIC_WRITE,(DWORD)0,NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,(HANDLE) NULL);
if (fileHandle==INVALID_HANDLE_VALUE)
{
OutputDebugString("CreateFile failed!\n");
return 0;
}
// Write the BITMAPFILEHEADER
bytes_write=sizeof(BITMAPFILEHEADER);
if (!WriteFile(fileHandle,(void*)&bmfh,bytes_write,&bytes_written,NULL))
{
OutputDebugString("WriteFile failed!\n");
return 0;
}
bytes_write=sizeof(BITMAPINFOHEADER);
if (!WriteFile(fileHandle,(void*)&bmih,bytes_write,&bytes_written,NULL))
{
OutputDebugString("WriteFile failed!\n");
return 0;
}
bytes_write=bmih.biSizeImage;//3*bmih.biHeight*bmih.biWidth;
if (!WriteFile(fileHandle,(void*)dibvalues,bytes_write,&bytes_written,NULL))
{
OutputDebugString("WriteFile failed!\n");
return 0;
}
CloseHandle(fileHandle);
DeleteObject(SelectObject(hdc2,OldObj));
DeleteDC(hdc2);
return 1;
}