Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Fensterinhalt speichern?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
01.02.2006, 14:04 Uhr
~antalia
Gast


Hallo,

ich habe eine SDI-Anwendung und lasse in meinem Hauptfenster berechnete Werte ausgeben. Kann ich diesen Fensterinhalt speichern ? (Vielleicht mit Serialize?)

Und was noch wichtiger ist, wie kann ich dieses Fenster drucken lassen? Ohne den Druckdialog zu benutzen, quasi einfach wie einen Screenshot speichern und gleich ausdrucken mit voreingestellten Optionen (zB Format und Ränder und so). Ist das machbar? und wenn ja wie?

sorry, falls es das Thema schon gibt, aber ich hab einfach nichts passendes gefunden in den Themen, die ich durchgeschaut habe...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
02.02.2006, 08:35 Uhr
~antalia
Gast


Hallo,
kann mir echt keiner helfen? Das ist mein Code fürs Drucken. Der Drucker blinkt auch kurz unten in der Taskleiste auf, aber mehr passiert nicht. Was mach ich denn falsch?


Code:
void CKollisionView::OnDrucken()
{
// Unser Drucker- Handle, dieser wird von der Methode Get_Printer mit den Druckerinfos
// beschrieben.
HDC printer_Handle;
// eine Docinfo, in der wir uns den Aufbau der Seite vorgeben.
DOCINFO docinfo;
// Die Matrix fuer die Transformation in Druckerkoordinaten.
XFORM xForm;
// Der Handle auf den Printer wird geholt.
Get_Printer(&printer_Handle);
// Die Informationen ueber die Seite welche an den Drucker gegeben werden.
docinfo.cbSize = sizeof(DOCINFO);
docinfo.lpszDocName = "Plan-Doc";
docinfo.lpszOutput = NULL;
docinfo.lpszDatatype = NULL;
docinfo.fwType = 0;

// Ein neues Dokument wird begonnen.
StartDoc(printer_Handle, &docinfo);

// Um die Transformationsmatrix setzen zu koenne muessen erst noch einige Einstellungen
// geaendert werden.
SetGraphicsMode(printer_Handle, GM_ADVANCED);
SetMapMode(printer_Handle, MM_HIMETRIC);

// Definition der Transformationsmatrix.    
xForm.eM11 = (FLOAT) 4.0;
xForm.eM12 = (FLOAT) 0.0;
xForm.eM21 = (FLOAT) 0.0;
xForm.eM22 = (FLOAT) 4.0;
xForm.eDx  = (FLOAT) 0.0;
xForm.eDy  = (FLOAT) -29000.0;

// Das Dokument ist abgeschlossen.
EndDoc(printer_Handle);

DeleteDC(printer_Handle);

char Datum[8];
char Zeit[8];
_strtime(Zeit);          // Holen der aktuellen Systemzeit.
_strdate(Datum);      // Das Datum holen.

// Den Blattkopf schreiben.
TextOut((printer_Handle), 500, 6650, "Klinik für Strahlentherapie Uni - Magdeburg", 43);
TextOut((printer_Handle), 3750, 6650, "Seite ", 6);
TextOut((printer_Handle), 4050, 6650, "1", 1);

TextOut((printer_Handle), 500, 6550, "Datum (mm/tt/jj): ", 18);
TextOut((printer_Handle), 1400, 6550, Datum, 8);
TextOut((printer_Handle), 500, 6450, "Zeit: ", 6);
TextOut((printer_Handle), 1400, 6450, Zeit, 8);
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.02.2006, 00:21 Uhr
~berny
Gast


Du musst dem Drucker noch mitteilen, was er wie Drucken soll, nämlich das, was der Druckdialog sonst erledigt. Bei mir funktioniert das prima. Ausserdem löscht Du den DC zu früh.

PRINTDLG pd; // Save MFC's printer and install ours instead.
LPDEVMODE lpDevMode;

AfxGetApp()->GetPrinterDeviceDefaults(&pd);
AfxGetApp()->SelectPrinter(pd.hDevNames,pd.hDevMode,FALSE);
lpDevMode = (LPDEVMODE) GlobalLock(pd.hDevMode);
if(lpDevMode!=NULL)
{
// For each option, only change it if the printer supports it.
if (lpDevMode->dmFields & DM_ORIENTATION)
{
if(m_nFormat == 1)
{
lpDevMode->dmOrientation = DMORIENT_LANDSCAPE; // Querformat
lpDevMode->dmPaperWidth = nHoehe;
lpDevMode->dmPaperLength = nBreite;
}
else
{
lpDevMode->dmOrientation = DMORIENT_PORTRAIT; // Hochformat
}
}
if (lpDevMode->dmFields & DM_PAPERSIZE)
lpDevMode->dmPaperSize = DMPAPER_A4;
lpDevMode->dmCopies = m_nCopies;
GlobalUnlock(pd.hDevMode);
}


Zum Speichern der Fensterinhalte funktioniert folgendes:

#include "afxwin.h"
#include "atlimage.h"

void CAtlImageMfcDlg::OnBnClickedSave()
{
CRect r;
GetClientRect(r);

CImage image;
image.Create(r.Width(), r.Height(), 32);

CDC *cdc = GetDC();
CDC *idc = CDC::FromHandle(image.GetDC());

idc->BitBlt(0, 0, r.Width(), r.Height(), cdc, 0, 0, SRCCOPY);
image.ReleaseDC();

image.Save("c\test.png");
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
06.02.2006, 09:51 Uhr
~antalia
Gast


Hey, danke!!

*freu*

das probier ich gleich mal aus...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
06.02.2006, 10:23 Uhr
~antalia
Gast


Hallo,

beim speichern kann er die include-Datei "atlimage.h" nicht finden.
brauch man da irgendein zusatzprogramm?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
06.02.2006, 15:18 Uhr
~berny
Gast



Zitat von ~antalia:
Hallo,

beim speichern kann er die include-Datei "atlimage.h" nicht finden.
brauch man da irgendein zusatzprogramm?

....ist leider .net

....dann lade Dir von www.codeprojekt.com/bitmap/cximage.asp die cximage lib runter. Mit dieser lib kannst grafiken laden, speichern und vieles mehr.
Wenn Du die lib eingebunden hast kannst Du z.B. damit den Fensterinhalt speichern:

#include "CxImage\xImage.h"

void CCxImageBmpTestDlg::OnTest()
{
CRect r;
GetClientRect(r);

CDC *cdc = GetDC();

CBitmap bm;
bm.CreateCompatibleBitmap(cdc, r.Width(), r.Height());

CDC bmdc;
bmdc.CreateCompatibleDC(cdc);
bmdc.SelectObject(bm);
bmdc.BitBlt(0, 0, r.Width(), r.Height(), cdc, 0, 0, SRCCOPY);

CxImage image;
image.CreateFromHBITMAP(bm);

image.Save("c\test.bmp", CXIMAGE_FORMAT_BMP);
DeleteDC(bmdc);
DeleteObject(bm);

}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
06.02.2006, 15:21 Uhr
~berny
Gast


....Der richtige Link ist: www.codeproject.com/bitmap/cximage.asp
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
07.02.2006, 08:36 Uhr
~antalia
Gast


sorry, klingt jetz vielleicht blöd,
aber wohin in meinen Visual Studio Ordner muss ich die runtergeladenen Dateien stecken?

Oder gibts vielleicht ne ReadMe, die ich übersehen hab?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
07.02.2006, 18:00 Uhr
~berny
Gast



Zitat von ~antalia:
sorry, klingt jetz vielleicht blöd,
aber wohin in meinen Visual Studio Ordner muss ich die runtergeladenen Dateien stecken?

Oder gibts vielleicht ne ReadMe, die ich übersehen hab?


Du kannst die Dateien hintun wo Du möchtest. Du musst nur im VC unter
Projekt->Einstellungen->Linker den Ort der cximage.lib und der zlib.lib angeben (release/debugmode) die cximage.dll sollte im gleichen Verzeichnis wie exe datei stehen.

Steht aber eigentlich alles auf der Seite.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
07.02.2006, 20:54 Uhr
~berny
Gast


habe noch was gefunden, wie Du mit bordeigenen Mitteln das Fenster als bmp abspeichern kannst. Trotzdem empfehle ich die Cximage Methode, denn wenn einmal eingebunden kannst Du z.B. ohne große Probleme vergrößern, drehen....etc.

void SaveBitmap()
{
CDC dcScaled;
CBitmap bmScaled;
BITMAP bmp;
PBITMAPINFO pbmi;
PBITMAPINFOHEADER pbih;
BITMAPFILEHEADER bfh;
WORD cClrBits;
LPBYTE lpBits;
DWORD cb;
BYTE *hp;
unsigned long NrBmpBits;
CRect r;

HWND hDeskTop = ::GetActiveWindow( );
CDC* pDC= CWnd::FromHandle(hDeskTop) ->GetWindowDC();
GetClientRect(r);
dcScaled.CreateCompatibleDC(pDC);
int nWidth = abs(r.right - r.left);
int nHeight = abs(r.bottom - r.top);
if( bmScaled.CreateCompatibleBitmap( pDC,nWidth,nHeight ) == 0 )
{
AfxMessageBox("Could not Create compatible Bitmap");
return;
}
if(!dcScaled.SelectObject(bmScaled))
{
AfxMessageBox("Could not select Bitmap-Object");
return;
}
if(!dcScaled.BitBlt(0,0,nWidth,nHeight,pDC,0,0,SRCCOPY))
{
AfxMessageBox("Could not copy Bitmap-Object");
return;
}
if(!bmScaled.GetObject(sizeof(BITMAP),&bmp))
{
AfxMessageBox("Could not get Bitmap-Info");
return;
}

cClrBits = (WORD)(bmp.bmPlanes * bmp.bmBitsPixel);
if(cClrBits == 1)
cClrBits = 1;
else if(cClrBits <=4)
cClrBits = 4;
else if(cClrBits <=8)
cClrBits = 8;
else if(cClrBits <=16)
cClrBits = 16;
else if(cClrBits <=24)
cClrBits = 24;
else
cClrBits = 32;


if( cClrBits != 24 )
pbmi = (PBITMAPINFO)LocalAlloc(LPTR,sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * (1 << cClrBits));
else
pbmi = (PBITMAPINFO)LocalAlloc(LPTR,sizeof(BITMAPINFOHEADER));

memset(pbmi,0,sizeof(BITMAPINFOHEADER));
pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth = bmp.bmWidth;
pbmi->bmiHeader.biHeight = bmp.bmHeight;
pbmi->bmiHeader.biPlanes = bmp.bmPlanes;
pbmi->bmiHeader.biBitCount = bmp.bmBitsPixel;
if(cClrBits < 24)
pbmi->bmiHeader.biClrUsed = (1 << cClrBits);
pbmi->bmiHeader.biCompression = BI_RGB;
NrBmpBits = ((pbmi->bmiHeader.biWidth * cClrBits +31) & ~31) /8 * pbmi->bmiHeader.biHeight;
pbmi->bmiHeader.biSizeImage = NrBmpBits;
pbmi->bmiHeader.biClrImportant = 0;

pbih = (PBITMAPINFOHEADER) pbmi;
lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED,NrBmpBits);
if( !lpBits )
{
AfxMessageBox("GlobalAlloc in SaveBitmap failed");
return;
}

if( !GetDIBits(dcScaled,bmScaled,0,
(WORD)pbih->biHeight,lpBits,pbmi,DIB_RGB_COLORS))
{
AfxMessageBox("GetDIBits in SaveBitmap failed");
return;
}

HANDLE hf = CreateFile(
"Test.bmp", GENERIC_WRITE, FILE_SHARE_READ, NULL,
CREATE_ALWAYS, NULL, NULL );

if( hf == INVALID_HANDLE_VALUE )
{
AfxMessageBox("CreateFile in SaveBitmap failed");
return;
}

// write out the file header
//
memset( &bfh, 0, sizeof( bfh ) );
bfh.bfType = 'MB';
bfh.bfSize = (DWORD)( sizeof( BITMAPFILEHEADER ) + pbih->biSize +
pbih->biClrUsed * sizeof(RGBQUAD) + pbih->biSizeImage);
bfh.bfReserved1 = 0;
bfh.bfReserved2 = 0;
bfh.bfOffBits = (DWORD)(sizeof( BITMAPFILEHEADER ) + pbih->biSize +
pbih->biClrUsed * sizeof(RGBQUAD));

DWORD dwWritten = 0;
if( !WriteFile( hf, (LPVOID)&bfh, sizeof( BITMAPFILEHEADER ), &dwWritten, NULL ))
{
AfxMessageBox("Write Bitmapfileheader in SaveBitmap failed");
return;
}

// and the bitmap format
//
dwWritten = 0;
if( !WriteFile( hf, (LPVOID)pbih, sizeof( BITMAPINFOHEADER ) + pbih->biClrUsed * sizeof(RGBQUAD), &dwWritten, NULL ))
{
AfxMessageBox("Write Bitmapinfoheader in SaveBitmap failed");
return;
}

// and the bits themselves
//
cb = NrBmpBits;
hp = lpBits;
dwWritten = 0;
if( !WriteFile( hf, (LPSTR)hp, cb, &dwWritten, NULL ))
{
AfxMessageBox("Write Bitmapdata in SaveBitmap failed");
return;
}
CloseHandle( hf );
LocalFree((HLOCAL)pbmi);
GlobalFree((HGLOBAL)lpBits);
DeleteObject(bmScaled);
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: