Bitmaps drucken



  • Hi,
    ich soll ein Bitmap drucken. Das macht man ja normalerweise mit BitBlt. Vorher sollte man aber mit GetDeviceCaps nachfragen, ob das überhaupt geht. Bei meinem Drucker scheint das nicht zu gehen. Kann mir irgendjemand sagen, ob es Alternativmöglichkeiten gibt????????????????



  • Es geht so, wie normale Ausgabae auf dem Screen, nur das du halt einen DC vom Drucker nimmst. Wenn du eine SDI, oder MDI Anwendung, mit DOC/View hast, ist eigentlich alles schon so, das du die normale OnDraw zum Drucken verwenden kannst.



  • Danke erstmal, aber ich glaube wir haben uns missverstanden.
    was ich meine ist folgendes: GetDeviceCaps(RASTERCAPS) liefert nix zurück wie RC_BITBLT oder so etwas, sondern immer irgendetwas unbekanntes.(RC_NONE????) Ich gehe mal davon aus, dass mein Drucker das BitBlt gar nicht unterstützt und frage mich, ob es Alternativmöglichkeiten gibt.



  • void CPrintRes::Print(HDC hDC)
    {
    	HDC hDC1=GetDC(m_pWnd->m_hWnd);
    	SelectObject(hDC1,::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP1)));
    	if(!BitBlt(hDC,100,-1000,1300,1300,hDC1,0,0,SRCCOPY))
    	{
    		CString str;
    		str.Format("%d",GetLastError());
    		MessageBox(NULL,str,"W",MB_OK);
    	}
    }
    

    Wenn ich das ausprobiere gibt er einen Ausschnitt aus der MSDN aus.

    😮 😮



  • GetDC(m_pWnd->m_hWnd)
    

    Du holst dir einen DC von einem Fenster und willst den als MemoryDC verwenden?

    Wenn dann wohl eher so:

    HDC hDC1=CreateCompatibleDC( hDC );
    

    Warum eigentlich so komische Coordinaten (-1000..)?



  • Mit CreateCompatibleDC habe ich es auch schon probiert. Funktioniert aber nicht.
    Die Koordinaten sind erstmal egal, die werden später noch verfeinert.

    Sollte es denn wirklich so sein, dass es zu diesem miesen Problem keine Lösung gibt? 😕 😕



  • Klar gibt es die sonnst würde niemand drucken können.

    CDC dcPrint;
    CPrintDialog dlgPrint(FALSE,PD_ALLPAGES);
    dlgPrint.GetDefaults();
    dcPrint.Attach(dlgPrint.GetPrinterDC());
    dcPrint.SetMapMode(MM_LOMETRIC);

    IN etwas so.
    Was du brauchst wurde schoon gesagt. Einen PrinterDC!!!



  • Sorry,
    das ich mich so unverständlich ausgedrückt habe, Unix-Tom, aber das was du da schreibst habe ich doch schon längst. Geht trotzdem nicht.:( 😞



  • Was geht genau nicht. Welcche Funktion gibt welchen Fehler zurück.
    Geht nicht gibt es in der Softwareentwicklung nicht.



  • void CPrintRes::Print()
    {
    	CPrintDialog* pDlg = new CPrintDialog(FALSE);
    	pDlg->GetDefaults();
    	CDC* pDC= new CDC;
    	HDC hDC=pDlg->CreatePrinterDC();
    	pDC->Attach(hDC);
    	ASSERT(*pDC);
    	DOCINFO di;
    	::ZeroMemory (&di, sizeof (DOCINFO));
    	di.cbSize = sizeof (DOCINFO);
    	di.lpszDocName = "Rechnung";
    	di.lpszOutput = (LPTSTR) NULL; 
    	di.lpszDatatype = (LPTSTR) NULL; 
    	di.fwType = 0;
    	pDlg->GetDevMode()->dmPaperSize=DMPAPER_A4;
    	pDlg->GetDevMode()->dmOrientation=DMORIENT_PORTRAIT;
    	pDC->ResetDC(pDlg->GetDevMode());
    	pDC->SetMapMode(MM_LOMETRIC);
    	m_pFont=new CFont;
    	m_pFont->CreatePointFont(100,"Arial",pDC);
    	m_pBigFont=new CFont;
    	m_pBigFont->CreatePointFont(150,"Arial",pDC);
    	m_pLittleFont=new CFont;
    	m_pLittleFont->CreatePointFont(80,"Arial",pDC);
    	m_pSans=new CFont;
    	m_pSans->CreatePointFont(280,"Gill Sans MT Shadow",pDC);
    	if (pDC->StartDoc (&di)>0) 
    	{
    		pDC->StartPage();
    		// Initialize the device context
    		pDC->SetMapMode(MM_LOMETRIC);
    		Print(hDC);
    		pDC->EndPage();
    	}
    	pDC->EndDoc();
    	pDC->DeleteDC();
            DeleteDC(hDC);
    	m_pFont->DeleteObject();
    	m_pBigFont->DeleteObject();
    	m_pLittleFont->DeleteObject();
    	m_pSans->DeleteObject();
    	GlobalFree(pDlg->m_pd.hDevMode);
    	GlobalFree(pDlg->m_pd.hDevNames);
    	delete pDlg;
    	pDlg=NULL;
    }
    
    void CPrintRes::Print(HDC hDC)
    {
    	SetMapMode(hDC,MM_LOMETRIC);
    	HDC hDC1=CreateCompatibleDC(hDC);
    	CString str;
    	int dev=GetDeviceCaps(hDC,RASTERCAPS);
    	str.Format("%d",dev);
    	switch(dev)
    	{
    	case RC_BITBLT:
    		MessageBox(NULL,"RC_BITBLT","W",MB_OK);
    		break;
    	case RC_BANDING:
    		MessageBox(NULL,"RC_BANDING","W",MB_OK);
    		break;
    	case RC_SCALING:
    		MessageBox(NULL,"RC_SCALING","W",MB_OK);
    		break;
    	case RC_BITMAP64:
    		MessageBox(NULL,"RC_BITMAP64","W",MB_OK);
    		break;
    	case RC_GDI20_OUTPUT:
    		MessageBox(NULL,"RC_GDI20_OUTPUT","W",MB_OK);
    		break;
    	case RC_GDI20_STATE:
    		MessageBox(NULL,"RC_GDI20_STATE","W",MB_OK);
    		break;
    	case RC_SAVEBITMAP:
    		MessageBox(NULL,"RC_SAVEBITMAP","W",MB_OK);
    		break;
    	case RC_DI_BITMAP:
    		MessageBox(NULL,"RC_DI_BITMAP","W",MB_OK);
    		break;
    	case RC_PALETTE:
    		MessageBox(NULL,"RC_PALETTE","W",MB_OK);
    		break;
    	case RC_DIBTODEV:
    		MessageBox(NULL,"RC_DIBTODEV","W",MB_OK);
    		break;
    	case RC_BIGFONT:
    		MessageBox(NULL,"RC_BIGFONT","W",MB_OK);
    		break;
    	case RC_STRETCHBLT:
    		MessageBox(NULL,"RC_STRETCHBLT","W",MB_OK);
    		break;
    	case RC_FLOODFILL:
    		MessageBox(NULL,"RC_FLOODFILL","W",MB_OK);
    		break;
    	case RC_STRETCHDIB:
    		MessageBox(NULL,"RC_STRETCHDIB","W",MB_OK);
    		break;
    	case RC_OP_DX_OUTPUT:
    		MessageBox(NULL,"RC_OP_DX_OUTPUT","W",MB_OK);
    		break;
    	case RC_DEVBITS:
    		MessageBox(NULL,"RC_DEVBITS","W",MB_OK);
    		break;
    	default:
    		MessageBox(NULL,str,"W",MB_OK);
    	}
    	dev=GetDeviceCaps(hDC,TECHNOLOGY);
    	switch(dev)
    	{
    	case DT_PLOTTER:
    		MessageBox(NULL,"DT_PLOTTER","",MB_OK);
    		break;
    	case DT_RASDISPLAY:
    		MessageBox(NULL,"DT_RASDISPLAY","",MB_OK);
    		break;
    	case DT_RASPRINTER:
    		MessageBox(NULL,"DT_RASPRINTER","",MB_OK);
    		break;
    	case DT_RASCAMERA:
    		MessageBox(NULL,"DT_RASCAMERA","",MB_OK);
    		break;
    	case DT_CHARSTREAM:
    		MessageBox(NULL,"DT_CHARSTREAM","",MB_OK);
    		break;
    	case DT_METAFILE:
    		MessageBox(NULL,"DT_METAFILE","",MB_OK);
    		break;
    	case DT_DISPFILE:
    		MessageBox(NULL,"DT_DISPFILE","",MB_OK);
    		break;
    	default:
    		str.Format("%d",dev);
    		MessageBox(NULL,str,"",MB_OK);
    	}
    
    	SelectObject(hDC1,::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP1)));
    	if(!StretchBlt(hDC,100,-1000,1300,-1300,hDC1,0,0,1200,-1000,SRCCOPY))
    	{
    		str.Format("%d",GetLastError());
    		MessageBox(NULL,str,"W",MB_OK);
    	}
    }
    

    Das ist mein Code. Das Kuddelmuddel mit dem HDC ist entstanden, weil ich mit dem CDC keinen Erfolg hatte. Ich hatte es da genauso gemacht. Das einzige, was passiert ist, ist, das er mir Inhalte vom Screen ausgedruckt hat, also meinen Quellcode oder etwas aus der MSDN. Die erste MessageBox zeigt 28313 an, also nichts vordefiniertes, die zweite zeigt DT_RASPRINTER an, müsste also gehen. In der MSDN steht, das gar nicht alle Druckerdevices das BitBlt unterstützen.
    Daher meine Frage, ob es Alternativmöglichkeiten gibt. 🙂 🙂



  • Die letzte MessageBox geht gar nicht auf, müsste also alles glatt gehen tut es aber nicht.



  • Schau dir das Buch Visual C++ 6 in 21 Tagen an. Da stehtr alles drin.



  • OK, Danke 😃 🙂



  • Edit: Falsches Forum.


Anmelden zum Antworten