关于打印的问题!很急!在线等待!!

dxj1113 2003-08-22 09:37:28
我是为一个基于对话框的应用写打印程序,我用下面的程序生成了一个设备上下文,但如何向这个设备上下文添加自定义纸张信息!也就是说不用打印机默认的A4纸打印。用一个自定义长宽的纸张打印,怎么进行?最好有源代码,谢谢!!
CPrintDialog dlg(FALSE);
if (dlg.DoModal() == IDOK)
{
// Create a printer device context (DC) based on the information
// selected from the Print dialog.
HDC hdc = dlg.CreatePrinterDC();
ASSERT(hdc);
}
...全文
39 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jedi 2003-08-27
  • 打赏
  • 举报
回复
mark
louifox 2003-08-22
  • 打赏
  • 举报
回复
//函数功能:更改打印机的默认纸张大小。

//pPrinterName:打印机名称,字符串;

//dmPaperSize:系统定义,可查看msdn获得更多信息。

//如:DMPAPER_A3 表示A3纸张大小;DMPAPER_LETTER 表示Letter, 8 1/2- by 11-inches,等等。。。

BOOL MySetPrinter(LPTSTR pPrinterName, short dmPaperSize)

{

HANDLE hPrinter = NULL;

DWORD dwNeeded = 0;

PRINTER_INFO_2 *pi2 = NULL;

DEVMODE *pDevMode = NULL;

PRINTER_DEFAULTS pd;

BOOL bFlag;

LONG lFlag;



// 打开打印机句柄 (在 Windows NT/2k/xp下,你还得有相应的权限。。。 )



ZeroMemory(&pd, sizeof(pd));

pd.DesiredAccess = PRINTER_ALL_ACCESS;

bFlag = OpenPrinter(pPrinterName, &hPrinter, &pd);

if (!bFlag || (hPrinter == NULL))

return FALSE;



// 判断缓冲区是否作狗;

SetLastError(0);

bFlag = GetPrinter(hPrinter, 2, 0, 0, &dwNeeded);

if ((!bFlag) && (GetLastError() != ERROR_INSUFFICIENT_BUFFER) ||

(dwNeeded == 0))

{

ClosePrinter(hPrinter);

return FALSE;

}





pi2 = (PRINTER_INFO_2 *)GlobalAlloc(GPTR, dwNeeded);

if (pi2 == NULL)

{

ClosePrinter(hPrinter);

return FALSE;

}



// 开始获得打印机相关信息。

bFlag = GetPrinter(hPrinter, 2, (LPBYTE)pi2, dwNeeded, &dwNeeded);

if (!bFlag)

{

GlobalFree(pi2);

ClosePrinter(hPrinter);

return FALSE;

}



if (pi2->pDevMode == NULL)

{

dwNeeded = DocumentProperties(NULL, hPrinter,

pPrinterName,

NULL, NULL, 0);

if (dwNeeded <= 0)

{

GlobalFree(pi2);

ClosePrinter(hPrinter);

return FALSE;

}



pDevMode = (DEVMODE *)GlobalAlloc(GPTR, dwNeeded);

if (pDevMode == NULL)

{

GlobalFree(pi2);

ClosePrinter(hPrinter);

return FALSE;

}



lFlag = DocumentProperties(NULL, hPrinter,

pPrinterName,

pDevMode, NULL,

DM_OUT_BUFFER);

if (lFlag != IDOK || pDevMode == NULL)

{

GlobalFree(pDevMode);

GlobalFree(pi2);

ClosePrinter(hPrinter);

return FALSE;

}



pi2->pDevMode = pDevMode;

}



// 如果打印机不支持修改纸张大小,那就算了。

if (!(pi2->pDevMode->dmFields & DM_ORIENTATION))

{

GlobalFree(pi2);

ClosePrinter(hPrinter);

if (pDevMode)

GlobalFree(pDevMode);

return FALSE;

}



// 更改数据。

pi2->pDevMode->dmFields = DM_PAPERSIZE;

pi2->pDevMode->dmPaperSize = dmPaperSize;



// 不要修改安全属性,否则。。。

pi2->pSecurityDescriptor = NULL;



lFlag = DocumentProperties(NULL, hPrinter,

pPrinterName,

pi2->pDevMode, pi2->pDevMode,

DM_IN_BUFFER | DM_OUT_BUFFER);

if (lFlag != IDOK)

{

GlobalFree(pi2);

ClosePrinter(hPrinter);

if (pDevMode)

GlobalFree(pDevMode);

return FALSE;

}



// 更新打印机信息。

bFlag = SetPrinter(hPrinter, 2, (LPBYTE)pi2, 0);

if (!bFlag)

//如果不成功,可能驱动程序有问题。。。。。

{

GlobalFree(pi2);

ClosePrinter(hPrinter);

if (pDevMode)

GlobalFree(pDevMode);

return FALSE;

}



// 告诉其他应用程序:打印机配置已更改。。。

SendMessageTimeout(HWND_BROADCAST, WM_DEVMODECHANGE, 0L,

(LPARAM)(LPCSTR)pPrinterName,

SMTO_NORMAL, 1000, NULL);



// 释放内存。。。

if (pi2)

GlobalFree(pi2);

if (hPrinter)

ClosePrinter(hPrinter);

if (pDevMode)

GlobalFree(pDevMode);



return TRUE;

}


dxj1113 2003-08-22
  • 打赏
  • 举报
回复
有人说可以用DEVMODE结构,但在基于对话框的工程中怎么使用DEVMODE结构?望请高手回答!分不够可以再加!
dxj1113 2003-08-22
  • 打赏
  • 举报
回复
有人说可以用DEVMODE结构,但在基于对话框的工程中怎么使用DEVMODE结构?望请高手回答!分不够可以再加!
dxj1113 2003-08-22
  • 打赏
  • 举报
回复
有人说可以用DEVMODE结构,但是在基于对话框的工程中怎么用DEVMODE结构?望请高手回答!分不够再加
jink 2003-08-22
  • 打赏
  • 举报
回复
友情UP
HPsoft 2003-08-22
  • 打赏
  • 举报
回复
只能帮顶!
Hermit 2003-08-22
  • 打赏
  • 举报
回复
帮你找找源程序去
AgathaZ 2003-08-22
  • 打赏
  • 举报
回复
帮忙顶一下吧!
顺便问一下,顶有没有分啊!!!
呵呵:)
dxj1113 2003-08-22
  • 打赏
  • 举报
回复
没人回答吗?

16,471

社区成员

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

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

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