(全部分数求解答)大牛们,VC/MFC 对话框打印 自定义宽度失效

noBle_Ora 2015-04-08 02:22:40
代码第22行设置的宽度,在实际打印出来的纸上 失效,最右边接近40mm的内容没有打出来!!!!
此时已是深夜2点过了!求大牛们解答!!!
上代码:
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();
}
...全文
582 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
noBle_Ora 2015-04-08
  • 打赏
  • 举报
回复
1 设置 dmFields=DM_PAPERSIZE|DM_PAPERLENGTH|DM_PAPERWIDTH 后 dmFields的值是 15,但是仍然打不出东西(打印机没反应)。 2 用 '| ' 设置 dmFields |= DM_PAPERSIZE|DM_PAPERLENGTH|DM_PAPERWIDTH 后 dmFields的值是随着打印变化的(原值也是变化的),但是仍然打不出东西(打印机没反应)。
引用 5 楼 noBle_Ora 的回复:
[quote=引用 4 楼 worldy 的回复:] dm->dmFields|=DM_ORIENTATION;//红色运算符是按位或啊。。相同语句:dm->dmFields=dm->dmFields|DM_ORIENTATION; 我是问你或之前dm->dmFields的值是多少,为什么要或运算?
1 设置 dmFields=DM_PAPERSIZE|DM_PAPERLENGTH|DM_PAPERWIDTH 后 dmFields的值是 15,但是仍然打不出东西(打印机没反应)。 2 用 '| ' 设置 dmFields |= DM_PAPERSIZE|DM_PAPERLENGTH|DM_PAPERWIDTH 后 dmFields的值是随着打印变化的(原值也是变化的),但是仍然打不出东西(打印机没反应)。
向立天 2015-04-08
  • 打赏
  • 举报
回复
noBle_Ora 2015-04-08
  • 打赏
  • 举报
回复
引用 4 楼 worldy 的回复:
dm->dmFields|=DM_ORIENTATION;//红色运算符是按位或啊。。相同语句:dm->dmFields=dm->dmFields|DM_ORIENTATION; 我是问你或之前dm->dmFields的值是多少,为什么要或运算?
1.dm->dmFields的值随外接打印机不同而变化(不是定值) 2.或运算是置位需要初始化的DEVMODE成员关联位
worldy 2015-04-08
  • 打赏
  • 举报
回复
dm->dmFields|=DM_ORIENTATION;//红色运算符是按位或啊。。相同语句:dm->dmFields=dm->dmFields|DM_ORIENTATION; 我是问你或之前dm->dmFields的值是多少,为什么要或运算?
noBle_Ora 2015-04-08
  • 打赏
  • 举报
回复
引用 1 楼 worldy 的回复:
dm->dmFields |= DM_ORIENTATION; 必须加入下面两个标志 DM_PAPERLENGTH DM_PAPERWIDTH 还有,红色那个运算做什么?原值是什么?
我在原贴中已经提到过, 加入dm->dmFields |= DM_PAPERSIZE|DM_PAPERLENGTH|DM_PAPERWIDTH; 打印输入无内容
noBle_Ora 2015-04-08
  • 打赏
  • 举报
回复
引用 1 楼 worldy 的回复:
dm->dmFields |= DM_ORIENTATION; 必须加入下面两个标志 DM_PAPERLENGTH DM_PAPERWIDTH 还有,红色那个运算做什么?原值是什么?
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.
worldy 2015-04-08
  • 打赏
  • 举报
回复
dm->dmFields |= DM_ORIENTATION; 必须加入下面两个标志 DM_PAPERLENGTH DM_PAPERWIDTH 还有,红色那个运算做什么?原值是什么?
noBle_Ora 2015-04-08
  • 打赏
  • 举报
回复
自已顶一下!!!!
noBle_Ora 2015-04-08
  • 打赏
  • 举报
回复
没人麽....不要沉啊,不要沉啊!!!

2,641

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧