SendMessage

Kita akan belajar untuk menggunakan SendMessage untuk mengubah dan mendapatkan isi dari teks yang bisa berupa berupa static text, textbox, atau caption dari window maupun tombol. Function SendMessage digunakan untuk mengirim pesan kepada window bahwa suatu event telah terjadi. Urutan parameter dari SendMessage sama dengan function yang digunakan untuk callback. Parameter pertama dari SendMessage adalah" handle" dari window, dan parameter keduanya berisi message yang akan dikirim tergantung jenis eventnya. Parameter ketiga dan keempat adalah wparam dan lparam yang berisi data tertentu sesuai jenis eventnya.

Berikut ini adalah dua "window message" yang akan kita gunakan dalam SendMessage.
  1. WM_GETTEXT : Untuk mendapatkan isi text.
  2. WM_SETTEXT : Untuk mengubah isi text.
SendMessage yang menggunakan WM_SETTEXT dan WM_GETTEXT datanya ada pada parameter ke-4 yang tipenya LPARAM. kita perlu menggunakan type casting untuk menyesuaikan tipe data dari variabel yang dikirim. Untuk lebih jelasnya, coba salin dan build atau compile kode program di bawah ini!

#include <windows.h>
#include <string.h>

#define nkolom 4
#define nbaris 5
#define tombol_AC 200
#define tombol_BS 202

HWND tulisan;
char stombol[24][5]={"AC", "C", "<=", "+", "1", "2", "3", "-", "4", "5", "6", "x", "7", "8", "9", "/", "+/-", ",", "0", "="};

LRESULT CALLBACK wndproc(
  HWND hwnd,
  UINT pesan,
  WPARAM wParam,
  LPARAM lParam
);


int __stdcall WinMain(HINSTANCE hinst, HINSTANCE hprev, char *cmdl, int cmds){
HWND wind;
MSG msg;
WNDCLASS wcls={0};
int i, x, y;
    wcls.hInstance=hinst;
    wcls.hbrBackground=GetSysColorBrush(COLOR_3DFACE);
    wcls.lpszClassName=TEXT("windowku");
    wcls.lpfnWndProc=wndproc;
    wcls.hCursor=LoadCursor(0,IDC_ARROW);

    RegisterClass(&wcls);


    wind=CreateWindowEx(0, TEXT("windowku"), "Programku", WS_VISIBLE | WS_OVERLAPPEDWINDOW , 400, 200, 198, 290, 0, 0, hinst, 0);

    //Buat textbox, static text dan tombol
    tulisan=CreateWindowEx(WS_EX_RIGHT, TEXT("STATIC"), "0", WS_CHILD | WS_VISIBLE, 4, 4, 174, 24, wind, 0, hinst, 0);
    for(y=0;y<nbaris;y++)
        for(x=0;x<nkolom;x++){
            i=y*nkolom+x;
            CreateWindow(TEXT("BUTTON"), stombol[i], WS_CHILD | WS_VISIBLE, 4+(x*44), 32+(y*44), 40, 40, wind, (HMENU)(200+i), hinst, 0);
        }

    while(GetMessage(&msg, NULL, 0, 0)){
        DispatchMessage(&msg);
        TranslateMessage(&msg);
    }

    return msg.wParam;
}


LRESULT CALLBACK wndproc(HWND hwnd, UINT pesan, WPARAM wParam, LPARAM lParam){
int x;
char s[20]="", *t;
    switch(pesan){
        case WM_COMMAND:
            x=LOWORD(wParam);
            if(x>203 && x<220){
                t=stombol[x-200];
                if(strlen(t)==1 && t[0]>='0' && t[0]<='9'){
                    SendMessage(tulisan, WM_GETTEXT, 20, (LPARAM)s);
                    if(s[0]!='0')strcat(s, stombol[x-200]);
                    else strcpy(s, stombol[x-200]);
                    SendMessage(tulisan, WM_SETTEXT, 0, (LPARAM)s);
                }
            }else{
                switch(x){
                    case tombol_BS :
                        SendMessage(tulisan, WM_GETTEXT, 20, (LPARAM)s);
                        if(s[1]!=0)s[strlen(s)-1]=0;
                        else{
                            s[0]='0';
                            s[1]=0;
                        }
                        SendMessage(tulisan, WM_SETTEXT, 0, (LPARAM)s);
                        break;
                    case tombol_AC:
                        s[0]='0';
                        s[1]=0;
                        SendMessage(tulisan, WM_SETTEXT, 0, (LPARAM)s);
                        break;
                }
            }
            break;
        case WM_CLOSE:
            PostQuitMessage(0);
            break;

    }

    return DefWindowProc(hwnd, pesan, wParam, lParam);
};


Setelah selesai mengetik atau menyalin kode program di atas, coba build atau compile dan jalankan!
Saya tidak perlu memberitahu lagi cara melakukannya karena sudah saya tulis di tulisan saya sebelumnya.


SendMessage yang menggunakan WM_SETTEXT bisa diganti dengan SetWindowText. "SendMessage(tulisan, WM_SETTEXT, 0, (LPARAM)s);" akan menyalin isi dari variabel s ke textbox yang menggunakan tulisan sebagai handle-nya. Type casting dibutuhkan karena tipe data dari variabel s yang sebenarnya adalah array of char.


SendMessage yang menggunakan WM_GETTEXT bisa diganti dengan GetWindowText. Kode program di atas bisa kalian ubah menjadi seperti di bawah ini. "SendMessage(tulisan, WM_GETTEXT, 20, (LPARAM)s);" akan menyalin isi dari textbox yang menggunakan tulisan sebagai handle-nya ke variabel s sebanyak "20 karakter atau kurang".


#include <windows.h>
#include <string.h>

#define nkolom 4
#define nbaris 5
#define tombol_AC 200
#define tombol_BS 202

HWND tulisan;
char stombol[24][5]={"AC", "C", "<=", "+", "1", "2", "3", "-", "4", "5", "6", "x", "7", "8", "9", "/", "+/-", ",", "0", "="};

LRESULT CALLBACK wndproc(
  HWND hwnd,
  UINT pesan,
  WPARAM wParam,
  LPARAM lParam
);

int __stdcall WinMain(HINSTANCE hinst, HINSTANCE hprev, char *cmdl, int cmds){
HWND wind;
MSG msg;
WNDCLASS wcls={0};
int i, x, y;
    wcls.hInstance=hinst;
    wcls.hbrBackground=GetSysColorBrush(COLOR_3DFACE);
    wcls.lpszClassName=TEXT("windowku");
    wcls.lpfnWndProc=wndproc;
    wcls.hCursor=LoadCursor(0,IDC_ARROW);

    RegisterClass(&wcls);


    wind=CreateWindowEx(0, TEXT("windowku"), "Programku", WS_VISIBLE | WS_OVERLAPPEDWINDOW , 400, 200, 198, 290, 0, 0, hinst, 0);

    //Buat textbox, static text dan tombol
    tulisan=CreateWindowEx(WS_EX_RIGHT, TEXT("STATIC"), "0", WS_CHILD | WS_VISIBLE, 4, 4, 174, 24, wind, 0, hinst, 0);
    for(y=0;y<nbaris;y++)
        for(x=0;x<nkolom;x++){
            i=y*nkolom+x;
            CreateWindow(TEXT("BUTTON"), stombol[i], WS_CHILD | WS_VISIBLE, 4+(x*44), 32+(y*44), 40, 40, wind, (HMENU)(200+i), hinst, 0);
        }

    while(GetMessage(&msg, NULL, 0, 0)){
        DispatchMessage(&msg);
        TranslateMessage(&msg);
    }

    return msg.wParam;
}


Coba jalankan! seharusnya isinya tetap sama.