有做过在对话框中打印的吗?请帮个忙吧看看这一问题!谢谢

dream_sy 2004-11-22 03:50:24
我在对话框中直接打印,代码如下:
CPrintDialog dlgPrint(FALSE);
if(!dlgPrint.GetDefaults ()) return FALSE;
LPDEVMODE pDM=dlgPrint.GetDevMode ();
if(pDM == NULL) return FALSE;
::GlobalUnlock (pDM);
m_hDC = dlgPrint.CreatePrinterDC();
if(!m_DC.Attach(m_hDC)) return FALSE;

m_DC.SetMapMode(MM_LOMETRIC);
m_DC.m_bPrinting = TRUE;
........
在我的激光打印机上很正常,原点在左上角,向下为负值,但在针式打印机上,原点也在左上角,可是向下却变成了正值,这样就不能在针式打印机上打印了,请问有没有方法设成一样啊?
...全文
87 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
koko1998 2004-11-23
  • 打赏
  • 举报
回复
对话框打印,就是往打印设备上写东西。这是我以前参考的例子,完全可以实现。
不行的话,给我发信 tiger_mhu@hotmail.com
koko1998 2004-11-23
  • 打赏
  • 举报
回复
你在对话框中画图用OnPaint,那么打印就是得到printer的CDC然后,往上打啊
CDC *pDC;

//打印机的初始化设置
CPrintDialog dlg(FALSE,PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS | PD_HIDEPRINTTOFILE | PD_NOSELECTION,this);

CRuixingZJApp* pApp = static_cast<CRuixingZJApp*>( ::AfxGetApp() );
long Len;
WORD nWord = 0;
HANDLE hPrinter;

DEVMODE* pDevMode;
DEVNAMES* lpDevNames;
LPTSTR lpszDeviceName;

///////////////////////////////////////////////////////////////////
if(pApp->GetPrinterDeviceDefaults(&dlg.m_pd) == 0)
{
::AfxMessageBox("错误!当前没有连接打印机!",MB_OK);
return;
}
pDevMode = (DEVMODE*)GlobalLock(dlg.m_pd.hDevMode);
lpDevNames = (LPDEVNAMES)GlobalLock(dlg.m_pd.hDevNames);
lpszDeviceName = (LPTSTR )lpDevNames + lpDevNames->wDeviceOffset;

if (::OpenPrinter((char *) pDevMode->dmDeviceName, &hPrinter, NULL) == FALSE)
return;
Len = DocumentProperties(NULL, NULL, lpszDeviceName, pDevMode, NULL, 0);


pDevMode->dmPaperSize = DMPAPER_A4;
lstrcpy((char *)pDevMode->dmFormName,"A4 210 *297 mm");

Len = DocumentProperties(NULL, hPrinter, lpszDeviceName, NULL, pDevMode, DM_IN_BUFFER);
GlobalUnlock(dlg.m_pd.hDevMode);
GlobalUnlock(dlg.m_pd.hDevNames);

////////////////////////////////////////////////////////////////////////////////
if (dlg.CreatePrinterDC() == NULL)
return ;
if (dlg.DoModal() == IDOK)
{
m_pPrintDC.Attach(dlg.m_pd.hDC);
if(m_pPrintDC.GetSafeHdc() == NULL)
{
::AfxMessageBox("当前没有连接打印机!", MB_OK);
return;
}

pDC = &m_pPrintDC;
ASSERT_VALID( pDC );

DOCINFO di;
di.cbSize = sizeof(DOCINFO);
di.lpszDocName = "微机监测实时数据表格";
di.lpszOutput = NULL;
di.lpszDatatype = NULL;
di.fwType = 0;


//取打印机的横方向和纵方向的分辨率
//即每英寸点数
cxInch = pDC->GetDeviceCaps(LOGPIXELSX);
cyInch = pDC->GetDeviceCaps(LOGPIXELSY);
//取打印纸张高度和宽度
nPageHeight = pDC->GetDeviceCaps(VERTRES);
nPageWidth = pDC->GetDeviceCaps(HORZRES);

m_CharWidth = (long)((float)(nPageWidth*37/40)/(float)80);
m_LineHeight = (long)((float)(nPageHeight*19/20)/(float)80);

//==========================================
CFont font,*oldFont,titleFont;

//设定新字体
m_lf.lfWidth = m_CharWidth;
m_lf.lfHeight = m_LineHeight;
m_lf.lfCharSet = GB2312_CHARSET;
m_lf.lfOutPrecision = 3;
m_lf.lfClipPrecision = 2;
m_lf.lfQuality = PROOF_QUALITY;
m_lf.lfPitchAndFamily = 49;
m_lf.lfEscapement = 0;
m_lf.lfOrientation = 0;
m_lf.lfUnderline = 0;
m_lf.lfPitchAndFamily = DEFAULT_PITCH|FF_ROMAN;
font.CreateFont(m_lf.lfHeight,
m_lf.lfWidth,
m_lf.lfEscapement,
m_lf.lfOrientation,
FW_NORMAL,
FALSE,
m_lf.lfUnderline,
0,
m_lf.lfCharSet,
m_lf.lfOutPrecision,
m_lf.lfClipPrecision,
m_lf.lfQuality,
m_lf.lfPitchAndFamily,
"宋体");
LOGFONT curLogFont, newLogFont;

//取当前字体
font.GetLogFont( &curLogFont );
newLogFont = curLogFont;

//保存旧字体
if (!titleFont.CreateFontIndirect(&newLogFont))
return;
oldFont = pDC->SelectObject(&titleFont);

int Height = 400;
int ye = 1;//第一页

if (pDC->StartDoc(&di) > 0)
{
//打印整页
while (ye < m_ye)
{
pDC->StartPage();
pDC->MoveTo(nPageWidth/20, m_LineHeight);
DrawTable(pDC, Height, ye, 35);
pDC->EndPage();
ye = ye + 1;
}

//没有数据
if ((m_ye == 1)&&(m_other == 0))
{return;}

//打印剩下的数据或不为一页的数据
if (((m_ye == 1)&&(m_other > 0))||(ye == m_ye))
{
pDC->StartPage();
pDC->MoveTo(nPageWidth/20, m_LineHeight);
DrawTable(pDC, Height, ye, m_other);
pDC->EndPage();
}
pDC->EndDoc();
}
pDC->SelectObject(oldFont);
m_pPrintDC.Detach();
}

dream_sy 2004-11-23
  • 打赏
  • 举报
回复
难道没人遇到这方面的问题吗?
老夏Max 2004-11-22
  • 打赏
  • 举报
回复
关注一下吧

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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