[C con Clase] CWnd*: posible?

Steven Davidson steven en conclase.net
Vie Mar 16 20:00:34 CET 2007


Hola José,

El pasado 2007-03-16 17:28:18, Pepe Luiz escribió:

PL> Saludos a todos
PL> Tengo un problema tratando de obtener el CDC para un CWnd*
PL> (Usando VC++ 6.0)
PL> if (printDlg.DoModal() == IDCANCEL)     // Get printer settings from user
PL>         return;
PL>   dc.Attach(printDlg.GetPrinterDC());     // Get and attach a printer DC
PL> 	CWnd* myWnd = dc.GetWindow();    // Aqui el objeto no pasa nada. 000000x00
PL> 	CRect myRect;
PL> 	myWnd->GetClientRect(&myRect); // Por lo tanto no puedo obtener el rect.
PL> El problema de fondo: Estoy escribiendo text y necesito centrar un text.
PL> 	CFont* pOldFont = (CFont*) pDC->SelectObject(&otroFont);
PL> 	pDC->GetTextMetrics(&tm);
PL> 	int strWidth = tm.tmAveCharWidth;
PL> 	// Deberia estar centrado.
PL> 	pDC->TextOut((myRect.Width() / 2) - ((str.GetLength() / 2) * strrWidth),
PL> 				10, str);
PL> Algun metodo diferente de hacerlo?

Me temo que estás aplicando tareas propias de un DC de la pantalla a un DC de la impresora. Algunas tareas son aplicables a ambos DC's, pero otras no. En tu caso, no podemos hablar de "ventanas" cuando estamos tratando una impresora o el DC de una impresora.

La solución es usar 'GetDeviceCaps()' para averiguar las dimensiones de la impresora y cualquier otra información que necesitemos. Por ejemplo,

int nAnchura = pDC->GetDeviceCaps( HORZRES );
int nAltura  = pDC->GetDeviceCaps( VERTRES );

También puedes usar los índices 'PHYSICALOFFSETX' y 'PHYSICALOFFSETY', pero los valores están en unidades del dispositivo, que en el caso de una impresora son "puntos". Por ejemplo, si se establece que hay 600 dpi (puntos por pulgada) sobre un papel de 8,5 x 11 pulgadas, con un margen de 0,25 pulgadas en el eje X y 0,50 pulgadas en el eje Y, entonces 'GetDeviceCaps()' retornaría 150 y 300 puntos respectivamente a los índices mencionados.


Espero que esto te ayude.

Steven


Más información sobre la lista de distribución Cconclase