Question : Need some help with printing PrintDialogbox

Visual Studio 2003 c++
-----------------------------
Hello, I need some help with printing.
Please take a look at my code.
When I use the first mask and print...until now without an error.
When I use Eigenschaften /properties  and then advanced dialog page "Erweitert" (I did no change) and press then ok below....I got a stop here.
Please help. 500 points.
Please take a look at my complete code....is this okay. Still a beginner in MFC !!!
Best regards,
Thomas

P.S. can I disable the property button on the PrintDialogBox....I don´t need any change there....and my program will not crash???

afxtls.cpp
CThreadData* pData = (CThreadData*)TlsGetValue(m_tlsIndex);
      if (pData == NULL || nSlot >= pData->nCount)
      {
            LeaveCriticalSection(&m_sect);
            return NULL;
      }
      void* pRetVal = pData->pData[nSlot];
      LeaveCriticalSection(&m_sect);
      return pRetVal;  <-------------------------- stop here green arrow

Code Snippet:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
//#########################################################################################
//#########################################################################################
//#########################################################################################
bool CGeschaeftsadressen::GetPrinterDevice(LPTSTR pszPrinterName, HGLOBAL* phDevNames, HGLOBAL* phDevMode)
{// if NULL is passed, then assume we are setting app object's
    // devmode and devnames
    if (phDevMode == NULL || phDevNames == NULL)
	{
		MessageBox("EPSON LQ-680Pro Port 2 Wiegekarte-1error");
        return FALSE;
	}
 
 
    // Open printer
    HANDLE hPrinter;
    if (OpenPrinter(pszPrinterName, &hPrinter, NULL) == FALSE)
	{
		MessageBox("EPSON LQ-680Pro Port 2 Wiegekarte-2error");
        return FALSE;
	}
 
 
    // obtain PRINTER_INFO_2 structure and close printer
    DWORD dwBytesReturned, dwBytesNeeded;
    GetPrinter(hPrinter, 2, NULL, 0, &dwBytesNeeded);
    PRINTER_INFO_2* p2 = (PRINTER_INFO_2*)GlobalAlloc(GPTR,
        dwBytesNeeded);
    if (GetPrinter(hPrinter, 2, (LPBYTE)p2, dwBytesNeeded,&dwBytesReturned) == 0) 
	{
       GlobalFree(p2);
       ClosePrinter(hPrinter);
       MessageBox("EPSON LQ-680Pro Port 2 Wiegekarte-3error");
       return FALSE;
    }
     ClosePrinter(hPrinter);
 
    // Allocate a global handle for DEVMODE
    HGLOBAL  hDevMode = GlobalAlloc(GHND, sizeof(*p2->pDevMode) + p2->pDevMode->dmDriverExtra);
    ASSERT(hDevMode);
    DEVMODE* pDevMode = (DEVMODE*)GlobalLock(hDevMode);
    ASSERT(pDevMode);
 
    // copy DEVMODE data from PRINTER_INFO_2::pDevMode
    memcpy(pDevMode, p2->pDevMode, sizeof(*p2->pDevMode) + p2->pDevMode->dmDriverExtra);
    GlobalUnlock(hDevMode);
 
    // Compute size of DEVNAMES structure from PRINTER_INFO_2's data
    DWORD drvNameLen = lstrlen(p2->pDriverName)+1;  // driver name
    DWORD ptrNameLen = lstrlen(p2->pPrinterName)+1; // printer name
    DWORD porNameLen = lstrlen(p2->pPortName)+1;    // port name
 
    // Allocate a global handle big enough to hold DEVNAMES.
    HGLOBAL hDevNames = GlobalAlloc(GHND, sizeof(DEVNAMES) +(drvNameLen + ptrNameLen + porNameLen)*sizeof(TCHAR));
    ASSERT(hDevNames);
    DEVNAMES* pDevNames = (DEVNAMES*)GlobalLock(hDevNames);
    ASSERT(pDevNames);
 
    // Copy the DEVNAMES information from PRINTER_INFO_2
    // tcOffset = TCHAR Offset into structure
    int tcOffset = sizeof(DEVNAMES)/sizeof(TCHAR);
    ASSERT(sizeof(DEVNAMES) == tcOffset*sizeof(TCHAR));
 
    pDevNames->wDriverOffset = tcOffset;
    memcpy((LPTSTR)pDevNames + tcOffset, p2->pDriverName,drvNameLen*sizeof(TCHAR));
    tcOffset += drvNameLen;
 
    pDevNames->wDeviceOffset = tcOffset;
    memcpy((LPTSTR)pDevNames + tcOffset, p2->pPrinterName,ptrNameLen*sizeof(TCHAR));
    tcOffset += ptrNameLen;
 
    pDevNames->wOutputOffset = tcOffset;
    memcpy((LPTSTR)pDevNames + tcOffset, p2->pPortName,porNameLen*sizeof(TCHAR));
    pDevNames->wDefault = 0;
 
    GlobalUnlock(hDevNames);
    GlobalFree(p2);   // free PRINTER_INFO_2
 
    // set the new hDevMode and hDevNames
    *phDevMode = hDevMode;
    *phDevNames = hDevNames;
    return TRUE;
 
}
//#########################################################################################
//#########################################################################################
//#########################################################################################
HANDLE CGeschaeftsadressen::CopyHandle(HANDLE h)
{
	// Return a handle to a copy of the data
    // that the passed handle was for.
    if (!h) return NULL;
 
    BYTE*   lpCopy;
    BYTE*   lp;
    HANDLE   hCopy;
    DWORD   dwLen = GlobalSize(h);
    if (hCopy = GlobalAlloc(GHND, dwLen))
    {
        lpCopy = (BYTE*)GlobalLock(hCopy);
        lp     = (BYTE*)GlobalLock(h);
 
        CopyMemory(lpCopy,lp,dwLen);
 
        GlobalUnlock(hCopy);
        GlobalUnlock(h);
    }
 
    return hCopy;
}
//#########################################################################################
//#########################################################################################
//#########################################################################################
void CGeschaeftsadressen::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
{
	//Druckbereich in 0,1mm
	pDC->SetMapMode(MM_LOMETRIC);
    //--------------------------------------
	pInfo->SetMaxPage(1);
    //--------------------------------------
 
	//--------------- Neue Schrift erstellen ------------------
	//ASSERT(m_fontUeberschrift==0);
	m_fontUeberschrift= new CFont;
	//ASSERT(m_fontUeberschrift);
    
	m_fontUeberschrift->CreateFont(-80,
		                             0,
	                                 0,
		                             0,
		                             600,
		                             0,
	                           	     0,
		                             0,
		                             DEFAULT_CHARSET,
		                             OUT_CHARACTER_PRECIS,
		                             CLIP_CHARACTER_PRECIS,
		                             DEFAULT_QUALITY,
		                             DEFAULT_PITCH|FF_DONTCARE,
		                             "Arial");
									
    //----------------------------------------------------------
}
//#########################################################################################
//#########################################################################################
//#########################################################################################
void CGeschaeftsadressen::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
	               //Druckbereich in 0,1mm
                	pDC->SetMapMode(MM_LOMETRIC);
					//obwohl dies schon in OnBeginPrinting steht
					//ist es immer eine gute Idee es nochmal zuschreiben
 
				   CString A;
				   CString str;
				   //-------------- Aktuelle Seite -------------------
				   CString Aktuelle_Seite;
				   Aktuelle_Seite.Format("Seite: %d",pInfo->m_nCurPage);
                   //-------------------------------------------------
 
				  // str.Format("%d",Anzahl);
				  
		 	   CFont* pOldFont = pDC->SelectObject(m_fontUeberschrift);
			   pDC->TextOut(100,-100,"Geschäftsadresse");
               pDC->SelectObject(pOldFont);
 
			   pDC->TextOut(1700,-100,Aktuelle_Seite);
				  
				   //--------------------------
				   pDC->MoveTo(100,-230);
				   pDC->LineTo(1900,-230);
                   //--------------------------
 
				   pDC->TextOut(100,-240,"Adress-Nr  :");
				   pDC->TextOut(100,-300,"Firmenname1:");
				   pDC->TextOut(100,-360,"Firmenname2:");
				   pDC->TextOut(100,-420,"Strasse    :");
				   pDC->TextOut(100,-480,"Plz Strasse:");
				   pDC->TextOut(100,-540,"Ort        :");
				   pDC->TextOut(100,-600,"Land       :");
				   pDC->TextOut(100,-660,"E-mail     :");
				   pDC->TextOut(100,-720,"Internet   :");
 
 
 
                 
                   //--------------------------
				//   pDC->MoveTo(100,-280);
				//   pDC->LineTo(1900,-280);
                   //--------------------------
 
//°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
 
                 
				   //------------- Letzte Seite ermitteln ------------
				   UINT nEndPage = pInfo->m_nCurPage;
				   if(nEndPage==pInfo->GetMaxPage())
				   {
					  //pDC->SelectObject(pOldFont);
					   //pDC->TextOut(100,-600,"Letzte Seite");
				   }
                   //-------------------------------------------------
                  
				   //------------- Erste Seite ermitteln ------------
				   UINT nStartPage = pInfo->m_nCurPage;
				   if(nStartPage==pInfo->GetMinPage())
				   {
					   //pDC->SelectObject(pOldFont);
					   //pDC->TextOut(100,-600,"Erste Seite");
				   }
                   //-------------------------------------------------
 
}
 
//#########################################################################################
//#########################################################################################
//#########################################################################################
void CGeschaeftsadressen::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo)
{
	delete m_fontUeberschrift;
	m_fontUeberschrift=NULL;
 
 
}
//#########################################################################################
//#########################################################################################
//#########################################################################################
void CGeschaeftsadressen::OnBnClickedButtonGeschaeftsadressen_Drucken_Kunden_Lieferanten_Einzeln()
{
	
	CPrintDialog dlgPrint(FALSE,PD_PAGENUMS|PD_USEDEVMODECOPIESANDCOLLATE,this);
	
	if(dlgPrint.DoModal()==IDOK)
	{
		CDC dc;
		dc.Attach(dlgPrint.GetPrinterDC());
		dc.m_bPrinting=TRUE;
	
        //-------------------------- DEVMODE ---------------------------------------
         LPDEVMODE dev=dlgPrint.GetDevMode();
         GlobalUnlock(dev);
		 dev->dmOrientation=DMORIENT_PORTRAIT;  //Hochformat
         dev->dmPaperSize=DMPAPER_A4;
     //  dev->dmPaperSize=DMPAPER_A5;
	 //  dev->dmPaperLength=1020;
	 //  dev->dmPaperWidth=1480;
	     dev->dmCopies=dlgPrint.GetCopies();  
	     dev->dmDefaultSource=DMBIN_AUTO;
		 //Wichtig !!!dmFields setzen 
         dev->dmFields |=DM_PAPERLENGTH|DM_PAPERWIDTH|DM_ORIENTATION|DM_DEFAULTSOURCE;
		 dc.ResetDC(dev);
		 dlgPrint.m_pd.Flags &= ~PD_RETURNDC;   // Reset flag set by constructor.
 
 
		  //-------------------------------------------------------------------------
	   	       DOCINFO Print;
               memset( &Print, 0, sizeof(DOCINFO) );
               Print.cbSize = sizeof (DOCINFO);
               Print.lpszDocName = "Drucken im Dialog";
               Print.lpszOutput = (LPTSTR) NULL;
               Print.lpszDatatype = (LPTSTR) NULL;
               Print.fwType = 0;
	          //-----------------------------------
	     BOOL bPrintingOK = dc.StartDoc(&Print);
    	 CPrintInfo pInfo;
	     pInfo.m_rectDraw.SetRect(0,0,dc.GetDeviceCaps(HORZRES), dc.GetDeviceCaps(VERTRES));
                  
         //~~~~~~~~~~~~~~~~~~~~~~~~~ 
	     OnBeginPrinting(&dc,&pInfo);  // call prepare
         //~~~~~~~~~~~~~~~~~~~~~~~~~
		   //==============================================================================
	       for(UINT page=pInfo.GetMinPage();page<=pInfo.GetMaxPage() &&bPrintingOK ; page++)
           {
             //begin a new page
		     dc.StartPage();
             pInfo.m_nCurPage=page;
             //~~~~~~~~~~~~~~~~~~~~~~~~~ 
	         OnPrint(&dc,&pInfo); // call Print your Page
             //~~~~~~~~~~~~~~~~~~~~~~~~~ 
	         bPrintingOK=(dc.EndPage()>0);
	       }
           //==============================================================================
		    //~~~~~~~~~~~~~~~~~~~~~~~~~ 
            OnEndPrinting(&dc,&pInfo); // call your clean up
            //~~~~~~~~~~~~~~~~~~~~~~~~~
 		    if(bPrintingOK)
		    {
              dc.EndDoc();
		    }
		     else
		    {
		     dc.AbortDoc();
		    }
                      
		    dc.DeleteDC();
	}

Answer : Need some help with printing PrintDialogbox

ok, you don't need to declare it in the header. Either you put the whole function in a place before 'void CGeschaeftsadressen::OnBnClickedButtonGeschaeftsadressen_Drucken_Kunden_Lieferanten_Einzeln()' or you put it anywhere but declare it before 'void CGeschaeftsadressen::OnBnClickedButtonGeschaeftsadressen_Drucken_Kunden_Lieferanten_Einzeln()' in the .cpp file with
> UINT APIENTRY PrintHookProc(HWND hdlg, UINT uiMsg, WPARAM wParam,LPARAM lParam);

IMO this error message
> 'UINT (__stdcall CGeschaeftsadressen::* )(HWND,UINT,WPARAM,LPARAM)' kann nicht in 'LPPRINTHOOKPROC'
indicates that the 'PrintHookProc' is anywhere declared within the class 'CGeschaeftsadressen'.

ZOPPO
Random Solutions  
 
programming4us programming4us