Tutorial on Win32 Programming Series – Getting Started (Seri 1)

Aplikasi Berbasis Win32 ? 

Mungkin sebagian orang tidak tahu apa itu aplikasi win32 ? ya..ya..ya, semua aplikasi Windows sebagian besar aplikasi Win32 karena memang mengarah ke 32-bit operation. Itu tidak salah tetapi hal yang dikatakan aplikasi Win32 apabila aplikasi tersebut menggunakn PURE WIN32 API sehingga code dari aplikasi tersebut langsung mengakses API dari OS Windows tersebut sehingga deployment dari aplikasi Win32 tidak memerlukan library/framework lain akibatnya ukuran file nya kecil dan performance jauh lebih bagus. 

Skill Yang Dibutuhkan
Ok, untuk mempelajari pemrograman Win32 application diperlukan skill yang mendasar yaitu (urutan paling atas lebih penting daripada dibawah)

  1. Pemrograman C. Ini wajib dan kalau anda belum bisa bahasa C, mendingan belajar dulu. Banyak buku baik bahasa Indonesia ataupun inggris yang membahas pemrograman bahasa C. PE College juga menyediakan video tutorial , bisa di cek http://www.pecollege.net/
  2. Windows Message. Ini perlu diketahui walaupun tidak perlu dihafal, lama2x hafal sendiri. Kenapa ini perlu? Karena kita harus mengetahui alur-alur command yang terjadi pada OS Windows
  3. Pemrograman C++. Ini optional, jika bisa ini akan mempermudah anda dalam manage object anda dan juga dapat menerapkan full OOP.

IDE yang Digunakan
Banyak IDE untuk C/C++ yang dapat digunakan untuk coding Win32 application. Salah satunya anda bisa menggunakan Visual C++ dari merupakan bagian dari Visual Studio.

Hello World Win32
Biar lebih mantap, kita langsung ke demo. Disini gw menggunakan Visual Studio 2005. Pada IDE ini, buat project dengan tipe Visual C++ dan template Win32 Project seperti gambar dibawah ini


Beri nama dan lokasi untuk project ini, misalkan disini MyFirstWin32App. Jika selesai, klik tombol Ok sehingga akan muncul kotak dialog dibawah ini. Pilih opsi seperti gambar.

 

Setelah itu klik tombol Finish. Selesai deh!!....tinggal run saja dengan klik tombol F5 dan boommm, muncul deh aplikasi kita

 

Membedah Hello World Win32 Application
Kalau kita melihat di solution explorer maka kita akan mendapatkan seperti gambar dibawah ini

Sedangkan Entry point kita ad adi file MyFirstWin32App.cpp yang code nya dapat dilihat disini:

// Global Variables:

HINSTANCE hInst;                                // current instance

TCHAR szTitle[MAX_LOADSTRING];                    // The title bar text

TCHAR szWindowClass[MAX_LOADSTRING];            // the main window class name

 

// Forward declarations of functions included in this code module:

ATOM                MyRegisterClass(HINSTANCE hInstance);

BOOL                InitInstance(HINSTANCE, int);

LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);

INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

 

int APIENTRY _tWinMain(HINSTANCE hInstance,

                    HINSTANCE hPrevInstance,

                    LPTSTR    lpCmdLine,

                    int       nCmdShow)

{

    UNREFERENCED_PARAMETER(hPrevInstance);

    UNREFERENCED_PARAMETER(lpCmdLine);

 

    // TODO: Place code here.

    MSG msg;

    HACCEL hAccelTable;

 

    // Initialize global strings

    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);

    LoadString(hInstance, IDC_MYFIRSTWIN32APP, szWindowClass, MAX_LOADSTRING);

    MyRegisterClass(hInstance);

 

    // Perform application initialization:

    if (!InitInstance (hInstance, nCmdShow))

    {

        return FALSE;

    }

 

    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MYFIRSTWIN32APP));

 

    // Main message loop:

    while (GetMessage(&msg, NULL, 0, 0))

    {

        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))

        {

            TranslateMessage(&msg);

            DispatchMessage(&msg);

        }

    }

 

    return (int) msg.wParam;

}

Ok, apa yang terjadi di Entry Point ini ? Let’s start….Awalnya kita deklarasikan global variable instance untuk aplikasi windows kita

HINSTANCE hInst;

Selanjutnya kita lakukan initialisasi data dan juga object windows kita, ingat OS Windows dibangun dengan menerapkan OO sehingga apa yang kita buat mesti inline dengan architecture OS Windows.

// Initialize global strings

LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);

LoadString(hInstance, IDC_MYFIRSTWIN32APP, szWindowClass, MAX_LOADSTRING);

MyRegisterClass(hInstance);

Diatas tertulis pemanggilan MyRegisterClass() yang fungsinya untuk register object windows kita. Didalam function ini kita menentukan fitur-fitur windows dialog kita 

WNDCLASSEX wcex;

 

wcex.cbSize = sizeof(WNDCLASSEX);

 

wcex.style            = CS_HREDRAW | CS_VREDRAW;

wcex.lpfnWndProc    = WndProc;

wcex.cbClsExtra        = 0;

wcex.cbWndExtra        = 0;

wcex.hInstance        = hInstance;

wcex.hIcon            = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYFIRSTWIN32APP));

wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);

wcex.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);

wcex.lpszMenuName    = MAKEINTRESOURCE(IDC_MYFIRSTWIN32APP);

wcex.lpszClassName    = szWindowClass;

wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

Hal yang terpenting dari register object windows kita adalah dibagian wcex.lpfnWndProc = WndProc; dimana WndProc merupakan callback function yang akan menerima Windows Message yang dikirim oleh OS Windows ke aplikasi kita. Call function WndProc dideklarasikan sebagai berikut

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

    int wmId, wmEvent;

    PAINTSTRUCT ps;

    HDC hdc;

 

    switch (message)

    {

    case WM_COMMAND:

        wmId    = LOWORD(wParam);

        wmEvent = HIWORD(wParam);

        // Parse the menu selections:

        switch (wmId)

        {

        case IDM_ABOUT:

            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);

            break;

        case IDM_EXIT:

            DestroyWindow(hWnd);

            break;

        default:

            return DefWindowProc(hWnd, message, wParam, lParam);

        }

        break;

    case WM_PAINT:

        hdc = BeginPaint(hWnd, &ps);

        // TODO: Add any drawing code here...

        EndPaint(hWnd, &ps);

        break;

    case WM_DESTROY:

        PostQuitMessage(0);

        break;

    default:

        return DefWindowProc(hWnd, message, wParam, lParam);

    }

    return 0;

}

Parameter passing message menunjukkan nilai dari Windows Message. Disini tergantung dari kita mau menangani Windows Message apa saja. Yang wajib ada adalah WM_PAINT untuk drawing windows dialog dan juga WM_DESTROY untuk keluar dari aplikasi.

Setelah kita deklarasikan object windows maka kita lakukan register dengan menggunakan API RegisterClassEx()

RegisterClassEx(&wcex);

Object windows kita sudah di register terus selanjutnya baru kita kita buat windowsnya

HWND hWnd;

 

hInst = hInstance; // Store instance handle in our global variable

 

hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,

   CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

Sedangkan untuk mengaktifkan/menampilkan windowsnya cukup kita panggil ShowWindow()

ShowWindow(hWnd, nCmdShow);

UpdateWindow(hWnd);

Supaya aplikasi kita tidak keluar dari entry point maka kita lakukan looping dan sekalian menerima Windows Message kita 

// Main message loop:

while (GetMessage(&msg, NULL, 0, 0))

{

    if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))

    {

        TranslateMessage(&msg);

        DispatchMessage(&msg);

    }

}

Kalau diperhatikan aplikasi windows kita terlihat ada menu Help->About, nah untuk memanggil kotak dialog About cukup panggil dengan method DialogBox() yang dipanggil ketika meneriman windows message WM_COMMAND dengan menu id IDM_ABOUT (ini tergantung dari deklarasi menu  Help->About)

case IDM_ABOUT:

    DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);

    break;

Pada DialogBox(), kita lakukan passing callback function yaitu About() untuk menerima windows message yang dideklarasikan sebagai berikut

INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)

{

    UNREFERENCED_PARAMETER(lParam);

    switch (message)

    {

    case WM_INITDIALOG:

        return (INT_PTR)TRUE;

 

    case WM_COMMAND:

        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)

        {

            EndDialog(hDlg, LOWORD(wParam));

            return (INT_PTR)TRUE;

        }

        break;

    }

    return (INT_PTR)FALSE;

}

Itu aja sebagai perkenalan aplikasi Win32, next kita akan bekerja dengan Dialog Form dan meng-handle windows message yang terjadi..kalau ada hal yang ditanyakan saja posting disini..see you

Source code aplikasinya dapat didownload dibawah ini

 

Share this post: | | | |
Published Tuesday, December 04, 2007 3:33 PM by Agus Kurniawan
Filed under: ,

Comments

# re: Tutorial on Win32 Programming Series – Getting Started (Seri 1)

Tuesday, December 04, 2007 4:09 PM by Agus Kurniawan

Guys, seberapa banyak aplikasi yang dibuat dengan Pure Win32 API ? dan kebanyakan keperluan apa?

Mungkin disini bisa sharing

# re: Tutorial on Win32 Programming Series – Getting Started (Seri 1)

Tuesday, December 04, 2007 8:15 PM by Edward

Sepengetahuan saya kebanyakan aplikasi2 yang digunakan untuk parallel/real-time processing, menggunakan pure win32 socket API. Untuk Win32 di UI programming sepertinya lebih banyak menggunakan MFC. Selain untuk itu, OpenGL/directX based applications banyak juga menggunakan pure Win32 API selain untuk graphic atau event manipulationnya. Development dengan Windows CE juga menggunakan SDK yang menyerupai win32 API, walaupun ada berbagai perbedaan esensial(internal) antara keduanya, sepertinya halnya event click di desktop dengan di mobile/embedded device.

# re: Tutorial on Win32 Programming Series – Getting Started (Seri 1)

Wednesday, December 05, 2007 4:59 AM by arnoldwiliem

Aku selalu membuat pure win32API dan sedikit ATL klo butuh COM object.

lebih manageable aja sih dalam arti nga usah load library gede2x...

# re: Tutorial on Win32 Programming Series – Getting Started (Seri 1)

Wednesday, December 05, 2007 12:25 PM by zeddy

Games!

# re: Tutorial on Win32 Programming Series – Getting Started (Seri 1)

Thursday, December 06, 2007 1:04 AM by Edward Chitrahadi

surely, games =)

# re: Tutorial on Win32 Programming Series – Getting Started (Seri 1)

Sunday, January 27, 2008 8:41 AM by adhiguna mahendra

Computer Vision, Games, robotics, contohnya saya membangun robotics application dengan platform Festo Robotino dengan Visual C++.Net, abisnya di example demo programnya cuman pake Pure Win32 API visual c++ sih:)  

www.festo-didactic.com/ov3/media/customers/1100/article_robotino.pdf

Computer Vision juga library-library yang stabil kebanyakan buat pure win32 API C++ misal Opencv, VXL atau Roborealm.

Kalau game jangan tanya lagi deh..

Leave a Comment

(required) 
(required) 
(optional)
(required) 

Enter the numbers above:
Powered by Community Server (Commercial Edition), by Telligent Systems