关于打印、打印预览(来者有分!)

xujie839997 2004-03-31 09:18:17
基于文档视图的打印,请给个这方面的例子。包括分页、打印页眉页脚,设置字体及大小。现在我对坐标和映射方式还不明白,请高手指教啊。
...全文
45 点赞 收藏 14
写回复
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xujie839997 2004-04-01
逻辑坐标和设备坐标的转换问题?继续,怎么转换的
回复
jimlei76 2004-04-01
我的打印程序也是写得很糟糕!不过还算能打出东西。自己很不满意,也希望提高啊
回复
pcyy 2004-04-01



















回复
NOMADBLUE 2004-04-01
还是《深入浅出MFC》吧
回复
Mr-Chen 2004-04-01
主要是逻辑坐标和设备坐标的转换问题
回复
远志999 2004-04-01
回复
自由的风 2004-04-01
回复人: nuaawenlin(飘人) ( ) 说得很对
回复
xujie839997 2004-04-01
继续继续啊
回复
远志999 2004-04-01
看看深入浅出上面讲的吧,在到网上搜索一线资料,^_^

up
回复
xujie839997 2004-04-01
给点例子吧,大侠!
回复
showjancn 2004-04-01
基于文档视图的打印,MFC已做好了框架,你只需控制面面的大小进行纸张更换就行
回复
jsphuang 2004-03-31
代码乱了一点,这个是WINDOWS程序设计上的。这个例子功能就是能打印EDIT框中的内容,
hwndEdit参数即为EDIT的句柄。
回复
jsphuang 2004-03-31
一个用API完成的ROUTINE,思路简单。
BOOL PopPrntPrintFile (HINSTANCE hInst, HWND hwnd, HWND hwndEdit,
PTSTR szTitleName)
{
static DOCINFO di = { sizeof (DOCINFO) } ;
static PRINTDLG pd ;
BOOL bSuccess ;
int yChar, iCharsPerLine, iLinesPerPage, iTotalLines,
iTotalPages, iPage, iLine, iLineNum ;
PTSTR pstrBuffer ;
TCHAR szJobName [64 + MAX_PATH] ;
TEXTMETRIC tm ;

WORD iColCopy, iNoiColCopy ;

// Invoke Print common dialog box

pd.lStructSize = sizeof (PRINTDLG) ;

pd.hwndOwner = hwnd ;

pd.hDevMode = NULL ;

pd.hDevNames = NULL ;

pd.hDC = NULL ;

pd.Flags = PD_ALLPAGES | PD_COLLATE |

PD_RETURNDC | PD_NOSELECTION ;

pd.nFromPage = 0 ;

pd.nToPage = 0 ;

pd.nMinPage = 0 ;

pd.nMaxPage = 0 ;

pd.nCopies = 1 ;

pd.hInstance = NULL ;

pd.lCustData = 0L ;

pd.lpfnPrintHook = NULL ;

pd.lpfnSetupHook = NULL ;

pd.lpPrintTemplateName = NULL ;

pd.lpSetupTemplateName = NULL ;

pd.hPrintTemplate = NULL ;

pd.hSetupTemplate = NULL ;



if (!PrintDlg (&pd))

return TRUE ;



if (0 == (iTotalLines = SendMessage (hwndEdit, EM_GETLINECOUNT, 0, 0)))

return TRUE ;


// Calculate necessary metrics for file



GetTextMetrics (pd.hDC, &tm) ;

yChar = tm.tmHeight + tm.tmExternalLeading ;



iCharsPerLine = GetDeviceCaps (pd.hDC, HORZRES) / tm.tmAveCharWidth ;

iLinesPerPage = GetDeviceCaps (pd.hDC, VERTRES) / yChar ;

iTotalPages = (iTotalLines + iLinesPerPage - 1) / iLinesPerPage ;


// Allocate a buffer for each line of text



pstrBuffer = malloc (sizeof (TCHAR) * (iCharsPerLine + 1)) ;


// Display the printing dialog box



EnableWindow (hwnd, FALSE) ;

bSuccess = TRUE ;

bUserAbort = FALSE ;

SetDlgItemText (hDlgPrint, IDC_FILENAME, szTitleName) ;

// Start the document

GetWindowText (hwnd, szJobName, sizeof (szJobName)) ;

di.lpszDocName = szJobName ;

if (StartDoc (pd.hDC, &di) > 0)

{

// Collation requires this loop and iNoiColCopy

for (iColCopy = 0 ;

iColCopy < ((WORD) pd.Flags & PD_COLLATE ? pd.nCopies : 1) ;

iColCopy++)

{

for (iPage = 0 ; iPage < iTotalPages ; iPage++)

{

for (iNoiColCopy = 0 ;

iNoiColCopy < (pd.Flags & PD_COLLATE ? 1 : pd.nCopies);

iNoiColCopy++)

{

// Start the page

if (StartPage (pd.hDC) < 0)

{

bSuccess = FALSE ;

break ;

}


// For each page, print the lines

for (iLine = 0 ; iLine < iLinesPerPage ; iLine++)

{

iLineNum = iLinesPerPage * iPage + iLine ;

if (iLineNum > iTotalLines)

break ;

*(int *) pstrBuffer = iCharsPerLine ;

TextOut (pd.hDC, 0, yChar * iLine, pstrBuffer,

(int) SendMessage (hwndEdit, EM_GETLINE,

(WPARAM) iLineNum, (LPARAM) pstrBuffer));

}



if (EndPage (pd.hDC) < 0)

{

bSuccess = FALSE ;

break ;

}



if (bUserAbort)

break ;

}



if (!bSuccess || bUserAbort)

break ;

}



if (!bSuccess || bUserAbort)

break ;

}

}

else

bSuccess = FALSE ;

if (bSuccess)

EndDoc (pd.hDC) ;



if (!bUserAbort)

{

EnableWindow (hwnd, TRUE) ;

DestroyWindow (hDlgPrint) ;

}



free (pstrBuffer) ;

DeleteDC (pd.hDC) ;



return bSuccess && !bUserAbort ;

}
回复
nuaawenlin 2004-03-31
呵呵

看看深入浅出MFC

里面讲的很详细
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告
暂无公告