Sdílet prostřednictvím


Tisk desktopové aplikace

Tato část popisuje, jak tisknout z nativní desktopové aplikace windows.

Přehled

Chcete-li zajistit nejlepší uživatelské prostředí při tisku z nativního programu systému Windows, musí být program navržen tak, aby se tiskl z vyhrazeného vlákna. V nativním programu systému Windows je program zodpovědný za správu událostí a zpráv uživatelského rozhraní. Operace tisku můžou vyžadovat období intenzivního výpočtu, protože se obsah aplikace vykreslí pro tiskárnu, což může zabránit tomu, aby program reagoval na interakci uživatele, pokud se toto zpracování provádí ve stejném vlákně jako zpracování událostí interakce uživatele.

Pokud už víte, jak napsat nativní program windows s více vlákny, přejdete přímo na Jak tisknout z aplikace pro Windows a naučíte se, jak do programu přidat funkce tisku.

Základní požadavky programu systému Windows

Pro zajištění nejlepšího výkonu a odezvy programu neprovádějte zpracování tiskové úlohy programu ve vlákně, které zpracovává interakci uživatele.

Toto oddělení tisku od interakce uživatele ovlivní způsob, jakým program spravuje data aplikací. Než začnete psát aplikaci, měli byste tyto důsledky důkladně pochopit. Následující témata popisují základní požadavky na zpracování tisku v samostatném vlákně programu.

Základy programu systému Windows

Nativní program systému Windows musí poskytnout postup hlavního okna pro zpracování zpráv okna, které přijímá z operačního systému. Každé okno v programu systému Windows má odpovídající WndProc funkce, která zpracovává tyto zprávy okna. Vlákno, ve kterém se tato funkce spouští, se nazývá uživatelské rozhraní nebo vlákno uživatelského rozhraní.

Používat prostředky pro řetězce.
Použijte řetězcové prostředky ze souboru prostředků programu místo řetězcových konstant pro řetězce, které mohou být potřeba změnit, když podporujete jiný jazyk. Než může program použít řetězec jako prostředek, musí ho načíst ze souboru prostředků a zkopírovat do místní paměťové oblasti. To vyžaduje další programování na začátku, ale umožňuje snadnější úpravy, překlad a lokalizaci programu v budoucnu.
Zpracování dat v krocích.
Zpracujte tiskovou úlohu v krocích, které je možné přerušit. Díky tomuto návrhu může uživatel před dokončením zrušit dlouhou operaci zpracování a zabránit programu v blokování jiných programů, které můžou běžet současně.
Použít uživatelská data okna.
Tisk aplikací má často několik oken a vláken. Pokud chcete zachovat data dostupná mezi vlákny a kroky zpracování bez použití statických globálních proměnných, odkazujte na datové struktury ukazatelem dat, který je součástí okna, ve kterém se používají.

Následující příklad kódu ukazuje hlavní vstupní bod pro tiskovou aplikaci. Tento příklad ukazuje, jak používat řetězcové prostředky místo řetězcových konstant a také ukazuje hlavní smyčku zpráv, která zpracovává zprávy okna programu.

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;
}

Informace o dokumentu

Nativní programy systému Windows, které se tisknou, by měly být navrženy pro zpracování ve více vláknech. Jedním z požadavků vícevláknového návrhu je ochrana datových prvků programu tak, aby byly bezpečné pro souběžné použití více vlákny. Datové prvky můžete chránit pomocí synchronizačních objektů a uspořádáním dat, abyste zabránili konfliktům mezi vlákny. Současně musí program zabránit změnám dat programu při tisku. Ukázkový program používá několik různých programovacích technik s více vlákny.

události synchronizace
Ukázkový program používá události, popisovače vláken a funkce čekání k synchronizaci zpracování mezi tiskovým vláknem a hlavním programem a označuje, že jsou data používána.
Application-Specific Zprávy systému Windows
Ukázkový program používá zprávy oken specifické pro aplikaci, aby byl program kompatibilní s jinými nativními programy systému Windows. Rozdělení zpracování do menších kroků a řazení těchto kroků do fronty ve smyčce zpráv okna usnadňuje systému Windows správu zpracování bez blokování jiných aplikací, které mohou být spuštěné také v počítači.
datové struktury
Ukázkový program není napsán v objektově orientovaném stylu pomocí objektů a tříd, ačkoli seskupuje datové prvky do datových struktur. Vzorek nepoužívá objektově orientovaný přístup, aby se zabránilo tomu, že jeden přístup je lepší nebo horší než jiný.
Funkce a datové struktury ukázkového programu můžete použít jako výchozí bod při návrhu programu. Ať už se rozhodnete navrhnout objektově orientovaný program nebo ne, důležitým návrhovým aspektem je seskupovat související datové prvky, aby bylo možné je bezpečně používat v různých vláknech podle potřeby.

Kontext zařízení tiskárny

Při tisku můžete chtít vykreslit obsah, který se má vytisknout do kontextu zařízení. Jak na to: Získání kontextu zařízení tiskárny popisuje různé způsoby, jak získat kontext zařízení tiskárny.

Jak tisknout z aplikace pro Windows