데스크톱 앱 인쇄

이 섹션에서는 네이티브 Windows 데스크톱 프로그램에서 인쇄하는 방법을 설명합니다.

개요

네이티브 Windows 프로그램에서 인쇄할 때 최상의 사용자 환경을 제공하려면 전용 스레드에서 인쇄하도록 프로그램을 설계해야 합니다. 네이티브 Windows 프로그램에서 프로그램은 사용자 인터페이스 이벤트 및 메시지를 관리합니다. 인쇄 작업에는 애플리케이션 콘텐츠가 프린터에 대해 렌더링될 때 계산 기간이 많이 필요할 수 있으며, 이 처리가 사용자 상호 작용의 이벤트 처리와 동일한 스레드에서 수행되는 경우 프로그램이 사용자 상호 작용에 응답하지 않도록 할 수 있습니다.

다중 스레드 네이티브 Windows 프로그램을 작성하는 방법을 이미 잘 알고 있는 경우 Windows 애플리케이션에서 인쇄하는 방법으로 직접 이동하여 프로그램에 인쇄 기능을 추가하는 방법을 알아봅니다.

기본 Windows 프로그램 요구 사항

최상의 성능 및 프로그램 응답성을 위해 사용자 상호 작용을 처리하는 스레드에서 프로그램의 인쇄 작업 처리를 수행하지 마세요.

이러한 사용자 상호 작용과의 인쇄 분리는 프로그램이 애플리케이션 데이터를 관리하는 방법에 영향을 줍니다. 애플리케이션 작성을 시작하기 전에 이러한 의미를 철저히 이해해야 합니다. 다음 topics 프로그램의 별도 스레드에서 인쇄를 처리하는 기본 요구 사항을 설명합니다.

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 프로그램은 다중 스레드 처리를 위해 설계되어야 합니다. 다중 스레드 디자인의 요구 사항 중 하나는 여러 스레드가 동시에 사용할 수 있도록 프로그램의 데이터 요소를 보호하는 것입니다. 동기화 개체를 사용하고 스레드 간의 충돌을 방지하기 위해 데이터를 구성하여 데이터 요소를 보호할 수 있습니다. 동시에 프로그램이 인쇄되는 동안 프로그램 데이터의 변경을 방지해야 합니다. 샘플 프로그램은 여러 가지 다중 스레드 프로그래밍 기술을 사용합니다.

동기화 이벤트
샘플 프로그램은 이벤트, 스레드 핸들 및 대기 함수를 사용하여 인쇄 스레드와 기본 프로그램 간의 처리를 동기화하고 데이터가 사용 중임을 나타냅니다.
애플리케이션별 Windows 메시지
샘플 프로그램은 애플리케이션별 창 메시지를 사용하여 프로그램이 다른 네이티브 Windows 프로그램과 더 호환되도록 합니다. 처리를 더 작은 단계로 분할하고 창 메시지 루프에서 이러한 단계를 큐에 넣으면 Windows에서 컴퓨터에서 실행 중인 다른 애플리케이션을 차단하지 않고도 처리를 더 쉽게 관리할 수 있습니다.
데이터 구조
샘플 프로그램은 데이터 요소를 데이터 구조로 그룹화하지만 개체 및 클래스를 사용하여 개체 지향 스타일로 작성되지 않습니다. 이 샘플에서는 개체 지향 접근 방식을 사용하여 한 접근 방식이 다른 방법보다 낫거나 더 나쁘다는 것을 암시하지 않습니다.
프로그램을 디자인할 때 샘플 프로그램의 함수 및 데이터 구조를 시작점으로 사용할 수 있습니다. 개체 지향 프로그램을 디자인할지 여부와 관계없이 중요한 디자인 고려 사항은 관련 데이터 요소를 그룹화하여 필요에 따라 다른 스레드에서 안전하게 사용할 수 있도록 하는 것입니다.

프린터 디바이스 컨텍스트

인쇄할 때 디바이스 컨텍스트에 인쇄할 콘텐츠를 렌더링할 수 있습니다. 방법: 프린터 디바이스 컨텍스트 검색은 프린터 디바이스 컨텍스트 를 가져올 수 있는 다양한 방법을 설명합니다.

Windows 애플리케이션에서 인쇄하는 방법