Sunday 10 January 2016

https://msdn.microsoft.com/en-us/library/windows/desktop/ff381399%28v=vs.85%29.aspx

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.

Data typeSizeSigned?
BYTE8 bits Unsigned
DWORD32 bitsUnsigned
INT3232 bitsSigned
INT6464 bitsSigned
LONG32 bitsSigned
LONGLONG64 bitsSigned
UINT3232 bitsUnsigned
UINT6464 bitsUnsigned
ULONG32 bitsUnsigned
ULONGLONG64 bitsUnsigned
WORD16 bitsUnsigned

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     1 

Meskipun 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

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.)
  • DWORD_PTR
  • INT_PTR
  • LONG_PTR
  • ULONG_PTR
  • UINT_PTR
Jenis ini digunakan dalam situasi di mana integer mungkin akan dilemparkan ke pointer. Mereka juga digunakan untuk mendefinisikan variabel untuk pointer aritmatika dan untuk menentukan lingkaran counter yang iterate atas berbagai byte dalam buffer memori. Lebih umum, mereka muncul di tempat-tempat yang ada nilai 32-bit diperluas ke 64 bit pada 64-bit Windows.

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
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.

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:
TypedefDefinition
CHARchar
PSTR or LPSTRchar*
PCSTR or LPCSTRconst char*
PWSTR or LPWSTRwchar_t*
PCWSTR or LPCWSTRconst 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:
 
Screen shot of an application window

Screenshot dari sebuah jendela aplikasi
 
Jendela aplikasi memiliki jendela dialog, dan jendela dialog adalah induk dari kedua window tombol. Diagram berikut menunjukkan hubungan ini:
 
Illustration showing parent/child and owner/owned relations 

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

Koordinat diukur dalam pixel perangkat-independen. Kami akan memiliki lebih banyak berbicara tentang perangkat bagian independen dari piksel perangkat-independen ketika kita membahas grafis.
 
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.
 
Illustration showing screen, window, and client coordinates  
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.
Fungsi mengembalikan nilai int. Kemudian kembali nilai tidak digunakan oleh sistem operasi, tetapi Anda dapat menggunakan nilai kembali untuk menyampaikan kode status ke program lain yang Anda tulis.
 
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

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.
 
Screen shot of the example program 
 
Here is the complete code for the program:

 
 

Integer types

 




No comments:

Post a Comment