2章.ダイアログ 2−2.ダイアログにて印刷機能を使う |
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); } |
Top へ戻る |