Gamedev-id Tutorial #0002, Last reviewed : 25 Apr 2002

Membuat Program Windows Sederhana


Tutorial ini akan menjelaskan konsep dan langkah awal untuk membuat sebuah window.



Source code & Executable: tut0002.zip (11 kb)
Syarat: C/C++ Compiler for Windows (Rekomendasi: Visual C++)


Daftar Isi:
1. Windows Header

2. Entry Point
3. Message Box
4. Window Procedure
5. Window Class ( Register, Create, dan Show )
6. Message Loop
7. Akhir


1. Windows Header

Kita mulai dengan membuat sebuah file kosong dengan nama: main.cpp.

Setelah itu, hal pertama yang harus dilakukan adalah memasukkan header "windows.h" ke program. Header ini merangkum semua hal-hal penting yang akan dibutuhkan untuk membangun sebuah program Windows.

#include "windows.h"


2. Entry Point

Seperti program lain yang memiliki sebuah fungsi wajib seperti main() pada C/C++ standar atau Begin ... End. pada Pascal, maka untuk Windows pun memiliki entry point yaitu WinMain.

Fungsi tersebut memiliki bentuk sebagai berikut:

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow ) {
return 0;
}

Dengan menambahkan header dan entry point di atas, program sudah bisa di-compile dan dijalankan meski tidak melakukan apa-apa, sehingga tidak akan terasa oleh user.

Simbol-simbol yang terdapat pada fungsi tersebut didefinisikan melalui header windows.h. Arti dari simbol dan variabel di atas sebagai berikut:
- WINAPI merupakan standar cara pemanggilan fungsi

- HINSTANCE Setiap program dalam Windows memiliki instance, yaitu semacam pengidentifikasi setiap program. Dalam fungsi di atas, instance program yang sedang berjalan dan ke instance sebelumnya apabila ada, yaitu ketika program yang sama sedang dijalankan pada saat dipanggil lagi. Mengecek hal ini bisa mencegah 2 program yang sama berjalan bersamaan.

- LPSTR, pointer to string, menunjuk ke argumen yang diberikan ke program yang sedang dijalankan, contoh: loadBMP "gambar001.jpg", maka variabel ini akan berisi gambar001.jpg.

- nCmdShow, menentukan posisi windows pada saat awal.


3. Message Box

Untuk mengetes program dapat disisipkan MessageBox untuk mengetahui bahwa program berjalan dengan baik.

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow ) {
MessageBox(0, "Hello World", "MessageBox", MB_OK);
return 0;
}

Program di atas akan memunculkan Message Box dengan tulisan Hello World, judul dialog MessageBox dan sebuah tombol OK. Setelah di-click program akan me-return nilai 0 dan selesai.


4. Window Procedure

Windows merupakan operating system yang berbasiskan pesan atau message. Maka setiap program yang dibuat di lingkungan Windows harus bisa mnerima pesan. Penerimaan pesan ini dilakukan oleh sebuah fungsi dengan format yang sudah ditentukan oleh Windows. Bentuk fungsi tersebut beserta isinya seperti di bawah ini untuk ditambahkan ke dalam kode (Catatan: letakkan sebelum WinMain):

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_DESTROY: { PostQuitMessage(0); return 0L; }
         default:
             return DefWindowProc(hWnd, message, wParam, lParam);
    }
}

Kita bisa lihat fungsi di atas memiliki 4 parameter. hWnd merupakan handle atau penunjuk ke window yang memanggil pesan ini, kemudian message merupakan pesan itu sendiri disertai 2 buah parameter yang menyertai message tersebut. Kode wajib di atas akan mengecek pesan yang masuk, a[pabila WM_DESTROY (Windows ditutup) maka akan program akan memanggil fungsi yang menyebabkan program ini ditutup dengan benar yaitu PostQuitMessage(). Pesan di luar itu diabaikan atau menggunakan standar fungsi Windows (DefWindowProc).

Setelah fungsi ini siap maka akan dicoba untuk membuat sebuah window sederhana.


5. Window Class ( Register, Create, dan Show )

Sekarang akan diisikan kode-kode yang dibutuhkan untuk membuat windows ke dalam fungsi WinMain.

5a. Register

Semua windows dalam suatu program memiliki apa yang dinamakan window class. Semua class ini dikenal oleh sistem sehingga bisa ditangani untuk ditampilkan, dan sebagainya.
Agar program yang kita buat dikenal oleh sistem maka kita harus memberitahu sistem dengan cara mendaftarkannya (register) dan kemudian membuatnya (create).

Sebelumnya kita buang baris yang menampilkan MessageBox di atas dan kita mulai dengan memasukkan kode baru dimulai dari potongan di bawah ini yang bertugas mendaftarkan sebuah class:

    WNDCLASS wndclass;
char* szAppName = "WinApp";


// Create the classes wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; if (!RegisterClass(&wndclass)) { MessageBox(NULL, "Registering window failed", "Hello World",0); return -1; }

5b. Create

Untuk mendaftarkan sebuah kelas kita cukup mengisikan data-data yang dieperlukan ke dalam sebuah struktur WNDCLASS (sudah didefinisikan oleh Windows). Data termasuk nama class (lpszClassName), tingkah laku windows (style), instance saat ini (hInstance), tampilan dan resources yang akan digunakan (hIcon, hCursor, hbrBackground, dan lpszMenuName), pengatur pesan/messages yang diterima Windows (lpfnWndProc) dan beberapa info lain yang biasanya diisi 0.

Setelah data siap maka digunakan sebagai parameter pada RegisterClass().

Setelah class dari program ini dikenal maka sekarang saatnya untuk dibuat window-nya:

	HWND hWnd = 0;

hWnd = CreateWindowEx( 0,
szAppName,
"Basic Windows Framework",
WS_OVERLAPPED | WS_CAPTION |
WS_SYSMENU | WS_MINIMIZEBOX,
CW_USEDEFAULT,
CW_USEDEFAULT,
640,
480,
NULL,
NULL,
hInstance,
NULL );
    if (!hWnd)
    {
         MessageBox(NULL, "Creating window failed", "Program", 0);
         return -1;
    }

Kode di atas membuat window dengan urutan parameter yang penting:
ke-2: nama class, sesuai dengan yang diregister.
ke-3, judul window, nama yang muncul di titlebar.
ke-4, gaya yang mempengaruhi tampilan window.
ke-5,6, posisi awal window, menggunakan posisi default.
ke 7,8, ukuran window.
ke 11, instance dari program ini.
sisanya tidak begitu penting pada umumnya terutama saat ini.

Apabila sukses maka akan dikembalikan penunjuk berupa handle ke window tersebut.


5c. Show

Sekarang window siap untuk ditampilkan dengan memanggil 2 fungsi di bawah ini:

	ShowWindow(hWnd, nCmdShow);
	UpdateWindow(hWnd);


Dari ketiga potongan di atas, dan apabila dijalankan maka akan muncul sebuah window seperti yang dideskripsikan melalui register dan create.
Satu pertanyaan yang timbul adalah kenapa window yang mucul hanya sebentar untuk kemudian menghilang lagi dan selesai?


6. Message Loop

Hal ini dikarenakan setelah ShowWindow dan UpdateWindow, program mencapai akhir program sehingga keluar. Sekarang merupakan tugas kita untuk menjaga program tetap hidup.

Salah satu cara adalah dengan melakukan loop tak terhingga.
Kelemahan cara ini adalah proses terhenti pada loop ini (hang) dan program justru tidak bisa melakukan apa-apa. Maka dari itu loop harus berkomunikasi dengan sistem yang mana adalah Windows melalui message. Dengan cara ini loop bisa selalu memeriksa pesan yang ada, apabila ada pesan berhenti maka loop akan bisa menghentikan putarannya.

	MSG  msg;

while(1)
{ if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if(msg.message == WM_QUIT) break; TranslateMessage(&msg); DispatchMessage(&msg); } else { //put something here } }

return msg.wParam;

n msg.wParam;

Potongan kode di atas melakukan loop tak terhingga ( while(1) ). Loop tersebut di dalamnya selalu mengecek pesan-pesan yang ada untuk kemudian di Dispatch ke WndProc. Salah satu pesan penting adalah WM_QUIT, apabila pesan itu diterima maka loop akan tahu bahwa program menerima permintaan untuk keluar dan akan keluar dari loop (break) dan mengembalikan suatu nilai. Kode di atas menggunakan nilai dari message yang diterima.

Pada blok "// put something here" kita dapat meletakkan perintah-perintah untuk dijalankan selama tidak ada pesan masuk.


7. Akhir

Dari program di atas maka akan bisa ditampilkan sebuah window sederhana yang menjadi rangka dari program-program selanjutnya.



back to Gamedev-id Tutorial

©2002,
[email protected].