https://msdn.microsoft.com/en-us/library/windows/desktop/ff381399%28v=vs.85%29.aspx
Jenis data berikut selalu ukuran pointer - yaitu, 32 bit lebar dalam aplikasi 32-bit, dan 64 bit lebar dalam aplikasi 64-bit. Ukuran ditentukan pada waktu kompilasi. Ketika aplikasi 32-bit berjalan pada 64-bit Windows, tipe data ini masih 4 byte lebar. (Sebuah aplikasi 64-bit tidak bisa berjalan di 32-bit Windows, sehingga situasi sebaliknya tidak terjadi.)
Header untuk Microsoft C run-time perpustakaan mendefinisikan satu set sama macro. Misalnya, _tcslen resolve ke strlen jika _UNICODE tidak terdefinisi; selain itu itu resolve ke wcslen, yang merupakan versi lebar-karakter strlen.
Hati-hati: Beberapa header menggunakan simbol preprocessor UNICODE, yang lain menggunakan _UNICODE dengan LP garis bawah. Selalu mendefinisikan kedua simbol. Visual C ++ menetapkan mereka berdua secara default ketika Anda membuat proyek baru.
Screenshot dari sebuah jendela aplikasi
Koordinat diukur dalam pixel perangkat-independen. Kami akan memiliki lebih banyak berbicara tentang perangkat bagian independen dari piksel perangkat-independen ketika kita membahas grafis.
Dalam modul ini, kita akan menulis sebuah program Windows minimal. Semua hal ini adalah membuat dan menampilkan jendela kosong. Program pertama ini mengandung sekitar 50 baris kode, tidak menghitung baris kosong dan komentar. Ini akan menjadi titik awal kita; kemudian kami akan menambahkan gambar, teks, input pengguna, dan fitur lainnya.
Introduction to Windows Programming in C++
Untuk menulis program Windows di C atau C ++, Anda harus menginstal Microsoft Windows Software Development Kit (SDK) atau lingkungan pengembangan yang mencakup Windows SDK, seperti Microsoft Visual C ++. Windows SDK berisi header dan perpustakaan yang diperlukan untuk mengkompilasi dan link aplikasi Anda. Windows SDK juga berisi alat baris perintah untuk membangun aplikasi Windows, termasuk C ++ Visual compiler dan linker. Meskipun Anda dapat mengkompilasi dan membangun program Windows dengan alat baris perintah, kami sarankan menggunakan lingkungan pengembangan fitur lengkap seperti Microsoft Visual Studio. Visual C ++ Express adalah edisi download gratis Visual C ++ yang tersedia di http://go.microsoft.com/fwlink/?LinkId=181514.Windows Coding Conventions
Jika Anda baru dalam pemrograman Windows, itu dapat membingungkan ketika Anda pertama kali melihat program Windows. Kode ini diisi dengan jenis definisi aneh seperti DWORD_PTR dan LPRECT, dan variabel memiliki nama seperti hWnd dan pwsz (disebut notasi Hungaria). Ini perlu mengambil waktu untuk mempelajari beberapa coding konvensi Windows.
Sebagian besar Windows API terdiri dari baik fungsi maupun Component Object Model (COM) interface. Sangat sedikit Windows API disediakan sebagai kelas C ++. (Sebuah pengecualian adalah GDI +, salah satu dari 2-D grafis API.)
Typedefs
Header Windows mengandung banyak typedef. Banyak dari ini didefinisikan dalam file header WinDef.h. Berikut adalah beberapa yang akan Anda sering temui.
Seperti yang Anda lihat, ada sejumlah redundansi dalam typedef ini. Beberapa tumpang tindih ini hanya karena sejarah API Windows. Jenis yang tercantum di sini telah tetap ukuran, dan ukuran yang sama di kedua 32-bit dan 64-aplikasi. Sebagai contoh, jenis DWORD selalu 32 bit lebar.
Data type | Size | Signed? |
---|---|---|
BYTE | 8 bits | Unsigned |
DWORD | 32 bits | Unsigned |
INT32 | 32 bits | Signed |
INT64 | 64 bits | Signed |
LONG | 32 bits | Signed |
LONGLONG | 64 bits | Signed |
UINT32 | 32 bits | Unsigned |
UINT64 | 64 bits | Unsigned |
ULONG | 32 bits | Unsigned |
ULONGLONG | 64 bits | Unsigned |
WORD | 16 bits | Unsigned |
Seperti yang Anda lihat, ada sejumlah redundansi dalam typedef ini. Beberapa tumpang tindih ini hanya karena sejarah API Windows. Jenis yang tercantum di sini telah tetap ukuran, dan ukuran yang sama di kedua 32-bit dan 64-aplikasi. Sebagai contoh, jenis DWORD selalu 32 bit lebar.
Boolean Type
Bool adalah typedef untuk nilai integer yang digunakan dalam konteks Boolean. File header WinDef.h juga mendefinisikan dua nilai untuk digunakan dengan Bool.#define FALSE 0 #define TRUE 1Meskipun definisi ini TRUE, bagaimanapun, sebagian besar fungsi yang mengembalikan tipe Bool dapat mengembalikan nilai bukan nol apapun untuk menunjukkan kebenaran Boolean. Oleh karena itu, Anda harus selalu menulis ini:
// Right way. BOOL result = SomeFunctionThatReturnsBoolean(); if (result) { ... }
dan tidak ini:
// Wrong! if (result == TRUE) { ... }
Sadarilah bahwa Bool adalah tipe integer dan tidak dipertukarkan dengan C ++ tipe bool.
Pointer Types
Windows mendefinisikan banyak jenis data berupa pointer-ke-X. Ini biasanya memiliki P awalan maupun LP dalam nama. Misalnya, LPRECT adalah pointer ke rect, di mana rect adalah struktur yang menggambarkan persegi panjang. Deklarasi variabel berikut adalah setara.
RECT* rect; // Pointer to a RECT structure. LPRECT rect; // The same PRECT rect; // Also the same.
Secara historis, P singkatan dari "pointer" dan LP singkatan dari "pointer long". Pointer panjang (juga disebut pointer jauh) adalah peninggalan dari Windows 16-bit, ketika mereka dibutuhkan untuk mengatasi memori berkisar luar segmen saat ini. Awalan LP dipelihara untuk membuatnya lebih mudah untuk port kode 16-bit dengan 32-bit Windows. Hari ini tidak ada perbedaan - pointer adalah pointer.
Pointer Precision Types
- DWORD_PTR
- INT_PTR
- LONG_PTR
- ULONG_PTR
- UINT_PTR
Hungarian Notation
Notasi Hungaria adalah praktek menambahkan prefiks ke nama-nama variabel, untuk memberikan informasi tambahan tentang variabel. (Notasi penemu, Charles Simonyi, adalah Hungaria, maka namanya).
Dalam bentuk aslinya, notasi orang Hungaria memberikan informasi semantik tentang variabel, mengatakan tujuan penggunaan. Sebagai contoh, i berarti indeks, cb berarti ukuran dalam bytes ("count byte"), dan rw dan col berarti nomor baris dan kolom. Prefiks ini dirancang untuk menghindari penggunaan disengaja dari variabel dalam konteks yang salah. Misalnya, jika Anda melihat ekspresi reposisi + cbTable, Anda akan tahu bahwa nomor baris yang ditambahkan ke ukuran, yang hampir pasti bug dalam kode
Anda akan melihat kedua versi di MSDN kode contoh. Untuk menyatakan lebar-karakter literal maupun string lebar karakter literal, menempatkan L sebelum literal.
Sebuah bentuk yang lebih umum notasi orang Hungaria menggunakan prefiks untuk memberikan informasi jenis - misalnya, dw untuk DWORD dan w untuk WORD.
Jika Anda mencari Web untuk "notasi orang Hungaria," Anda akan menemukan banyak pendapat tentang apakah notasi Hungaria adalah baik atau buruk. Beberapa programmer memiliki intens tidak suka untuk notasi orang Hungaria. Lainnya merasa terbantu. Apapun, banyak contoh kode di MSDN menggunakan notasi orang Hungaria, tetapi Anda tidak perlu menghafal prefiks untuk memahami kode.
Jika Anda mencari Web untuk "notasi orang Hungaria," Anda akan menemukan banyak pendapat tentang apakah notasi Hungaria adalah baik atau buruk. Beberapa programmer memiliki intens tidak suka untuk notasi orang Hungaria. Lainnya merasa terbantu. Apapun, banyak contoh kode di MSDN menggunakan notasi orang Hungaria, tetapi Anda tidak perlu menghafal prefiks untuk memahami kode.
Working with Strings
Windows secara native mendukung Unicode string untuk elemen UI, nama file, dan sebagainya. Unicode adalah pengkodean karakter yang disukai, karena mendukung semua set karakter dan bahasa. Windows mencerminkan karakter Unicode menggunakan UTF-16 encoding, di mana masing-masing karakter dikodekan sebagai nilai 16-bit. UTF-16 karakter yang disebut karakter lebar, untuk membedakan mereka dari 8-bit karakter ANSI. Visual C ++ compiler mendukung wchar_t built-in tipe data untuk karakter lebar. File header WinNT.h juga mendefinisikan typedef berikut.
typedef wchar_t WCHAR;
Anda akan melihat kedua versi di MSDN kode contoh. Untuk menyatakan lebar-karakter literal maupun string lebar karakter literal, menempatkan L sebelum literal.
wchar_t a = L'a'; wchar_t *str = L"hello";
Berikut adalah beberapa typedef-string terkait lainnya yang akan Anda lihat:
Typedef | Definition |
---|---|
CHAR | char |
PSTR or LPSTR | char* |
PCSTR or LPCSTR | const char* |
PWSTR or LPWSTR | wchar_t* |
PCWSTR or LPCWSTR | const wchar_t* |
Unicode and ANSI Functions
Ketika Microsoft memperkenalkan dukungan Unicode untuk Windows, itu memudahkan transisi dengan menyediakan dua set paralel API, satu untuk ANSI string dan yang lainnya untuk Unicode string. Sebagai contoh, ada dua fungsi untuk mengatur teks judul bar jendela:
- SetWindowTextA takes an ANSI string.
- SetWindowTextW takes a Unicode string.
#ifdef UNICODE #define SetWindowText SetWindowTextW #else #define SetWindowText SetWindowTextA #endif
Di MSDN, fungsi ini didokumentasikan dengan nama SetWindowText, meskipun itu benar-benar nama makro, bukan nama fungsi sebenarnya.
Aplikasi baru harus selalu memanggil versi Unicode. Banyak bahasa dunia membutuhkan Unicode. Jika Anda menggunakan ANSI string, maka akan mustahil untuk melokalisasi aplikasi Anda. ANSI versi juga kurang efisien, karena sistem operasi harus mengubah string ANSI ke Unicode pada waktu berjalan. Tergantung pada preferensi Anda, Anda dapat memanggil fungsi Unicode secara eksplisit, seperti SetWindowText, atau gunakan macro. Contoh kode di MSDN biasanya memanggil macro, tetapi dua bentuk yang persis sama. Kebanyakan API baru pada Windows hanya memiliki versi Unicode, dengan tidak ada versi ANSI sesuai.
TCHARs
Kembali ketika aplikasi yang dibutuhkan untuk mendukung Windows NT serta Windows 95, Windows 98, dan Windows Me, itu berguna untuk mengkompilasi kode yang sama baik untuk ANSI maupun Unicode string, tergantung pada platform target. Untuk tujuan ini, Windows SDK menyediakan macro yang memetakan string Unicode ke maupun ANSI, tergantung pada platform.
Sebagai contoh, kode berikut:
SetWindowText(TEXT("My Application"));
resolve ke salah satu dari berikut:
SetWindowTextW(L"My Application"); // Unicode function with wide-character string. SetWindowTextA("My Application"); // ANSI function.
TEXT dan CHAR macro kurang berguna hari ini, karena semua aplikasi harus menggunakan Unicode. Namun, Anda mungkin melihat mereka dalam kode yang lebih tua dan dalam beberapa contoh kode MSDN.
Header untuk Microsoft C run-time perpustakaan mendefinisikan satu set sama macro. Misalnya, _tcslen resolve ke strlen jika _UNICODE tidak terdefinisi; selain itu itu resolve ke wcslen, yang merupakan versi lebar-karakter strlen.
#ifdef _UNICODE #define _tcslen wcslen #else #define _tcslen strlen #endif
Hati-hati: Beberapa header menggunakan simbol preprocessor UNICODE, yang lain menggunakan _UNICODE dengan LP garis bawah. Selalu mendefinisikan kedua simbol. Visual C ++ menetapkan mereka berdua secara default ketika Anda membuat proyek baru.
What Is a Window?
Jelas sekali, jendela adalah pusat untuk Windows. Mereka begitu penting bahwa mereka bernama sistem operasi setelah mereka. Tapi apa jendela? Ketika Anda memikirkan jendela, Anda mungkin memikirkan sesuatu seperti ini:
Screenshot dari sebuah jendela aplikasi
Jendela aplikasi memiliki jendela dialog, dan jendela dialog adalah induk dari kedua window tombol. Diagram berikut menunjukkan hubungan ini:
Window Handles
Windows adalah objek - mereka memiliki kedua kode dan data - tetapi mereka bukan C ++ kelas. Sebaliknya, program merujuk jendela dengan menggunakan nilai yang disebut handle. Sebuah handle adalah jenis buram. Pada dasarnya, handle hanya angka yang menggunakan sistem operasi untuk mengidentifikasi obyek. Anda dapat membayangkan Windows sebagai memiliki tabel besar dari semua windows yang telah dibuat. Menggunakan tabel ini untuk mencari jendela dengan menangani mereka. (Apakah itulah cara kerjanya secara internal tidak penting.) Tipe data untuk jendela menangani adalah HWND, yang biasanya diucapkan "aitch-angin." Jendela menangani dikembalikan oleh fungsi yang membuat jendela: CreateWindow dan CreateWindowEx.
Untuk melakukan operasi pada jendela, Anda biasanya akan memanggil beberapa fungsi yang mengambil nilai HWND sebagai parameter. Misalnya, untuk memposisikan jendela pada layar, memanggil fungsi MoveWindow:
BOOL MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint);
Parameter pertama adalah handle ke jendela yang ingin Anda pindah. Parameter lain menentukan lokasi baru jendela dan apakah jendela harus digambar ulang.'
Perlu diingat bahwa menangani tidak pointer. Jika hwnd adalah variabel yang berisi handle, mencoba untuk dereference pegangan dengan menulis * hwnd adalah kesalahan.
Layar dan Jendela Koordinat
Tergantung pada tugas Anda, Anda mungkin mengukur koordinat relatif terhadap layar, relatif terhadap jendela (termasuk frame), atau relatif ke area klien jendela. Misalnya, Anda akan memposisikan jendela pada layar menggunakan koordinat layar, tetapi Anda akan menarik dalam jendela menggunakan koordinat klien. Dalam setiap kasus, origin (0, 0) selalu sudut kiri atas wilayah tersebut.
Ilustrasi menunjukkan koordinat layar, jendela, dan klien
WinMain: The Entry Point Aplikasi
Setiap program Windows mencakup fungsi entry-titik yang diberi nama baik WinMain atau wWinMain. Berikut adalah tanda untuk WinMain.
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow);
- HINSTANCE adalah sesuatu yang disebut "handle ke sebuah contoh" maupun "handle untuk modul." Sistem operasi menggunakan nilai ini untuk mengidentifikasi executable (EXE) bila dimuat dalam memori. Contoh handle diperlukan untuk fungsi Windows tertentu - misalnya, untuk memuat ikon atau bitmap.
- hPrevInstance tidak memiliki makna. Itu digunakan di 16-bit Windows, tetapi sekarang selalu nol.
- pCmdLine berisi argumen baris perintah sebagai string Unicode.
- nCmdShow adalah bendera yang mengatakan apakah jendela aplikasi utama akan diminimalkan, dimaksimalkan, maupun ditampilkan secara normal.
WINAPI adalah konvensi pemanggilan. Sebuah konvensi memanggil mendefinisikan bagaimana fungsi menerima parameter dari penelepon. Sebagai contoh, mendefinisikan agar parameter muncul di stack. Hanya pastikan untuk menyatakan fungsi wWinMain Anda seperti yang ditunjukkan.
Fungsi winmain identik dengan wWinMain, kecuali argumen baris perintah yang lulus sebagai string ANSI. Versi Unicode lebih disukai. Anda dapat menggunakan fungsi ANSI winmain bahkan jika Anda mengkompilasi program Anda sebagai Unicode. Untuk mendapatkan salinan Unicode argumen baris perintah, memanggil fungsi GetCommandLine. Fungsi ini mengembalikan semua argumen dalam string tunggal. Jika Anda ingin argumen sebagai array argv-gaya, lulus string ini ke CommandLineToArgvW.
Bagaimana compiler tahu memanggil wWinMain bukannya fungsi utama standar? Apa yang sebenarnya terjadi adalah bahwa runtime library Microsoft C (CRT) menyediakan implementasi dari utama yang memanggil baik WinMain atau wWinMain.
Berikut adalah fungsi winmain kosong.
INT WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, INT nCmdShow) { return 0; }
Sekarang bahwa Anda memiliki entry point dan mengerti beberapa terminologi dasar dan coding konvensi, Anda siap untuk membuat program Window lengkap.
Module 1. Your First Windows Program
Here is the complete code for the program:
No comments:
Post a Comment