Article ID: 138266
Article Last Modified on 11/21/2006
/* Compile options needed: none */In the MFC Container sample, step 2 implements a container that does not consider the difference in resolution between the screen device and the printer device. If, for instance, Scribble, step 7 is embedded in Container and PRINT or PRINT PREVIEW is selected, the embedded object will appear too small.
void CContainerView::OnDraw(CDC* pDC)
{
CContainerDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// draw the OLE items from the list
POSITION pos = pDoc->GetStartPosition();
while (pos != NULL)
{
// draw the item
CContainerItem* pItem = (CContainerItem*)pDoc->GetNextItem(pos);
// copy the client items rect, which will be scaled
CRect rect2(pItem->m_rect);
if(pDC->IsPrinting())
{
// get the printer's pixel resolution
int ixp=pDC->GetDeviceCaps(LOGPIXELSX);
int iyp=pDC->GetDeviceCaps(LOGPIXELSY);
// get the current window's resolution
CDC* pddc = GetDC();
int ixd=pddc->GetDeviceCaps(LOGPIXELSX);
int iyd=pddc->GetDeviceCaps(LOGPIXELSY);
// scale rect2 up by the ratio of the resolutions
int width = MulDiv(rect2.Width(),ixp, ixd);
int height = MulDiv(rect2.Height(), iyp, iyd);
rect2.left = MulDiv(rect2.left, ixp, ixd);
rect2.top = MulDiv(rect2.top, ixp, ixd);
rect2.right = rect2.left + width;
rect2.bottom = rect2.top + height;
}
pItem->Draw(pDC, rect2);
if(!pDC->IsPrinting())
{
// draw the tracker over the item
CRectTracker tracker;
SetupTracker(pItem, &tracker);
tracker.Draw(pDC);
}
}
}
Keywords: kbcontainer kbgdi kbhowto kbprint KB138266