MFC VC++ アプリケーション Tip集 サイト

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 へ戻る