Mulai Cepat Direct2D

Direct2D adalah API kode asli dan mode langsung untuk membuat grafik 2D. Topik ini menggambarkan cara menggunakan Direct2D dalam aplikasi Win32 biasa untuk menggambar ke HWND.

Catatan

Jika Anda ingin membuat aplikasi Windows Store yang menggunakan Direct2D, lihat mulai cepat Direct2D untuk topik Windows 8.

 

Topik ini berisi bagian berikut:

Menggambar Persegi Panjang Sederhana

Untuk menggambar persegi menggunakan GDI, Anda dapat menangani pesan WM_PAINT , seperti yang diperlihatkan dalam kode berikut.

switch(message)
{

    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            BeginPaint(hwnd, &ps);

            // Obtain the size of the drawing area.
            RECT rc;
            GetClientRect(
                hwnd,
                &rc
            );          

            // Save the original object
            HGDIOBJ original = NULL;
            original = SelectObject(
                ps.hdc,
                GetStockObject(DC_PEN)
            );

            // Create a pen.            
            HPEN blackPen = CreatePen(PS_SOLID, 3, 0);

            // Select the pen.
            SelectObject(ps.hdc, blackPen);

            // Draw a rectangle.
            Rectangle(
                ps.hdc, 
                rc.left + 100, 
                rc.top + 100, 
                rc.right - 100, 
                rc.bottom - 100);   

            DeleteObject(blackPen);

            // Restore the original object
            SelectObject(ps.hdc, original);

            EndPaint(hwnd, &ps);
        }
        return 0;

// Code for handling other messages. 

Kode untuk menggambar persegi panjang yang sama dengan Direct2D serupa: ia membuat sumber daya gambar, menggambarkan bentuk untuk menggambar, menggambar bentuk, lalu melepaskan sumber daya gambar. Bagian berikut menjelaskan masing-masing langkah ini secara rinci.

Langkah 1: Sertakan Header Direct2D

Selain header yang diperlukan untuk aplikasi Win32, sertakan header d2d1.h.

Langkah 2: Membuat ID2D1Factory

Salah satu hal pertama yang dilakukan contoh Direct2D adalah membuat ID2D1Factory.

ID2D1Factory* pD2DFactory = NULL;
HRESULT hr = D2D1CreateFactory(
    D2D1_FACTORY_TYPE_SINGLE_THREADED,
    &pD2DFactory
    );

Antarmuka ID2D1Factory adalah titik awal untuk menggunakan Direct2D; gunakan ID2D1Factory untuk membuat sumber daya Direct2D.

Saat membuat pabrik, Anda dapat menentukan apakah itu multi-atau berutas tunggal. (Untuk informasi selengkapnya tentang pabrik multi-utas, lihat keterangan di halaman referensi ID2D1Factory.) Contoh ini membuat pabrik berutas tunggal.

Secara umum, aplikasi Anda harus membuat pabrik sekali dan mempertahankannya selama masa pakai aplikasi.

Langkah 3: Membuat ID2D1HwndRenderTarget

Setelah Anda membuat pabrik, gunakan untuk membuat target render.



// Obtain the size of the drawing area.
RECT rc;
GetClientRect(hwnd, &rc);

// Create a Direct2D render target          
ID2D1HwndRenderTarget* pRT = NULL;          
HRESULT hr = pD2DFactory->CreateHwndRenderTarget(
    D2D1::RenderTargetProperties(),
    D2D1::HwndRenderTargetProperties(
        hwnd,
        D2D1::SizeU(
            rc.right - rc.left,
            rc.bottom - rc.top)
    ),
    &pRT
);

Target render adalah perangkat yang dapat melakukan operasi menggambar dan membuat sumber daya gambar yang bergantung pada perangkat seperti kuas. Berbagai jenis target render dirender ke perangkat yang berbeda. Contoh sebelumnya menggunakan ID2D1HwndRenderTarget, yang dirender ke sebagian layar.

Jika memungkinkan, target render menggunakan GPU untuk mempercepat operasi penyajian dan membuat sumber daya gambar. Jika tidak, target render menggunakan CPU untuk memproses instruksi penyajian dan membuat sumber daya. (Anda dapat mengubah perilaku ini dengan menggunakan bendera D2D1_RENDER_TARGET_TYPE saat membuat target render.)

Metode CreateHwndRenderTarget mengambil tiga parameter. Parameter pertama, struct D2D1_RENDER_TARGET_PROPERTIES , menentukan opsi tampilan jarak jauh, apakah akan memaksa target render untuk dirender ke perangkat lunak atau perangkat keras, dan DPI. Kode dalam contoh ini menggunakan fungsi pembantu D2D1::RenderTargetProperties untuk menerima properti target render default.

Parameter kedua, struktur D2D1_HWND_RENDER_TARGET_PROPERTIES , menentukan HWND tempat konten dirender, ukuran awal target render (dalam piksel), dan opsi presentasinya. Contoh ini menggunakan fungsi pembantu D2D1::HwndRenderTargetProperties untuk menentukan HWND dan ukuran awal. Ini menggunakan opsi presentasi default.

Parameter ketiga adalah alamat penunjuk yang menerima referensi target render.

Saat Anda membuat target render dan akselerasi perangkat keras tersedia, Anda mengalokasikan sumber daya di GPU komputer. Dengan membuat target render sekali dan mempertahankannya selama mungkin, Anda mendapatkan manfaat performa. Aplikasi Anda harus membuat target render sekali dan berpegang pada target tersebut selama masa pakai aplikasi atau sampai kesalahan D2DERR_RECREATE_TARGET diterima. Ketika Anda menerima kesalahan ini, Anda perlu membuat ulang target render (dan sumber daya apa pun yang dibuatnya).

Langkah 4: Buat Brush

Seperti pabrik, target render dapat membuat sumber daya gambar. Dalam contoh ini, target render membuat kuas.

ID2D1SolidColorBrush* pBlackBrush = NULL;
if (SUCCEEDED(hr))
{
            
    pRT->CreateSolidColorBrush(
        D2D1::ColorF(D2D1::ColorF::Black),
        &pBlackBrush
        ); 
}

Kuas adalah objek yang melukis area, seperti goresan bentuk atau isian geometri. Kuas dalam contoh ini melukis area dengan warna solid yang telah ditentukan sebelumnya, hitam.

Direct2D juga menyediakan jenis kuas lainnya: kuas gradien untuk melukis gradien linier dan radial, dan kuas bitmap untuk lukisan dengan bitmap dan pola.

Beberapa API gambar menyediakan pena untuk menggambar kerangka dan kuas untuk mengisi bentuk. Direct2D berbeda: tidak menyediakan objek pena tetapi menggunakan kuas untuk menggambar kerangka dan mengisi bentuk. Saat menggambar kerangka, gunakan antarmuka ID2D1StrokeStyle dengan kuas untuk mengontrol operasi membelai jalur.

Kuas hanya dapat digunakan dengan target render yang membuatnya dan dengan target render lainnya di domain sumber daya yang sama. Secara umum, Anda harus membuat kuas sekali dan mempertahankannya untuk kehidupan target render yang membuatnya. ID2D1SolidColorBrush adalah pengecualian kesepian; karena relatif murah untuk dibuat, Anda dapat membuat ID2D1SolidColorBrush setiap kali Anda menggambar bingkai, tanpa hit performa yang nyata. Anda juga dapat menggunakan ID2D1SolidColorBrush tunggal dan hanya mengubah warnanya setiap kali Anda menggunakannya.

Langkah 5: Gambar Persegi Panjang

Selanjutnya, gunakan target render untuk menggambar persegi.

 
pRT->BeginDraw();

pRT->DrawRectangle(
    D2D1::RectF(
        rc.left + 100.0f,
        rc.top + 100.0f,
        rc.right - 100.0f,
        rc.bottom - 100.0f),
        pBlackBrush);

HRESULT hr = pRT->EndDraw();  

Metode DrawRectangle mengambil dua parameter: persegi panjang yang akan digambar, dan kuas yang akan digunakan untuk mengecat kerangka persegi panjang. Secara opsional, Anda juga dapat menentukan lebar goresan, pola tanda hubung, gabungan garis, dan opsi batas akhir.

Anda harus memanggil metode BeginDraw sebelum mengeluarkan perintah gambar apa pun, dan Anda harus memanggil metode EndDraw setelah Anda selesai mengeluarkan perintah gambar. Metode EndDraw mengembalikan HRESULT yang menunjukkan apakah perintah gambar berhasil.

Langkah 6: Rilis Sumber Daya

Ketika tidak ada lagi bingkai untuk digambar, atau ketika Anda menerima kesalahan D2DERR_RECREATE_TARGET , lepaskan target render dan perangkat apa pun yang dibuatnya.

 
SafeRelease(pRT);
SafeRelease(pBlackBrush);

Setelah aplikasi Anda selesai menggunakan sumber daya Direct2D (seperti saat akan keluar), rilis pabrik Direct2D.

 
SafeRelease(pD2DFactory);

Membuat Aplikasi Direct2D Sederhana

Kode dalam topik ini menunjukkan elemen dasar aplikasi Direct2D. Untuk keringkasan, topik menghilangkan kerangka kerja aplikasi dan kode penanganan kesalahan yang merupakan karakteristik dari aplikasi yang ditulis dengan baik. Untuk panduan yang lebih rinci yang menunjukkan kode lengkap untuk membuat aplikasi Direct2D sederhana dan menunjukkan praktik desain terbaik, lihat Membuat aplikasi Direct2D sederhana.

Membuat aplikasi Direct2D sederhana