Pencetakan Aplikasi Desktop

Bagian ini menjelaskan cara mencetak dari program desktop Windows asli.

Gambaran Umum

Untuk memberikan pengalaman pengguna terbaik ketika Anda mencetak dari program Windows asli, program harus dirancang untuk mencetak dari utas khusus. Dalam program Windows asli, program ini bertanggung jawab untuk mengelola peristiwa dan pesan antarmuka pengguna. Operasi pencetakan dapat memerlukan periode komputasi intens karena konten aplikasi dirender untuk printer, yang dapat mencegah program merespons interaksi pengguna jika pemrosesan ini dilakukan dalam utas yang sama dengan pemrosesan peristiwa interaksi pengguna.

Jika Anda sudah terbiasa dengan cara menulis program Windows asli multi-utas, Anda langsung membuka Cara mencetak dari aplikasi Windows dan mempelajari cara menambahkan fungsionalitas pencetakan ke program Anda.

Persyaratan Program Windows Dasar

Untuk performa terbaik dan responsivitas program, jangan lakukan pemrosesan pekerjaan cetak program di utas yang memproses interaksi pengguna.

Pemisahan pencetakan dari interaksi pengguna ini akan memengaruhi cara program mengelola data aplikasi. Anda harus memahami implikasi ini secara menyeluruh sebelum mulai menulis aplikasi. Topik berikut menjelaskan persyaratan dasar penanganan pencetakan dalam utas terpisah dari suatu program.

Dasar-Dasar Program Windows

Program Windows asli harus menyediakan prosedur jendela utama untuk memproses pesan jendela yang diterimanya dari sistem operasi. Setiap jendela dalam program Windows memiliki fungsi WndProc yang sesuai yang memproses pesan jendela ini. Utas tempat fungsi ini berjalan disebut antarmuka pengguna, atau UI, utas.

Gunakan sumber daya untuk string.
Gunakan sumber daya string dari file sumber daya program alih-alih konstanta string untuk string yang mungkin perlu diubah saat Anda mendukung bahasa lain. Sebelum program dapat menggunakan sumber daya string sebagai string, program harus mengambil sumber daya dari file sumber daya dan menyalinnya ke buffer memori lokal. Ini memerlukan beberapa pemrograman tambahan di awal, tetapi memungkinkan modifikasi, terjemahan, dan pelokalan program yang lebih mudah di masa depan.
Memproses data dalam langkah-langkah.
Proses pekerjaan cetak dalam langkah-langkah yang dapat terganggu. Desain ini memungkinkan pengguna untuk membatalkan operasi pemrosesan yang lama sebelum selesai dan mencegah program memblokir program lain yang mungkin berjalan pada saat yang sama.
Gunakan data pengguna jendela.
Aplikasi pencetakan sering memiliki beberapa jendela dan utas. Untuk menjaga data tetap tersedia antara utas dan langkah-langkah pemrosesan tanpa menggunakan variabel global statis, referensikan struktur data oleh penunjuk data yang merupakan bagian dari jendela tempat data digunakan.

Contoh kode berikut menunjukkan titik masuk utama untuk aplikasi pencetakan. Contoh ini menunjukkan cara menggunakan sumber daya string alih-alih konstanta string dan juga menunjukkan perulangan pesan utama yang memproses pesan jendela program.

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

Informasi Dokumen

Program Windows asli yang mencetak harus dirancang untuk pemrosesan multi-utas. Salah satu persyaratan desain multi-utas adalah melindungi elemen data program sehingga aman untuk digunakan oleh beberapa utas secara bersamaan. Anda dapat melindungi elemen data dengan menggunakan objek sinkronisasi dan mengatur data untuk menghindari konflik di antara utas. Pada saat yang sama, program harus mencegah perubahan pada data program saat sedang dicetak. Program sampel menggunakan beberapa teknik pemrograman multi-utas yang berbeda.

Peristiwa Sinkronisasi
Program sampel menggunakan peristiwa, handel utas, dan fungsi tunggu untuk menyinkronkan pemrosesan antara utas cetak dan program utama dan untuk menunjukkan bahwa data sedang digunakan.
Pesan Windows Khusus Aplikasi
Program sampel menggunakan pesan jendela khusus aplikasi untuk membuat program lebih kompatibel dengan program Windows asli lainnya. Memecah pemrosesan menjadi langkah-langkah yang lebih kecil dan mengantre langkah-langkah tersebut dalam perulangan pesan jendela memudahkan Windows untuk mengelola pemrosesan tanpa memblokir aplikasi lain yang mungkin juga berjalan di komputer.
Struktur Data
Program sampel tidak ditulis dalam gaya berorientasi objek menggunakan objek dan kelas, meskipun mengelompokkan elemen data ke dalam struktur data. Sampel tidak menggunakan pendekatan berorientasi objek untuk menghindari menyiratkan bahwa satu pendekatan lebih baik atau lebih buruk dari yang lain.
Anda dapat menggunakan fungsi dan struktur data program sampel sebagai titik awal saat Merancang program Anda. Apakah Anda memutuskan untuk merancang program berorientasi objek atau tidak, pertimbangan desain penting yang perlu diingat adalah mengelompokkan elemen data terkait sehingga Anda dapat menggunakannya dengan aman di utas yang berbeda seperlunya.

Konteks Perangkat Printer

Saat mencetak, Anda mungkin ingin merender konten yang akan dicetak ke konteks perangkat. Cara: Mengambil Konteks Perangkat Printer menjelaskan berbagai cara agar Anda bisa mendapatkan konteks perangkat printer.

Cara mencetak dari aplikasi Windows