打印小问题 请帮助

duxin 2011-01-13 11:14:39
函数本意是将一个已经画好的 CDC* SDC 进行打印,因VC经验欠缺 调试许久未成功,希望得到各位帮住。

////////////////////////////////////////////////////////////////////////

CDC* pDC;
CPrintDialog dlg(FALSE);
if (dlg.DoModal() == IDOK)
{

HDC hDC = dlg.GetPrinterDC();
if (hDC == NULL)
{
return;
}

pDC = CDC::FromHandle(hDC);
if (pDC == NULL)
{
return;
}
}
CDC memDC;


CRect rectClient;
GetClientRect(rectClient) ;


CBitmap* oldBitmap,memBitmap;
memDC.CreateCompatibleDC(SDC) ;//->SDC 是已经画好的一个CDC 波形 跟踪发现memDC为空
memBitmap.CreateCompatibleBitmap(SDC, rectClient.Width(), rectClient.Height()) ;

pDC->SetMapMode( MM_ANISOTROPIC );
CSize size = CSize( 6000, 5000 );
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);


memDC.DPtoLP(rectClient);

oldBitmap = (CBitmap *)memDC.SelectObject(&memBitmap) ;

if (memDC.GetSafeHdc() != NULL)
{

pDC->BitBlt(0, 0, rectClient.Width(), rectClient.Height(),
&memDC, 0, 0, SRCCOPY) ;
}
memDC.SelectObject(oldBitmap) ;
memBitmap.DeleteObject();
memDC.DeleteDC();
...全文
126 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
RedProgramer 2011-01-13
  • 打赏
  • 举报
回复
给你一个小例子,你看看,我怀疑你没有进行endpage和enddoc等操作,造成打印机不打印
//该结构用于存储各列的信息
typedef struct tagColAtt
{
int nColIndex;
CString strColText;
int nPrintX;
int nSubItemIndex;
}COLATT;

BOOL PrintListCtrl(CListCtrl &list)
{

PRINTDLG pd;
pd.lStructSize = sizeof(PRINTDLG);
pd.Flags = PD_RETURNDC;
pd.hDC = NULL;
pd.hwndOwner = NULL;
pd.hInstance = NULL;
pd.nMaxPage = 1;
pd.nMinPage = 1;
pd.nFromPage = 1;
pd.nToPage = 1;
pd.nCopies = 1;
pd.hDevMode = NULL;
pd.hDevNames = NULL;

//显示打印对话框,由用户来设定纸张大小等。
if(!PrintDlg(&pd)) return FALSE;
ASSERT(pd.hDC!=NULL);

int nHorRes = GetDeviceCaps(pd.hDC, HORZRES);
int nVerRes = GetDeviceCaps(pd.hDC, VERTRES);
int nXMargin = 2;
int nYMargin = 2;
TEXTMETRIC tm;
GetTextMetrics(pd.hDC, &tm);
int nCharHeight = tm.tmHeight;
int nCharWidth = tm.tmAveCharWidth;


CHeaderCtrl* pHeader = list.GetHeaderCtrl();
//获得行,列的个数
int nColCount = pHeader->GetItemCount();
int nLineCount = list.GetItemCount();

int ColOrderArray[100];
COLATT ca[100];
list.GetColumnOrderArray(ColOrderArray, nColCount);
int nColX =nXMargin*nCharWidth;

//检索各列的信息,确定列标题的内容长度。
for(int i =0 ; i< nColCount; i++)
{
ca[i].nColIndex = ColOrderArray[i];
LVCOLUMN lvc;
char text[100];
lvc.mask = LVCF_TEXT|LVCF_SUBITEM;
lvc.pszText = text;
lvc.cchTextMax = 100;
list.GetColumn(ca[i].nColIndex, &lvc);
ca[i].strColText = lvc.pszText;
ca[i].nSubItemIndex = lvc.iSubItem;
ca[i].nPrintX = nColX;
nColX += nCharWidth * strlen(ca[i].strColText);

if(nColX > nHorRes)
{
DeleteDC(pd.hDC);
AfxMessageBox("字段太多,无法在一行内打印,请试用较大的纸,或横向打印。");
return FALSE;
}


}

DOCINFO di;
di.cbSize = sizeof(DOCINFO);
di.lpszDocName = "ListCtrl Data Printing";
di.lpszOutput = (LPTSTR) NULL;
di.lpszDatatype = (LPTSTR) NULL;
di.fwType = 0;
StartDoc(pd.hDC, &di);
StartPage(pd.hDC);

//调整各列的宽度,以使各列在后面的打印输出时更均匀的打印在纸上。
int space = (nHorRes-nXMargin*nCharWidth-nColX) / (nColCount -1);
for(i =1; i<nColCount; i++)
{
ca[i].nPrintX += i*space;
}

//输出列标题
for(i =0; i<nColCount; i++)
TextOut(pd.hDC, ca[i].nPrintX, nYMargin,
ca[i].strColText, strlen(ca[i].strColText));

int nMaxLinePerPage = nVerRes/nCharHeight -3;
int nCurPage =1;
//输出各列的数据
for(i =0; i<nLineCount; i++)
{
for(int j =0; j<nColCount; j++)
{
if(i+1-(nCurPage-1)*nMaxLinePerPage > nMaxLinePerPage)
{
//新的一页
EndPage(pd.hDC);
StartPage(pd.hDC);
nCurPage ++;
}
CString subitem = list.GetItemText(i, ca[j].nSubItemIndex);
TextOut(pd.hDC, ca[j].nPrintX,
nYMargin+(i+1-(nCurPage-1)*nMaxLinePerPage)*nCharHeight,
subitem, strlen(subitem));
}
}

EndPage(pd.hDC);
EndDoc(pd.hDC);
//打印结束
DeleteDC(pd.hDC);
return TRUE;
}
向立天 2011-01-13
  • 打赏
  • 举报
回复
打印DC和屏幕DC的单位是不一样的
要重新在打印dc上把要打印的东西再画一遍
RedProgramer 2011-01-13
  • 打赏
  • 举报
回复
CSize size = CSize( 10240, 7680 );
(&printDC)->SetWindowExt(size);

int xLogPixPerInch = (&printDC)->GetDeviceCaps(LOGPIXELSX);
int yLogPixPerInch = (&printDC)->GetDeviceCaps(LOGPIXELSY);
long xExt = (long)size.cx * xLogPixPerInch/96;
long yExt = (long)size.cy * yLogPixPerInch/96;
(&printDC)->SetViewportExt((int)xExt,(int)yExt);
我感觉是这里的问题,所以打印面积不对
Eleven 2011-01-13
  • 打赏
  • 举报
回复
使用 MFC 编写打印程序

希望对你有帮助
duxin 2011-01-13
  • 打赏
  • 举报
回复
感谢向立天 终于还是自己摸索出来了。
现在只有一个小问题了 打印出来的 面积 只有A4的十分之一大小
参数都调过了 不知道是哪里问题 请各位抽空帮助
现代吗:
CDC printDC;
CPrintDialog printDlg(FALSE);
DOCINFO docInfo;

HDC hDC;

if(printDlg.DoModal()==IDOK)
{
hDC=printDlg.GetPrinterDC();
if(!printDC.Attach(hDC))
return;
}
else
{
printDC.Detach();
return;
}

memset(&docInfo,0,sizeof(docInfo));
docInfo.cbSize=sizeof(DOCINFO);
docInfo.lpszDocName="Print Window";
if(printDC.StartDoc(&docInfo) <=0)
{
printDC.Detach();
return;
}

printDC.SetMapMode(MM_TEXT);

CSize size = CSize( 10240, 7680 );
(&printDC)->SetWindowExt(size);

int xLogPixPerInch = (&printDC)->GetDeviceCaps(LOGPIXELSX);
int yLogPixPerInch = (&printDC)->GetDeviceCaps(LOGPIXELSY);
long xExt = (long)size.cx * xLogPixPerInch/96;
long yExt = (long)size.cy * yLogPixPerInch/96;
(&printDC)->SetViewportExt((int)xExt,(int)yExt);
CRect client;
printDC.GetClipBox(client);
if(client.IsRectEmpty())
return;
client.InflateRect(1, 1);
CRect rect = client;
CDC memDC;

DrawBackground(&printDC);
DrawCurve(&printDC);
DisplayYB(&printDC);
memDC.Attach(printDC);
CBitmap bm;
CDC *cdc = CDC::FromHandle(hDC);
memDC.CreateCompatibleDC(cdc);
bm.CreateCompatibleBitmap(&memDC,10240 ,7680);
memDC.SelectObject(&bm);


printDC.StartPage();

printDC.StretchBlt(0,0,(int)xExt,(int)yExt,&memDC,0,0,10240, 7680,SRCCOPY);
printDC.EndPage();


printDC.EndDoc();
printDC.Detach();

bm.Detach();
ReleaseDC(&memDC);
ReleaseDC(&printDC);
向立天 2011-01-13
  • 打赏
  • 举报
回复
duxin 2011-01-13
  • 打赏
  • 举报
回复
感谢楼上的朋友

现在的工程呢 是在一个函数里(Drawurve())将一个pDC 画好了
我想直接打印这个 pDC 可不可以

现在代码:
CDC printDC;
CPrintDialog printDlg(FALSE);
DOCINFO docInfo;

HDC hDC;

if(printDlg.DoModal()==IDOK)
{
hDC=printDlg.GetPrinterDC();
if(!printDC.Attach(hDC))
return;
}
else
{
printDC.Detach();
return;
}

memset(&docInfo,0,sizeof(docInfo));
docInfo.cbSize=sizeof(DOCINFO);
docInfo.lpszDocName="Print Window";
if(printDC.StartDoc(&docInfo) <=0)
{
printDC.Detach();
return;
}

printDC.SetMapMode(MM_TEXT);

CSize size = CSize( 6000, 5000 );
(&printDC)->SetWindowExt(size);

int xLogPixPerInch = (&printDC)->GetDeviceCaps(LOGPIXELSX);
int yLogPixPerInch = (&printDC)->GetDeviceCaps(LOGPIXELSY);
long xExt = (long)size.cx * xLogPixPerInch/96;
long yExt = (long)size.cy * yLogPixPerInch/96;
(&printDC)->SetViewportExt((int)xExt,(int)yExt);
CDC memDC;

memDC.Attach(*SDC); ————》SDC是已经画好的 一个DC
CBitmap bm;
CDC *cdc = CDC::FromHandle(hDC);
memDC.CreateCompatibleDC(cdc);
bm.CreateCompatibleBitmap(&memDC, 6000, 5000);
memDC.SelectObject(&bm);




printDC.StartPage();


printDC.StretchBlt(0,0,(int)xExt,(int)yExt,&memDC,0,0,6000,5000,SRCCOPY);
printDC.EndPage();


printDC.EndDoc();
printDC.Detach();

bm.Detach();
ReleaseDC(&memDC);
ReleaseDC(&printDC);
现在的结果是 打印一张白纸 ,请各位帮忙

16,548

社区成员

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

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

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