이 섹션에서는 네이티브 Windows 데스크톱 프로그램에서 인쇄하는 방법을 설명합니다.
개요
네이티브 Windows 프로그램에서 인쇄할 때 최상의 사용자 환경을 제공하려면 전용 스레드에서 인쇄하도록 프로그램을 설계해야 합니다. 네이티브 Windows 프로그램에서 프로그램은 사용자 인터페이스 이벤트 및 메시지를 관리합니다. 인쇄 작업을 수행하려면 프린터용으로 애플리케이션 콘텐츠가 렌더링되므로 집중적인 계산 기간이 필요할 수 있으며, 사용자 상호 작용의 이벤트 처리와 동일한 스레드에서 이 처리가 수행되는 경우 프로그램이 사용자 상호 작용에 응답하지 못하게 할 수 있습니다.
다중 스레드 윈도우 네이티브 프로그램 작성 방법을 이미 잘 알고 있는 경우, 윈도우 애플리케이션에서 인쇄하는 방법으로 직접 이동하여 프로그램에 인쇄 기능을 추가하는 방법을 배워보세요.
기본 Windows 프로그램 요구 사항
최상의 성능 및 프로그램 응답성을 위해 사용자 상호 작용을 처리하는 스레드에서 프로그램의 인쇄 작업 처리를 수행하지 마세요.
이러한 사용자 상호 작용에서 인쇄를 분리하면 프로그램이 애플리케이션 데이터를 관리하는 방법에 영향을 줍니다. 애플리케이션 작성을 시작하기 전에 이러한 의미를 철저히 이해해야 합니다. 다음 항목에서는 프로그램의 별도 스레드에서 인쇄를 처리하는 기본 요구 사항에 대해 설명합니다.
Windows 프로그램 기본 사항
네이티브 Windows 프로그램은 운영 체제에서 수신하는 창 메시지를 처리하는 기본 창 프로시저를 제공해야 합니다. Windows 프로그램의 모든 창에는 이러한 창 메시지를 처리하는 해당 WndProc 함수가 있습니다. 이 함수가 실행되는 스레드를 사용자 인터페이스 또는 UI 스레드라고합니다.
문자열에 리소스를 사용합니다.
다른 언어를 지원할 때 변경해야 할 수 있는 문자열에 대해 문자열 상수 대신 프로그램의 리소스 파일에서 문자열 리소스를 사용합니다. 프로그램에서 문자열 리소스를 문자열로 사용하려면 먼저 프로그램에서 리소스 파일에서 리소스를 검색하고 로컬 메모리 버퍼에 복사해야 합니다. 이렇게 하려면 처음에는 몇 가지 추가 프로그래밍이 필요하지만 나중에 프로그램을 보다 쉽게 수정, 번역 및 지역화할 수 있습니다.
단계별로 데이터를 처리합니다.
중단될 수 있는 단계로 인쇄 작업을 처리합니다. 이 디자인을 사용하면 사용자가 완료되기 전에 긴 처리 작업을 취소할 수 있으며 프로그램이 동시에 실행될 수 있는 다른 프로그램을 차단할 수 없습니다.
창 사용자 데이터를 사용합니다.
인쇄 애플리케이션에는 종종 여러 창과 스레드가 있습니다. 정적 전역 변수를 사용하지 않고 스레드와 처리 단계 간에 데이터를 사용할 수 있도록 하려면 사용되는 창의 일부인 데이터 포인터로 데이터 구조를 참조합니다.
다음 코드 예제에서는 인쇄 애플리케이션에 대 한 기본 진입점을 보여 주세요. 이 예제에서는 문자열 상수 대신 문자열 리소스를 사용하는 방법을 보여 줍니다. 또한 프로그램의 창 메시지를 처리하는 기본 메시지 루프를 보여 줍니다.
int APIENTRY
wWinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPWSTR lpCmdLine,
int nCmdShow
)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
MSG msg;
HACCEL hAccelTable;
HRESULT hr = S_OK;
// Register the main window class name
WCHAR szWindowClass[MAXIMUM_RESOURCE_STRING_LENGTH];
LoadString(
hInstance,
IDC_PRINTSAMPLE,
szWindowClass,
MAXIMUM_RESOURCE_STRING_LENGTH);
MyRegisterClass(hInstance, szWindowClass);
// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
// Unable to initialize this instance of the application
// so display error message and exit
MessageBoxWithResourceString (
hInstance,
GetDesktopWindow(),
IDS_ERROR_INSTINITFAIL,
IDS_CAPTION_ERROR,
(MB_OK | MB_ICONEXCLAMATION));
return FALSE;
}
// Init COM for printing interfaces
if (FAILED(hr = CoInitializeEx(0, COINIT_MULTITHREADED)))
{
// Unable to initialize COM
// so display error message and exit
MessageBoxWithResourceString (
hInstance,
GetDesktopWindow(),
IDS_ERROR_COMINITFAIL,
IDS_CAPTION_ERROR,
(MB_OK | MB_ICONEXCLAMATION));
return FALSE;
}
hAccelTable = LoadAccelerators(
hInstance,
MAKEINTRESOURCE(IDC_PRINTSAMPLE));
// Main message handling loop
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
// Uninitialize (close) the COM interface
CoUninitialize();
return (int) msg.wParam;
}
문서 정보
인쇄하는 네이티브 Windows 프로그램은 다중 스레드 처리를 위해 디자인되어야 합니다. 다중 스레드 디자인의 요구 사항 중 하나는 여러 스레드가 동시에 사용할 수 있도록 프로그램의 데이터 요소를 보호하는 것입니다. 동기화 개체를 사용하고 데이터를 구성하여 스레드 간의 충돌을 방지하여 데이터 요소를 보호할 수 있습니다. 동시에 프로그램이 인쇄되는 동안 프로그램 데이터를 변경하지 않도록 해야 합니다. 샘플 프로그램은 여러 가지 다중 스레드 프로그래밍 기술을 사용합니다.
동기화 이벤트
샘플 프로그램은 이벤트, 스레드 핸들 및 대기 함수를 사용하여 인쇄 스레드와 주 프로그램 간의 처리를 동기화하고 데이터가 사용 중임을 나타냅니다.
Application-Specific Windows 메시지
샘플 프로그램은 애플리케이션별 창 메시지를 사용하여 프로그램이 다른 네이티브 Windows 프로그램과 더 호환되도록 합니다. 처리를 더 작은 단계로 분할하고 창 메시지 루프에서 이러한 단계를 큐에 넣으면 Windows에서 컴퓨터에서 실행 중인 다른 애플리케이션을 차단하지 않고도 처리를 보다 쉽게 관리할 수 있습니다.
데이터 구조
샘플 프로그램은 데이터 요소를 데이터 구조로 그룹화하지만 개체 및 클래스를 사용하여 개체 지향 스타일로 작성되지 않습니다. 이 샘플은 개체 지향 접근 방식을 사용하여 한 방법이 다른 방법보다 낫거나 더 나쁘다는 것을 암시하지 않습니다.
프로그램을 디자인할 때 샘플 프로그램의 함수 및 데이터 구조를 시작점으로 사용할 수 있습니다. 개체 지향 프로그램을 디자인할지 여부와 관계없이 필요한 경우 다른 스레드에서 안전하게 사용할 수 있도록 관련 데이터 요소를 그룹화해야 합니다.
프린터 디바이스 컨텍스트
인쇄할 때 디바이스 컨텍스트에 인쇄할 콘텐츠를 렌더링할 수 있습니다. 방법: 프린터 디바이스 컨텍스트 검색 프린터 디바이스 컨텍스트를 가져올 수 있는 다양한 방법을 설명합니다.
관련 항목