2,641
社区成员
发帖
与我相关
我的任务
分享
void CInvoiceDlg::OnPrintButton()
{
// TODO: Add your control notification handler code here
CDC dc;
CPrintDialog printDlg(FALSE);
short printQuality;
printDlg.GetDefaults ();
DEVMODE *dm = printDlg.GetDevMode();
dm->dmOrientation = DMORIENT_PORTRAIT;
//dm->dmOrientation = DMORIENT_LANDSCAPE;
dm->dmFields |= DM_ORIENTATION;
printQuality=dm->dmPrintQuality;
//dm->dmPaperSize=DMPAPER_B4;
//将打印纸大小设为自定义
dm->dmPaperSize=0;//根据MSDN所述,此值在需要自定义长宽时置'0'
//定义打印纸的长宽
dm->dmPaperWidth=236;//此处设置的宽度在实际打印中看到的宽度只有200mm左右
dm->dmPaperLength=100;
//dm->dmFields |= DM_PAPERSIZE|DM_PAPERLENGTH|DM_PAPERWIDTH;/此语句打开,或往前调两行至dmPaperWidth前,打出输出无内容..
//LPTSTR w = _T("");
//DWORD tN= DeviceCapabilities(printDlg.GetDeviceName(),printDlg.GetPortName(),DC_MAXEXTENT,w,dm);//无实际用处
dc.Attach(printDlg.CreatePrinterDC());
dc.ResetDC(dm);
dc.m_bPrinting=TRUE;
CString strTitle;
strTitle.LoadString (AFX_IDS_APP_TITLE);
DOCINFO di; // DOCINFO中有相关的打印信息
::ZeroMemory (&di, sizeof (DOCINFO));
di.cbSize = sizeof (DOCINFO);
di.lpszDocName = strTitle;//设置标题
if(dc.StartDoc(&di)==-1)// 开始打印
{
MessageBox("StartDoc error");
return ;
}
int horze=dc.GetDeviceCaps (HORZRES);
int vertical=dc.GetDeviceCaps (VERTRES);
{
{
//加入修改信息的语句
dc.StartPage();
rato=float(printQuality)/25.4;
m_bitmapRect.bottom =m_bitmapRect.top+int(Orient.Size .y *rato);
Draw(&dc,&m_bitmapRect,1);
dc.EndPage();
}
}
dc.EndDoc();
}
dm->dmFields|=DM_ORIENTATION;//红色运算符是按位或啊。。相同语句:dm->dmFields=dm->dmFields|DM_ORIENTATION;
dmFields(引用msdn上的原话是以下那样,我理解的是:置位需要初始化的DEVMODE成员关联位)
Specifies whether certain members of the DEVMODE structure have been initialized. If a member is initialized, its corresponding bit is set, otherwise the bit is clear. A driver supports only those DEVMODE members that are appropriate for the printer or display technology.