MFC:
CDC pDC;
CPrintDialog dlg(FALSE);//TRUE);//
int pwd,pht,wid,hit,top,lft;
CFont cft,*cfs;
TEXTMETRIC tmt;
if(dlg.DoModal()==IDOK)
{
HDC hd=dlg.GetPrinterDC();
LOGFONT logFont;
DOCINFO p;
AfxGetApp()->DoWaitCursor(1);
pDC.Attach(hd);
pDC.m_bPrinting=TRUE;
pwd=pDC.GetDeviceCaps(HORZRES);
pht=pDC.GetDeviceCaps(VERTRES);
memset(&p,0x00,sizeof(DOCINFO));
p.cbSize=sizeof(DOCINFO);
p.lpszDocName=NULL;
p.lpszOutput=NULL;
pDC.StartDoc(&p);
pDC.StartPage();
memset(&logFont,0,sizeof(LOGFONT));
logFont.lfCharSet=DEFAULT_CHARSET;
logFont.lfHeight=pht/(54+18+1);
logFont.lfWidth=pwd/(51+1)/2;
lstrcpyn(logFont.lfFaceName, "MS ゴシック", sizeof(logFont.lfFaceName));
cft.CreateFontIndirect(&logFont);
cfs=pDC.SelectObject(&cft);
pDC.GetTextMetrics(&tmt);
hit=tmt.tmHeight+tmt.tmExternalLeading;
top=hit/6;
hit+=top*2;
wid=tmt.tmAveCharWidth*2;
lft=wid*4;
pDC.TextOut(wid*4+lft,hit*2+top,"印刷テスト",10);
pDC.SelectObject(cfs);
pDC.EndPage();
pDC.EndDoc();
// pDC.AbortDoc();
AfxGetApp()->DoWaitCursor(0);
}
ページを指定できるようにするには、デフォルトのパラメータでは駄目なので以下のようにします。
CPrintDialog dlg(FALSE,// | PD_NOPAGENUMS
PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_HIDEPRINTTOFILE
| PD_NOSELECTION);
また、指定できるページ範囲を指定する必要があります。
dlg.m_pd.nMinPage=1;
dlg.m_pd.nMaxPage=10;
複数ページの印刷に関してはヘルプ(MSDN)の「複数ページの文書の印刷」(検索)が参考になります。
SDK:
PRINTDLG prd;
// PAGESETUPDLG prd;
char buf[256];
int pwd,pht,wid,hit,top,lft;
HFONT cft,cfs;
TEXTMETRIC tmt;
memset(&prd,0x00,sizeof(prd));
prd.lStructSize=sizeof(prd);
prd.hwndOwner=m_hWnd;
if(PrintDlg(&prd))
// if(PageSetupDlg(&prd))
{
DEVNAMES *pdn=(DEVNAMES *)GlobalLock(prd.hDevNames);
DEVMODE *pdm=(DEVMODE *)GlobalLock(prd.hDevMode);
HDC hdc;
DEVMODE dmd;
int i;
DOCINFO p;
LOGFONT logFont;
lstrcpyn(buf,(char *)pdm->dmDeviceName,strlen((char *)pdm->dmDeviceName)+1);
hdc=CreateDC("WINSPOOL",&((char *)pdn)[pdn->wDeviceOffset],NULL,pdm);
memset(&dmd,0x00,sizeof(dmd));
dmd.dmSize=sizeof(dmd);
i=GetObject(hdc,0,NULL);
i=GetObject(hdc,sizeof(dmd),&dmd);
p.cbSize=sizeof(DOCINFO);
p.lpszDocName=NULL;
p.lpszOutput=NULL;
StartDoc(hdc,&p);
StartPage(hdc);
pwd=GetDeviceCaps(hdc,HORZRES);
pht=GetDeviceCaps(hdc,VERTRES);
memset(&logFont, 0, sizeof(LOGFONT));
logFont.lfCharSet = DEFAULT_CHARSET;
logFont.lfHeight = pht/(54+18+1);
logFont.lfWidth = pwd/(51+1)/2;
lstrcpyn(logFont.lfFaceName, "MS ゴシック", sizeof(logFont.lfFaceName));
cft=CreateFontIndirect(&logFont);
cfs=(HFONT)SelectObject(hdc,cft);
GetTextMetrics(hdc,&tmt);
hit=tmt.tmHeight+tmt.tmExternalLeading;
top=hit/6;
hit+=top*2;
wid=tmt.tmAveCharWidth*2;
lft=wid*4;
TextOut(hdc,wid*4+lft,hit*2+top,"印刷テスト",10);
SelectObject(hdc,cfs);
DeleteObject(cft);
EndPage(hdc);
EndDoc(hdc);
// AbortDoc(hdc);
DeleteDC(hdc);
GlobalUnlock(prd.hDevMode);
GlobalUnlock(prd.hDevNames);
}