임프랍니다.. 어제는 비가왔습니다만.. 오늘도 팁은 나갑니다~
(물론 비온거랑 팁이 나가는건 여전히 아무런 관계가 없슴다...)
참.. 오늘의 팁이 나가기 전에.. ^^
저 하고 있던 프로젝트.. 오늘로 베타 발표하고 이제 며칠 푹 쉰답니다..
모두들 축하해주세요~ (거기 멀뚱히 보고만 있는분~! 뉘기여뉘기여~~)
오늘의 팁은, 프린터에 설정되어있는 용지의 종류 알아내기와 거꾸로 설정하기입니다.
그럼, 먼저 용지 종류를 알아내는 함수...
// C++ 코드
int __fastcall GetPaperSize(void)
{
char Device[256], Driver[256], Port[256];
THandle hDMode;
TDevMode *ADevMode;
Printer()->GetPrinter(Device, Driver, Port, hDMode);
ADevMode = (TDevMode *)GlobalLock((void *)hDMode);
GlobalUnlock((void *)hDMode);
return ADevMode->dmPaperSize;
}
// 델파이 코드
function GetPaperSize: integer;
var
ADevMode: PDevMode;
hDMode: THandle;
Device, Driver, Port: array[0..255] of Char;
begin
Printer.GetPrinter(Device, Driver, Port, hDMode);
ADevMode := GlobalLock(hDMode);
GlobalUnlock(hDMode);
result := ADevMode.dmPaperSize;
end;
여기서 리턴되는 값들은 wingdi.h 에 선언되어 있는 매크로 값들입니다.
예를 들어 레터 용지는 DMPAPER_LETTER, A4용지는 DMPAPER_A4, 이런 식이죠.
자세히 알아보시려면 wingdi.h 를 참고하시기 바랍니다. 무신 용지 종류가
요로콤 많나, 하고 놀라실겁니다. (대충 봐도 60~70가지는 됩니다.)
반대로 이 값으로 프린터의 용지를 세팅하는 함수...
// C++ 코드
void __fastcall SetPaperSize(int pSize)
{
char Device[256], Driver[256], Port[256];
THandle hDMode;
TDevMode *ADevMode;
Printer()->GetPrinter(Device, Driver, Port, hDMode);
ADevMode = (TDevMode *)GlobalLock((void *)hDMode);
ADevMode->dmPaperSize = pSize;
GlobalUnlock((void *)hDMode);
Printer()->SetPrinter(Device, Driver, Port, hDMode);
}
// 델파이 코드
procedure SetPaperSize(pSize: Integer);
var
ADevMode: PDevMode;
hDMode: THandle;
Device, Driver, Port: array[0..255] of Char;
begin
Printer.GetPrinter(Device, Driver, Port, hDMode);
ADevMode := GlobalLock(hDMode); //80Column = 258; 136Column = 259;
ADevMode.dmPaperSize := pSize;
GlobalUnlock(hDMode);
Printer.SetPrinter(Device, Driver, Port, hDMode);
end;
대충 보면.. 위의 값을 알아내는 함수랑 내용이 비슷하죠?
이 함수들에서 주인공이라고 할 수 있는 TPrinter::GetPrinter(),
TPrinter::SetPrinter(), 그리고 TDevMode(이것은 api의 DEVMODE 구조체를 typedef
한것에 불과합니다) 는 이렇게 용지 세팅에 관계된 것 외에도 많은 정보를
가지고 있습니다. TPrinter::PaperWidth와 TPrinter::PaperHeight로도 알아낼 수
있는 용지의 폭과 길이, 그리고 프린터 드라이버의 버전, 드라이버 이름,
디더링 타입 등등, 프린터 드라이버가 가지고 있는 대부분의 정보가 이 두개의
함수와 구조체로 알아낼 수 있습니다.
관심이 있으신 분들은 한번 자세히 알아보시구요.
그럼, 도움되시길 바라면서, 이만..
독립문에서 임펠리테리였습니다.