关于VC!打印——帮帮一个爱问打印的小女孩不吧

ChouZi 2000-05-25 01:25:00
关于图形打印,为何我在打印预览中可以看到要打印的图形而
实际却打印不出来呢?
...全文
329 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ChouZi 2000-06-01
  • 打赏
  • 举报
回复
但恐怕没有机会了。这是我“技术生涯”的最后的一个项目了!
不过不论如何,我也要谢谢你的!
yb 2000-05-31
  • 打赏
  • 举报
回复
呵呵!看来女孩子要惹人喜欢得多啊,同志们多尽心尽力呀!
这个问题我不会,我从没有需要打印的应用设计,有的话我也让别人去做了。不过如
果你有其他问题的话,也许我可以帮得上忙,因为我是一个“大”哥了,所以多少还
帮得上“小”妹吧!
ChouZi 2000-05-30
  • 打赏
  • 举报
回复
我已经用了这个函数了, pDC->SetMapMode(MM_LOENGLISH);
但是还是不可以。不只为什么呢?
我将代码给你帮我 看一看。
OOL CLIView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
dlg.ShowWindow(SW_HIDE);
m_iSum=dlg.m_listDlg.GetItemCount();
pInfo->SetMaxPage((m_iSum+LinesPerPage-1)/LinesPerPage+1);
return DoPreparePrinting(pInfo);

}

void CLIView::OnBeginPrinting(CDC* pDC, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
if (m_pMemDC->GetSafeHdc()) m_pMemDC->DeleteDC();
CClientDC dc(this);
m_pMemDC->CreateCompatibleDC(&dc);



if (m_pBm->GetSafeHandle()) m_pBm->DeleteObject();
m_pBm->CreateCompatibleBitmap(&dc,m_rect.Width(),m_rect.Height());
m_pMemDC->SelectObject(m_pBm);
dlg.ShowWindow(SW_HIDE);
m_pMemDC->BitBlt(0,0,m_rect.Width(),m_rect.Height(),&dc,m_rect.left,m_rect.top,SRCCOPY);


}

void CLIView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
dlg.ShowWindow(SW_SHOW);
}

void CLIView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
// TODO: add customized printing code here
PrintPageHeader(pDC,pInfo);

int nStart,nEnd,nHeight;
CPoint point(0,m_iUpPage);
CFont font;
TEXTMETRIC tm;

nStart = (pInfo->m_nCurPage -1)*LinesPerPage;
nEnd = nStart + LinesPerPage;
font.CreateFont(18,9,0,0,FW_REGULAR,FALSE,FALSE,0,
ANSI_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH and FF_MODERN,
NULL);//"Arial");
CFont* pOldFont = (CFont*)(pDC->SelectObject(&font));
pDC->GetTextMetrics(&tm);
nHeight = tm.tmHeight + tm.tmExternalLeading;
for (int iCurLine=nStart ;iCurLine<nEnd ;iCurLine++)
{
if (iCurLine>=m_iSum)
break;
point.x=0;
for (int iColumn=0;iColumn<2;iColumn++)
{
char str[100];
dlg.m_listDlg.GetItemText(iCurLine,iColumn,str,sizeof(str));
pDC->TextOut(point.x,point.y,str);
int width;
width=(dlg.m_listDlg.GetColumnWidth(iColumn))*2;
point.x+=width;
}
point.y -= nHeight;

// if ((iCurLine%9)==0)
{
pDC->MoveTo(0,point.y+tm.tmExternalLeading/2);
pDC->LineTo(pInfo->m_rectDraw.right,point.y+tm.tmExternalLeading/2);
}
}
pDC->SelectObject(pOldFont);


if (pInfo->m_nCurPage==(m_iSum+LinesPerPage-1)/LinesPerPage+1)
{
pDC->StretchBlt(0,0,pInfo->m_rectDraw.Width(),pInfo->m_rectDraw.Height(),
m_pMemDC,0,0,m_rect.Width(),m_rect.Height(),SRCCOPY);
}

PrintPageFooter(pDC,pInfo);

}
void CLIView::PrintPageHeader(CDC *pDC, CPrintInfo *pInfo)
{
CFont font;
font.CreateFont(24,12,0,0,FW_REGULAR,FALSE,FALSE,0,
ANSI_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH and FF_MODERN,
NULL);//"Arial");
CFont* pOldFont = (CFont*)(pDC->SelectObject(&font));
TEXTMETRIC textMetric;
pDC->GetTextMetrics(&textMetric);
CPoint point(pInfo->m_rectDraw.Width()/2,-10);
pDC->TextOut(point.x,point.y,"温度值记录");
pDC->SelectObject(pOldFont);
m_iUpPage = -10 -10 - textMetric.tmHeight; // line 1/10th inch below text
pDC->MoveTo(0, m_iUpPage); // from left margin
pDC->LineTo(pInfo->m_rectDraw.right,m_iUpPage);

font.DeleteObject();
font.CreateFont(20,10,0,0,FW_REGULAR,FALSE,FALSE,0,
ANSI_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH and FF_MODERN,
NULL);//"Arial");
pOldFont = (CFont*)(pDC->SelectObject(&font));
pDC->GetTextMetrics(&textMetric);
char*str[2];
str[0]="时间显示";
str[1]="温度值";

int x=0;
for (int iColumn=0;iColumn<3;iColumn++)
{
pDC->TextOut(x,m_iUpPage-10,str[iColumn]);
int width;
width=(dlg.m_listDlg.GetColumnWidth(iColumn))*2;
x+=width;
}
pDC->SelectObject(pOldFont);
m_iUpPage=m_iUpPage-10 -textMetric.tmHeight -10;

}


void CLIView::PrintPageFooter(CDC *pDC, CPrintInfo *pInfo)
{
CString str;
str.Format("第 %d 页",pInfo->m_nCurPage);
TEXTMETRIC textMetric;
pDC->GetTextMetrics(&textMetric);
CPoint point((pInfo->m_rectDraw.Width()-
textMetric.tmAveCharWidth*str.GetLength())-10,
pInfo->m_rectDraw.bottom+textMetric.tmHeight+10);
m_iDownPage=point.y;
pDC->TextOut(point.x,point.y,str);

}
void CLIView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
{
// TODO: Add your specialized code here and/or call the base class
pDC->SetMapMode(MM_LOENGLISH);

// pDC->SetMapMode(MM_HIENGLISH ); //转换坐标映射方式
CSize size = CSize(800, 560);
pDC->SetWindowExt(size); //确定窗口大小

//得到实际设备每逻辑英寸的象素数量
int xLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSX);
int yLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSY);
long xExt = (long)size.cx * xLogPixPerInch/96 ;
long yExt = (long)size.cy * yLogPixPerInch/96 ;
pDC->SetViewportExt((int)xExt, (int)yExt);


// CFormView::OnPrepareDC(pDC, pInfo);
}
江王 2000-05-30
  • 打赏
  • 举报
回复
Windows有七种坐标映模式,
其中MM_TEXT方式就是常说的物理坐标,和设备相关,对应于物理设备的最小分辨单位,如显示器的像素点距,打印机的打印点距,因此,此种坐标不好的地方在于它在不同的设备上显示或打印出的大小很可能是不一致的。
为了解决大小一致的问题,Windows提供了公制或英制坐标,如MM_HIENGLISH( 以0.001英寸作为最小单位),MM_HIMETRIC(以0.01毫米作为最小单位),MM_TWIPS(最小单位为1/1440英寸),MM_LOENGLISH(最小单位为0.01英寸),MM_LOMETRIC(最小单位为0.1毫米),以上述的几种逻辑坐标,在显示器上显示的大小与在打印机上打印出来的就能保持一致。
坐标映射的意思是将物理坐标与逻辑坐标之间的转换关系,MM_TEXT是最简单的一种转换关系,它与物理坐标是完全相同的。而其它几种映射方式则复杂些,但对于使用者来说,使用起来是一样地简单。
在Windows进行GDI(图形)操作,都是在逻辑坐标下进行的,也就是说,同一条GDI语句(比如Rectangle(1,1,10,10)),在不同的逻辑坐标下,其结果是不一样的。只是如果你没有设置逻辑坐标的话,系统使用缺省的坐标映射方式MM_TEXT。
映射模式的设置主要是通过SetMapMode函数进行的。
ChouZi 2000-05-30
  • 打赏
  • 举报
回复
现在打印是可以执行了,可是不知怎么将屏幕上的很多象素点都给打印出来了。本来界面上的,打印出来的除了点就是叉。坐标映射模式,是指什么,请指教!
江王 2000-05-29
  • 打赏
  • 举报
回复
可能不是打不出来,而是打印机的分辨率太高了(一般也在200dpi以上,而显示器的分辨率只在96左右),以至于在打印机上显示的图像很小。
建议:打印和预览时应该分别设置不同的坐标映射模式。
cz 2000-05-29
  • 打赏
  • 举报
回复
可能是显示模式(SetMapMode)设置不一致的问题。要不同Windows的显示模式协同工作,非常繁,还容易出错。所以建议你把所有的显示模式设置成:MM_TEXT试试。
yueyue 2000-05-28
  • 打赏
  • 举报
回复
打印是全世界最难的问题

你的打印机支持图象打印吗?

最好出示源程序
loutingyv 2000-05-26
  • 打赏
  • 举报
回复
我认为 你用bitblt()或Strentbit()来显示,在屏幕上和预揽时没有问题,
打印时不正常.
gamepolice 2000-05-25
  • 打赏
  • 举报
回复
你可以在OnPaint中显示这个位图,它可以打印出来。
crliu 2000-05-25
  • 打赏
  • 举报
回复
you have make a command to printer that BeginPrint..in your .cpp?
zdg 2000-05-25
  • 打赏
  • 举报
回复
说详细点....
是打印View中的内容吗?
ChouZi 2000-05-25
  • 打赏
  • 举报
回复
"小"是对vc的认识,指对vc是初学者!
idiot 2000-05-25
  • 打赏
  • 举报
回复
你 多大 ?

16,466

社区成员

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

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

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