51CTO技术论坛_中国领先的IT技术社区's Archiver

dada00001 发表于 2007-8-17 11:28

VC下打印机的使用

VC 5.0是开发Windows 95下应用程序的强大工具。本文将通过一
$w-F8wM)JRe1K4m 9G*M%YKqR+T'BI
个具体实例讨论用VC打印文字和图形的一些技术。在Windows 95下, p o e3Nt
z{1n!t {?
显示器和打印机、绘图仪都被视为输出设备。系统默认的输出设备是
u6`p |3WP!xvE ;U4XK ])t
显示器。要使用打印机,首先需要创建一个指向打印机的设备环境句柄, j-cK7`U!P4P3g9I4W
:mu-U*B^P{
然后通过该句柄调用相关的绘图函数把所需的文字和图形输出至打印
K5~3f,gB a I
-l m2]j ]-c}2ca 机上。当打印结束后,删除这个设备环境句柄即可。
(xI2Q4M"a;f
1T L-J [5V%sb8}$Y 一、技术细节 ;[f4_xl1TUB

(z`iW+h 当我们在Windows95下安装好打印机后,总是需要设置一个为默认 GXUoQ2s1@

k y7@1DN$Gc8s 打印机,在Windows95的启动配置文件WIN.INI中[window]段中列出了 $v |'U.EH_;G

9M&r&FBRN"l)r+a 带有关键字device的默认打印机。如果在文件WIN.INI中有如下几行:
JT@8E.XV ?3_\ 6xQlW%O1M"I8o
 
Sl.B0y;i$D;Ux%w
D$e*@#B)xi [windows] Pp r sh;l5y B

J ?)T Qf-WhD!Y [其他程序行]
N\v!o,D4M.p5K 9pQHQX ^0R
device=EPSON LQ-1600K,EPSON24,LPT1: 9X&B"\&dV m L*a

-x-h:X7CsDIQE5a)h 在device后的字符串中就包含了系统中默认的打印机的三个重要 bs IS~W [u
%Aa R e!?7y)[
属性.它们依次是打印机的设备名是LQ-1600K,驱动程序名是EPSON24, N&Iue:M;~

-u9?T(Xg 输出端口为LPT1。在程序中我们可调用API函数GetProfileString从 ]2EDC5?0I7T/\

a:B r;p c+a WIN.INI文件中获得这个设备字符串。再将这个设备字符串进行分解,
B4oEB-\g+X7t}8HN ZB*Q1yI6U"Ry4_-L
获得这三个属性,作为参数用API函数CreateDC调用。如果调用成功,
.u^;Uf&?lSg:dHV_ jv+oaf:f;^0g
则为默认打印机创建一个设备环境句柄,否则返回一个空值(NULL)。 #P Pqfq+hLBK]

P~5_3x nt,eQF$y c CreateDC函数的原形如下: hW3{(r1@

k#y#h `6qC0B(w HDC CreateDC( S!O D6JbGc
\ o6bg*d? f,_
LPCTSTR lpszDriver, e6SZuP GNhc

XT8^ hEjMm LPCTSTR lpszDevice,
3Ht\+g"F7]
^8`F#w,I|6Z_#I LPCTSTR lpszOutput,
)?O0q?&wKD 3NO&NM)V)iPL
CONST DEVMODE *lpinitData
Gg!u mV3_Uum 2hF K#Zi$_1Jb)n
); g#H8q3z([eI-kp

^3\,v\W't S 二、程序代码及说明
~g%t/p0?X }4ul
1S E'``1t#|)J 新建一个名为Test的工程,窗体类型为对话框(Dialog based) (JY:yo6d;U

/s-@HhvO7A X 模式。在窗体中加入一个按钮(Button),设置这个Button的属性:
S-ot1T.@` k:ZL1s#s 6^8s%Y1@o
ID=IDC_PRINT,CAPTION="打印"。在类向导中找到该Button ;\:Y5fA.}U0\s!Xt0T

B%q!d!At 的单击事件对应的消息BN_CLICKED,增加其成员函数OnPrint。
*Q O*|/udyQO
u m6E w? R%D3h [UN x 在TestDlg.cpp文件中找到OnPrint函数并作如下改动。 p$uql k p1gi-A"M&jP
?N!@ Y'[z.W
void CTestDlg::OnPrint()
"Z%o8])ye0O2[3V.T s D5O(P'a
{
_8P7CWV c+yA;rqs Ph!U
// 增加如下代码 %du9]7@9n
4y1yq(H~#v!CA8XLX[ i
char szprinter[80];
~-}'Z SwjMr
+O~A+k1Hi char *szDevice,*szDriver,*szOutput; Hw9Y:^k:i

)^&j0Kb.t!I HDC hdcprint; // 定义一个设备环境句柄
|!IXJ P{X
Ts td3mTL?  
:H#hsi(t,U:D.m~
V-J3N(~&h&G //定义一个打印作业
]4o/qL6JGJ2d7I I 3[`2c]5[;O
Static DOCINFO di={sizeof(DOCINFO),"printer",NULL}; G ^7_ L1yi*tZ

(r Q{PC8Q$o0t   V0g/n;M2z4dL4uF
X.[ VP4Am!HX3E{&^
// 得到设备字符串存入数组szprinter中 fwYw"_c U`
@`BM2~ia x
GetProfileString("windows","device",",,,",szprinter,80);
;M4TXx|;Um
AkVihi // 将设备字符串分解
T iIX(N)u uw&eQ&s'n'i
if(NULL!=(szDevice=strtok(szprinter,","))&&
#kYk2h:[^!H
|Ux_0n NULL!=(szDriver=strtok(NULL,","))&& e'p9m$O7xc

h:zHf1b5Y-I,K d1J k NULL!=(szOutput=strtok(NULL,",")))
s#m HrY.W'cc0J
Ta3}(E l2Q // 创建一个打印机设备句柄 3p:gD?H.YP7M.U
1S6j%e1CevZP5R
if((hdcprint=CreateDC(szDriver,szDevice,szOutput,NULL))!=0)
nm1l8Xp(s,U5X 5S Q(vyXs/B
{
Tg]y,WU
JufD5r| ln$LE if(StartDoc(hdcprint,&di)>0) //开始执行一个打印作业
T!YxZx:v;W ^| K/x/G F,R!|j;F!s
{
cz%M1F0Y!na.K |6Sa
0S:Q0Q|4`` StartPage(hdcprint); //打印机走纸,开始打印
)I};r @&x-@
-YCT]`5Iv I N!v SaveDC(hdcprint); //保存打印机设备句柄 tI d/e6N"`9b A
T^U7h1{Jc*d
// 输出一行文字
!IO#N?4{ L]'~5d1R,ND)m c
TextOut(hdcprint,1,1,"这是一个例子",12);
8[s0@'V$M}&V Ol
3j*P$WZ @(c'i` // 输出一条直线 %o4N[m#j5h0d,y
0fuj+_ Yc
MoveToEx(hdcprint,20,20,NULL); ?kL@^[3}"p$X/c
Q u1s:n'b M/Qk2Y;k
LineTo(hdcprint,120,120);
p6O] J` !b`SuA)l)sI1K3V
RestoreDC(hdcprint,-1); //恢复打印机设备句柄 W|&k!z'[
.o*Csy n{vB
EndPage(hdcprint); //打印机停纸,停止打印
qAQ0I4{W;u \N'xxl%vcWbD
EndDoc(hdcprint); //结束一个打印作业 l4H8RD(y%w d9?
5K`hca@~up9F+E
MessageBox("打印完毕!","提示",MB_ICONINFORMATION);
E1KT`P*p1^3n2\
O|F9p7f_ }
$|:S'Si2~D7F*bY
|^7L k0V // 用API函数DeleteDC销毁一个打印机设备句柄
:_A hcvS.W$n *Q*O l+Q-Csb*q
DeleteDC(hdcprint);
ET \XR4IL;\]'^
u'_!u1I,vEB~-W } G [Cr3l;Nd b
5pU'Ne,I},oRC
else
+F$bpVs }Z1Gm
jH1s y%gt { 5Tg2Q3o-o r

\2CG6Q%`x MessageBox("没有默认打印机,或者没有安装打印机!");
.eXuE!@xa 7_]xmj m+A
return;
q6?VCv4b"h%A
~bV$_wE }
T'nLj |+q X8| @f^ `$Nm6W
}

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.