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