HÀM IN ẤN TRONG LẬP TRÌNH C TRÊN WINDOWS
Trên Windows, các ứng dụng không truy xuất trực tiếp máy in mà sẽ dùng các hàm GDI để vẽ ra device context của máy in. Do đó việc in ấn trên Windows trở nên đơn giản, tương tự việc vẽ ra các hộp thoại trên màn hình.
Với cơ chế này, người lập trình không cần quan tâm đến việc máy in đang sử dụng là máy in hiệu gì, loại nào… Các Windows printer device driver sẽ đảm nhận việc chuyển dữ liệu cần in sang dạng phù hợp với máy in hiện hành.
Tiến trình in ấn trên Windows bao gồm các bước sau:
- Lấy về device context của máy in cần in.
- Gởi yêu cầu bắt đầu việc in ấn (STARTDOC).
- Kết xuất dữ liệu ra máy in(có thể sang trang _ NEWFRAME nếu cần).
- Gởi yêu cầu kết thúc việc in ấn(ENDDOC).
- Giải phóng device context máy in.
Lấy về handle device context máy in
Sử dụng file win.ini
Dựa vào thông tin về máy in mặc định trong file win.ini. File win.ini lưu thông tin về máy in trong section [windows], entry DEVICE.
Ví dụ : một đoạn của file win.ini chứa thông tin về máy in mặc định.
[windows]
device = EpsonFX1050, Epson9, LPT1
Đó là các thông tin về tên máy in, driver, và cổng giao tiếp với máy tính.
Một số hàm chuẩn để đọc ghi file win.ini của Windows :
DWORD GetProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpDefault, LPTSTR lpReturnedString,DWORD nSize);
BOOL WriteProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpString);
Ví dụ : In dòng chữ ra máy in mặc định.
void PrintStrWinInit(char *msg)
{
char prnInfo[200];
GetProfileString("windows", "device", "NoPrinter", prnInfo, 200);
If ( strcmp(prnInfo, "NoPrinter") )
{
char prnName[100], prnDriver[100], prnPort[100];
char seps[10];
char *token;
strcpy(seps,",");
token = strtok(prnInfo, seps);
strcpy(prnName, token);
token=strtok(NULL, seps);
strcpy(prnDriver, token);
token=strtok(NULL, seps);
strcpy(prnPort, token);
HDC prnDC;
prnDC=CreateDC(prnDriver, prnName, prnPort, NULL);
if(prnDC)
{
StartDoc(prnDC, NULL);
StartPage(prnDC);
TextOut(prnDC, 100, 100, "Your message here:", 18);
TextOut(prnDC, 100, 200, msg, strlen(msg));
TextOut(prnDC, 100, 300, "End of printing", 15);
EndPage(prnDC);
EndDoc(prnDC);
DeleteDC(prnDC);
}
}
}
Sử dụng hộp thoại Print
Một cách khác đơn giản hơn để lấy về handle device context của một máy in bất kỳ thay vì máy in mặc định là sử dụng hộp thoại in chuẩn của Windows.
Hộp thoại in chuẩn được kích hoạt bằng hàm PrintDlg (hàm này được định nghĩa trong module COMMDLG.DLL), hộp thoại này cho phép người dùng thiết lập các thông số in ấn.
Kết quả trả về của hàm PrintDlg là một handle device context của máy in đã chọn.
Ví dụ : In dòng chữ ra máy in được chọn từ hộp thoại in chuẩn.
void PrintStrPrintDlg(char *msg)
{
PRINTDLG pd;
ZeroMemory(&pd, sizeof(PRINTDLG));
pd.lStructSize = sizeof(PRINTDLG);
pd.hwndOwner = GetFocus();
pd.Flags = PD_RETURNDC|PD_NOSELECTION;
if(PrintDlg(&pd))
{
StartDoc(pd.hDC, NULL);
StartPage(pd.hDC);
TextOut(pd.hDC, 100, 100, "Your message here:", 18);
TextOut(pd.hDC, 100, 200, msg, strlen(msg));
TextOut(pd.hDC, 100, 300, "End of printing", 15);
EndPage(pd.hDC);
EndDoc(pd.hDC);
DeleteDC(pd.hDC);
}
}
Các hàm điều khiển in ấn
Hàm | Ý nghĩa |
int StartDoc(hDC, lpDocInfo) | Bắt đầu tác vụ in ấn 1 tài liệu trong file có tên lpDocInfo, hDC là handle printer device context. |
int EndDoc(hDC) | Kết thúc tác vụ in ấn. |
int AbortDoc(hDC) | Hủy tác vụ in hiện hành. |
int StartPage(hDC) | Bắt đầu trang mới. |
int EndPage(hDC) | Kết thúc 1 trang. |
int SetAbortDoc( hDC, MyAProc ) | Chỉ định hàm (MyAProc) xử lý trường hợp người dùng muốn ngắt ngang tác vụ in. |
Xử lý lỗi khi in
Trong quá trình in bằng việc sử dụng các hàm điều khiển in ấn, nếu các thao tác thành công thì luôn trả về giá trị lớn hơn 0.
Nếu có lỗi, dùng hàm DWORD GetLastError(VOID) để lấy về mã lỗi (chỉ WinNT và Win2000 mới hỗ trợ hàm này).
0 Comment:
Đăng nhận xét
Thank you for your comments!