Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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.
Související témata
Jak tisknout z aplikace pro Windows