1
THƯ VI
THƯ VI
Ệ
Ệ
N Đ
N Đ
Ồ
Ồ
HO
HO
Ạ
Ạ
GDI
GDI
(Graphics Device Interface)
(Graphics Device Interface)
L
L
ậ
ậ
p tr
p tr
ì
ì
nh trên môi trư
nh trên môi trư
ờ
ờ
ng Windows
ng Windows
N
N
ộ
ộ
i
i
dung
dung
•
•
Gi
Gi
ớ
ớ
i
i
thi
thi
ệ
ệ
u
u
•
•
C
C
á
á
c
c
kh
kh
á
á
i
i
ni
ni
ệ
ệ
m
m
cơ
cơ
b
b
ả
ả
n
n
•
•
C
C
á
á
c
c
v
v
í
í
d
d
ụ
ụ
v
v
ẽ
ẽ
h
h
ì
ì
nh
nh
đ
đ
ồ
ồ
h
h
ọ
ọ
a
a
•
•
X
X
ử
ử
lý
lý
ả
ả
nh
nh
Bitmap
Bitmap
•
•
In
In
ấ
ấ
n
n
2
In
In
ấ
ấ
n
n
(Printing)
(Printing)
•
•
T
T
ổ
ổ
ng
ng
quan
quan
v
v
ề
ề
in
in
ấ
ấ
n
n
trong
trong
Windows
Windows
•
•
In
In
ấ
ấ
n
n
trong
trong
MFC
MFC
In
In
ấ
ấ
n
n
T
T
ổ
ổ
ng
ng
quan
quan
v
v
ề
ề
in
in
ấ
ấ
n
n
trong
trong
Windows
Windows
•
•
Nguyên t
Nguyên t
ắ
ắ
c cơ b
c cơ b
ả
ả
n v
n v
ề
ề
in
in
ấ
ấ
n
n
•
•
T
T
á
á
c v
c v
ụ
ụ
in
in
•
•
Banding
Banding
•
•
Spooling
Spooling
•
•
Printer DC
Printer DC
•
•
M
M
ộ
ộ
t chương tr
t chương tr
ì
ì
nh in đơn gi
nh in đơn gi
ả
ả
n d
n d
ù
ù
ng API
ng API
3
T
T
ổ
ổ
ng
ng
quan
quan
v
v
ề
ề
in
in
ấ
ấ
n
n
trong
trong
Windows
Windows
Nguyên
Nguyên
t
t
ắ
ắ
c
c
cơ
cơ
b
b
ả
ả
n
n
v
v
ề
ề
in
in
ấ
ấ
n
n
[1]
[1]
X
X
á
á
c đ
c đ
ị
ị
nh ng
nh ng
ữ
ữ
c
c
ả
ả
nh thi
nh thi
ế
ế
t b
t b
ị
ị
c
c
ủ
ủ
a
a
m
m
á
á
y
y
in.
in.
[2]
[2]
G
G
ọ
ọ
i
i
h
h
à
à
m
m
StartDoc
StartDoc
đ
đ
ể
ể
b
b
ắ
ắ
t
t
đ
đ
ầ
ầ
u
u
in
in
m
m
ộ
ộ
t
t
t
t
à
à
i
i
li
li
ệ
ệ
u
u
m
m
ớ
ớ
i
i
[3]
[3]
G
G
ọ
ọ
i
i
h
h
à
à
m
m
StartPage
StartPage
đ
đ
ể
ể
b
b
ắ
ắ
t
t
đ
đ
ầ
ầ
u
u
1
1
trang
trang
in
in
[4]
[4]
G
G
ọ
ọ
i
i
c
c
á
á
c
c
h
h
à
à
m
m
v
v
ẽ
ẽ
c
c
ủ
ủ
a
a
GDI
GDI
đ
đ
ể
ể
th
th
ể
ể
hi
hi
ệ
ệ
n
n
văn
văn
b
b
ả
ả
n
n
(text) hay
(text) hay
h
h
ì
ì
nh
nh
ả
ả
nh
nh
(bitmap, graphics)
(bitmap, graphics)
ra
ra
trang
trang
in
in
[5]
[5]
G
G
ọ
ọ
i
i
h
h
à
à
m
m
EndPage
EndPage
đ
đ
ể
ể
k
k
ế
ế
t
t
th
th
ú
ú
c
c
1
1
trang
trang
in
in
[6]
[6]
G
G
ọ
ọ
i
i
h
h
à
à
m
m
EndDoc
EndDoc
đ
đ
ể
ể
k
k
ế
ế
t
t
th
th
ú
ú
c
c
in
in
t
t
à
à
i
i
li
li
ệ
ệ
u
u
Ghi
Ghi
ch
ch
ú
ú
:
:
Các hàm StartDoc/EndDoc, StartPage/EndPage đềuthuộcthư
việnGDI
Bước [3], [4], [5] có thể làm nhiềulầnnếumuốn in trên nhiều trang
T
T
ổ
ổ
ng
ng
quan
quan
v
v
ề
ề
in
in
ấ
ấ
n
n
trong
trong
Windows
Windows
Nguyên
Nguyên
t
t
ắ
ắ
c
c
cơ
cơ
b
b
ả
ả
n
n
v
v
ề
ề
in
in
ấ
ấ
n
n
4
T
T
ổ
ổ
ng
ng
quan
quan
v
v
ề
ề
in
in
ấ
ấ
n
n
trong
trong
Windows
Windows
T
T
á
á
c
c
v
v
ụ
ụ
in
in
•
•
L
L
à
à
m
m
ộ
ộ
t
t
t
t
à
à
i
i
li
li
ệ
ệ
u
u
c
c
ầ
ầ
n
n
in
in
•
•
C
C
ó
ó
th
th
ể
ể
ch
ch
ứ
ứ
a
a
1 hay
1 hay
nhi
nhi
ề
ề
u
u
trang
trang
in
in
•
•
T
T
á
á
c v
c v
ụ
ụ
in đư
in đư
ợ
ợ
c
c
đ
đ
ị
ị
nh
nh
ngh
ngh
ĩ
ĩ
a
a
b
b
ở
ở
i
i
1
1
c
c
ặ
ặ
p
p
l
l
ệ
ệ
nh
nh
StartDoc/EndDoc
StartDoc/EndDoc
•
•
C
C
ấ
ấ
u
u
tr
tr
ú
ú
c
c
d
d
ữ
ữ
li
li
ệ
ệ
u
u
đư
đư
ợ
ợ
c
c
d
d
ù
ù
ng
ng
cho
cho
t
t
á
á
c v
c v
ụ
ụ
in l
in l
à
à
Enhanced Metafile (EMF)
Enhanced Metafile (EMF)
•
•
EMF:
EMF:
c
c
ấ
ấ
u
u
tr
tr
ú
ú
c
c
d
d
ù
ù
ng
ng
đ
đ
ể
ể
lưu
lưu
tr
tr
ữ
ữ
c
c
á
á
c
c
l
l
ệ
ệ
nh
nh
v
v
ẽ
ẽ
text,
text,
v
v
ẽ
ẽ
đ
đ
ồ
ồ
h
h
ọ
ọ
a
a
,
,
…
…
T
T
ổ
ổ
ng
ng
quan
quan
v
v
ề
ề
in
in
ấ
ấ
n
n
trong
trong
Windows
Windows
Banding
Banding
•
•
GDI
GDI
lưu
lưu
tr
tr
ữ
ữ
c
c
á
á
c
c
l
l
ệ
ệ
nh
nh
v
v
ẽ
ẽ
lên
lên
m
m
á
á
y
y
in
in
trong
trong
m
m
ộ
ộ
t
t
file
file
c
c
ó
ó
d
d
ạ
ạ
ng
ng
~EMF
~EMF
*.TMP
*.TMP
•
•
Khi
Khi
ứ
ứ
ng
ng
d
d
ụ
ụ
ng
ng
k
k
ế
ế
t
t
th
th
ú
ú
c
c
in
in
ấ
ấ
n
n
1
1
trang
trang
(
(
b
b
ằ
ằ
ng
ng
l
l
ệ
ệ
nh
nh
EndPage
EndPage
),
),
tr
tr
ì
ì
nh
nh
đi
đi
ề
ề
u
u
khi
khi
ể
ể
n
n
s
s
ẽ
ẽ
chuy
chuy
ể
ể
n
n
đ
đ
ổ
ổ
i
i
c
c
á
á
c
c
l
l
ệ
ệ
nh
nh
v
v
ẽ
ẽ
trong
trong
metafile
metafile
th
th
à
à
nh
nh
c
c
á
á
c
c
k
k
ế
ế
t
t
xu
xu
ấ
ấ
t
t
th
th
ự
ự
c
c
s
s
ự
ự
trên
trên
m
m
á
á
y
y
in
in
Æ
Æ
c
c
ầ
ầ
n
n
thi
thi
ế
ế
t
t
ph
ph
ả
ả
i
i
t
t
ạ
ạ
o
o
ra
ra
1
1
trang
trang
đ
đ
ồ
ồ
h
h
ọ
ọ
a
a
•
•
K
K
í
í
ch
ch
thư
thư
ớ
ớ
c
c
b
b
ộ
ộ
nh
nh
ớ
ớ
cho
cho
1
1
trang
trang
đ
đ
ồ
ồ
h
h
ọ
ọ
a
a
kh
kh
á
á
l
l
ớ
ớ
n
n
(VD.
(VD.
M
M
á
á
y
y
in 600DPI,
in 600DPI,
gi
gi
ấ
ấ
y
y
letter
letter
c
c
ầ
ầ
n
n
kho
kho
ả
ả
ng
ng
4MB)
4MB)
•
•
Tr
Tr
ì
ì
nh đi
nh đi
ề
ề
u khi
u khi
ể
ể
n m
n m
á
á
y in thư
y in thư
ờ
ờ
ng
ng
s
s
ử
ử
d
d
ụ
ụ
ng
ng
k
k
ỹ
ỹ
thu
thu
ậ
ậ
t
t
“
“
chia
chia
band
band
”
”
:
:
chia
chia
1
1
trang
trang
đ
đ
ồ
ồ
h
h
ọ
ọ
a
a
th
th
à
à
nh
nh
nhi
nhi
ề
ề
u
u
v
v
ù
ù
ng
ng
h
h
ì
ì
nh
nh
ch
ch
ữ
ữ
nh
nh
ậ
ậ
t.GDI
t.GDI
s
s
ẽ
ẽ
l
l
ấ
ấ
y
y
k
k
í
í
ch
ch
thư
thư
ớ
ớ
c
c
band
band
t
t
ừ
ừ
tr
tr
ì
ì
nh đi
nh đi
ề
ề
u khi
u khi
ể
ể
n m
n m
á
á
y in v
y in v
à
à
th
th
ự
ự
c
c
hi
hi
ệ
ệ
n
n
c
c
á
á
c
c
l
l
ệ
ệ
nh
nh
v
v
ẽ
ẽ
trong
trong
metafile
metafile
lên
lên
c
c
á
á
c
c
band
band
c
c
ủ
ủ
a
a
1
1
trang
trang
5
T
T
ổ
ổ
ng
ng
quan
quan
v
v
ề
ề
in
in
ấ
ấ
n
n
trong
trong
Windows
Windows
Spooling
Spooling
•
•
Windows
Windows
qu
qu
ả
ả
n
n
lý
lý
qu
qu
á
á
tr
tr
ì
ì
nh
nh
in
in
ấ
ấ
n
n
b
b
ằ
ằ
ng
ng
tr
tr
ì
ì
nh
nh
qu
qu
ả
ả
n
n
lý
lý
in (Printer Spooler).
in (Printer Spooler).
Printer spooler
Printer spooler
đư
đư
ợ
ợ
c
c
t
t
ự
ự
đ
đ
ộ
ộ
ng
ng
n
n
ạ
ạ
p
p
khi
khi
Windows
Windows
kh
kh
ở
ở
i
i
đ
đ
ộ
ộ
ng
ng
v
v
à
à
k
k
ế
ế
t
t
th
th
ú
ú
c
c
khi
khi
h
h
ệ
ệ
đi
đi
ề
ề
u h
u h
à
à
nh shutdown
nh shutdown
•
•
Printer spooler
Printer spooler
gi
gi
ú
ú
p
p
:
:
–Xácđịnh trình điềukhiểnmáyin; nạpvàobộ nhớ
–Lậplịch cho việcin ấn
–Gởidữ liệu ra máy in qua cổng (parallel, serial)
– Xoá các file TMP sau khi in xong…
•
•
Ngư
Ngư
ờ
ờ
i d
i d
ù
ù
ng c
ng c
ó
ó
th
th
ể
ể
t
t
ắ
ắ
t
t
cơ
cơ
ch
ch
ế
ế
Spooling
Spooling
đ
đ
ố
ố
i
i
v
v
ớ
ớ
i
i
m
m
ộ
ộ
t
t
m
m
á
á
y
y
in (
in (
trong
trong
Printer
Printer
properties/Ports)
properties/Ports)
đ
đ
ể
ể
in
in
nhanh
nhanh
hơn
hơn
,
,
v
v
ì
ì
GDI
GDI
không
không
lưu
lưu
d
d
ữ
ữ
li
li
ệ
ệ
u
u
c
c
ầ
ầ
n
n
in
in
lên
lên
file
file
m
m
à
à
g
g
ở
ở
i
i
tr
tr
ự
ự
c
c
ti
ti
ế
ế
p
p
ra
ra
m
m
á
á
y
y
in
in
ho
ho
ặ
ặ
c
c
d
d
ù
ù
ng
ng
m
m
ộ
ộ
t
t
tr
tr
ì
ì
nh
nh
đi
đi
ề
ề
u
u
khi
khi
ể
ể
n
n
spooling
spooling
kh
kh
á
á
c
c
(VD.
(VD.
M
M
á
á
y
y
in
in
m
m
ạ
ạ
ng
ng
)
)
T
T
ổ
ổ
ng quan v
ng quan v
ề
ề
in
in
ấ
ấ
n trong Windows
n trong Windows
Spooling
Spooling
6
T
T
ổ
ổ
ng quan v
ng quan v
ề
ề
in
in
ấ
ấ
n trong Windows
n trong Windows
Spooling
Spooling
T
T
ổ
ổ
ng
ng
quan
quan
v
v
ề
ề
in
in
ấ
ấ
n
n
trong
trong
Windows
Windows
Printer DC
Printer DC
•
•
Vi
Vi
ệ
ệ
c
c
đ
đ
ầ
ầ
u
u
tiên
tiên
khi
khi
in
in
l
l
à
à
ph
ph
ả
ả
i
i
t
t
ạ
ạ
o
o
ra
ra
ng
ng
ữ
ữ
c
c
ả
ả
nh thi
nh thi
ế
ế
t b
t b
ị
ị
m
m
á
á
y in.
y in.
•
•
S
S
ử
ử
d
d
ụ
ụ
ng
ng
Printer DC
Printer DC
trong
trong
c
c
á
á
c
c
l
l
ệ
ệ
nh
nh
GDI
GDI
gi
gi
ố
ố
ng
ng
như
như
d
d
ù
ù
ng
ng
Window
Window
DC.
DC.
•
•
Ngư
Ngư
ờ
ờ
i d
i d
ù
ù
ng c
ng c
ó
ó
th
th
ể
ể
c
c
à
à
i
i
đ
đ
ặ
ặ
t
t
nhi
nhi
ề
ề
u
u
m
m
á
á
y
y
in,
in,
nhưng
nhưng
ch
ch
ỉ
ỉ
c
c
ó
ó
1
1
m
m
á
á
y
y
in
in
m
m
ặ
ặ
c
c
đ
đ
ị
ị
nh.
nh.
•
•
M
M
ỗ
ỗ
i
i
m
m
á
á
y
y
in
in
đ
đ
ề
ề
u
u
c
c
ó
ó
tr
tr
ì
ì
nh
nh
đi
đi
ề
ề
u
u
khi
khi
ể
ể
n
n
tương
tương
ứ
ứ
ng
ng
•
•
C
C
ầ
ầ
n
n
ph
ph
ả
ả
i
i
x
x
á
á
c
c
đ
đ
ị
ị
nh
nh
tên
tên
c
c
ủ
ủ
a
a
m
m
á
á
y
y
in
in
khi
khi
t
t
ạ
ạ
o
o
Printer DC
Printer DC
•
•
C
C
ó
ó
2
2
c
c
á
á
ch
ch
t
t
ạ
ạ
o
o
Printer DC
Printer DC
–Tạo Printer DC trựctiếp
–Tạo Printer DC bằng cách dùng hộpthoạichuẩn PrintDlg
7
T
T
ổ
ổ
ng quan v
ng quan v
ề
ề
in
in
ấ
ấ
n trong Windows
n trong Windows
T
T
ạ
ạ
o l
o l
ậ
ậ
p Printer DC
p Printer DC
VD1.
VD1.
T
T
ạ
ạ
o
o
Printer DC
Printer DC
tr
tr
ự
ự
c
c
ti
ti
ế
ế
p
p
HDC
HDC
GetPrinterDC
GetPrinterDC
() {
() {
DWORD
DWORD
dwNeeded
dwNeeded
,
,
dwReturned
dwReturned
;
;
HDC
HDC
hdc
hdc
;
;
PRINTER_INFO_4 * pinfo4;
PRINTER_INFO_4 * pinfo4;
PRINTER_INFO_5 * pinfo5;
PRINTER_INFO_5 * pinfo5;
if (
if (
GetVersion
GetVersion
() & 0x80000000) // Windows 98
() & 0x80000000) // Windows 98
{
{
EnumPrinters(PRINTER_ENUM_DEFAULT
EnumPrinters(PRINTER_ENUM_DEFAULT
, NULL, 5, NULL,
, NULL, 5, NULL,
0, &
0, &
dwNeeded
dwNeeded
, &
, &
dwReturned
dwReturned
);
);
pinfo5 =
pinfo5 =
malloc(dwNeeded
malloc(dwNeeded
);
);
EnumPrinters(PRINTER_ENUM_DEFAULT
EnumPrinters(PRINTER_ENUM_DEFAULT
, NULL, 5,
, NULL, 5,
(PBYTE)pinfo5,dwNeeded,&dwNeeded,&dwReturned);
(PBYTE)pinfo5,dwNeeded,&dwNeeded,&dwReturned);
hdc
hdc
=
=
CreateDC(NULL
CreateDC(NULL
, pinfo5
, pinfo5
-
-
>
>
pPrinterName
pPrinterName
,
,
NULL, NULL);
NULL, NULL);
free(pinfo5);
free(pinfo5);
}
}
T
T
ổ
ổ
ng quan v
ng quan v
ề
ề
in
in
ấ
ấ
n trong Windows
n trong Windows
T
T
ạ
ạ
o l
o l
ậ
ậ
p Printer DC
p Printer DC
VD1.
VD1.
T
T
ạ
ạ
o
o
Printer DC
Printer DC
tr
tr
ự
ự
c
c
ti
ti
ế
ế
p
p
…
…
(
(
tt
tt
)
)
else // Windows NT
else // Windows NT
{
{
EnumPrinters(PRINTER_ENUM_LOCAL
EnumPrinters(PRINTER_ENUM_LOCAL
, NULL, 4,
, NULL, 4,
NULL, 0, &
NULL, 0, &
dwNeeded
dwNeeded
, &
, &
dwReturned
dwReturned
);
);
pinfo4 =
pinfo4 =
malloc(dwNeeded
malloc(dwNeeded
);
);
EnumPrinters(PRINTER_ENUM_LOCAL
EnumPrinters(PRINTER_ENUM_LOCAL
, NULL, 4,
, NULL, 4,
(PBYTE)pinfo4,dwNeeded,&dwNeeded,&dwReturned);
(PBYTE)pinfo4,dwNeeded,&dwNeeded,&dwReturned);
hdc
hdc
=
=
CreateDC(NULL
CreateDC(NULL
, pinfo4
, pinfo4
-
-
>
>
pPrinterName
pPrinterName
,
,
NULL, NULL);
NULL, NULL);
free(pinfo4);
free(pinfo4);
}
}
return
return
hdc
hdc
;
;
}
}