C++ ÇOKLU BUTTON, TEXTBOX VE LABEL
C++ ile Windows form oluşturma ve TextBox, Button ve label eklemek. Bir pencerede birden fazla button oluşturarak bunlara komut vermek. C++ ile toplama, çıkarma, çarpma ve bölme işlemleri.
Daha önceki derslerimizden birinde C++ ile Windows form oluşturmayı göstermiştik. O yazıda 2 adet textboxa girilen değerler toplanarak sonuç 3. textboxta gösteriliyordu. Bu yazı Windows formlarına giriş niteliğinde idi.
Bazı ziyaretçilerin aynı formda çıkarma, çarpma, bölme vb. işlemleri ayrı buttonlar ile yapmaya çalışıp yapamadıklarını belirtmeleri ve aynı zamanda o yazının biraz amatörce kalması nedeniyle daha gelişmiş bir örnek yapmaya karar verdik.
Bu derste 4 adet button, 3 adet label ve 3 adet textbox olacak. Her button bir işlem yapacak. Bu işlemler; toplama, çıkarma, çarpma ve bölme işlemleridir.
Uygulamayı yine DEV C++ ile yaptık. Ücretsiz olması ve her platformda çalışması nedeniyle örnekleri DEV C++ ile vermeye devam edeceğiz.
C++ ile Windows form oluşturma kodlarının açıklaması çok uzun sürmektedir. Neredeyse her satırı bir derslik açıklama gerektirecek bu kodların açıklamasını yapmayacağız. Ancak talep olursa ya da fırsatımız olursa ileride bir ders dizisi olarak düşünebiliriz.

Şimdi özet şeklinde kontrolleri oluşturmamız ile ilgili bilgi verelim.
Aşağıda kullandığımız kontrollerin benzersiz adları ve numaraları tanımlanıyor.
#define EDIT_SW 10
#define EDIT_SW2 11
#define EDIT_SW3 12
Aşağıda bir C++ sınıfı olan HWND classından textbox nesneleri türetiliyor.
HWND EditBox1;
HWND EditBox2;
HWND EditBox3;
Aşağıda oluşturacağımız fonksiyonların prototipi tanımlanıyor.
void Toplama();
void FarkAlma();
void Carpma();
void Bolme();
Buttonların çalıştıracağı fonksiyonlar LRESULT CALLBACK prosedürü içinde WM_COMMAND bölümünde tanımlanır. WM_COMMAND bölümü komutların alındığı bölümdür. Komut, button1 den geliyorsa, işletilecek kodlar buraya yazılır. Ancak karışık olmaması için bu kodlar bir fonksiyona yazılarak buradan çağrılmalıdır.
case WM_COMMAND:
switch(wParam)
{
case BUTTON_SW:
Toplama();
break;
case BUTTON_SW2:
FarkAlma();
break;
case BUTTON_SW3:
Carpma();
break;
case BUTTON_SW4:
Bolme();
break;
}
WINAPI prosedürünün içinde pencere ve pencere üzerinde yer alacak araçların tamamı tanımlanır.
Aşağıdaki kod satırı, pencerenin özelliklerini bildirerek oluşturulmasını sağlıyor. 1020 ve 700 rakamları pencerenin genişlik ve yükseklik değeridir. CW_USEDEFAULT ile belirtilenler, pencerenin açılacağı ekran koordinatlarıdır. Bunlar varsayılan olarak atanmıştır. "Dort Islem", pencerenin başlığında yazacak yazıdır.
hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Dort Islem",WS_VISIBLE|WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
1020,
700,
NULL,NULL,hInstance,NULL);
Aşağıdaki satır pencere rengini veriyor. Burada, COLOR_3DHILIGHT den sonra gelen rakamı değiştirerek farklı renkler elde edebilirsiniz.
winc.hbrBackground = (HBRUSH)(COLOR_3DHILIGHT+9);
Şimdi tüm kodları aşağıda veriyoruz. Kopyala yapıştır yaparak çalıştırabilirsiniz. DEV C++ ile Windows penceresi oluşturma adımları kodların altında yer alan linkte anlatılmıştır. Özellikle projeyi yaratırken en başta "Project options" menüsünde Win32 GUI yi seçmelisiniz. Aksi halde hem komut ekranı hem de Windows penceresi açılacaktır.
Kolay gelsin.
#include <windows.h>
#include <cstring>
#include <cstdio>
#include <iostream>
#include <sstream>
#define EDIT_SW 10
#define EDIT_SW2 11
#define EDIT_SW3 12
#
#define EDIT_SWL1 13
#define EDIT_SWL2 14
#define EDIT_SWL3 15
#define BUTTON_SW 1
#define BUTTON_SW2 2
#define BUTTON_SW3 3
#define BUTTON_SW4 4
HWND EditBox1;
HWND EditBox2;
HWND EditBox3;
HWND Button1;
HWND Button2;
HWND Button3;
HWND Button4;
HWND hWndLabel;
HWND hWndLabel2;
HWND hWndLabel3;
void Toplama();
void FarkAlma();
void Carpma();
void Bolme();
using namespace std;
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
char SlcTxt[1020];
PAINTSTRUCT ps;
HDC hdc;
switch(Message)
{
case WM_DESTROY: {
PostQuitMessage(0);
break;
}
case WM_COMMAND:
switch(wParam)
{
case BUTTON_SW:
Toplama();
break;
case BUTTON_SW2:
FarkAlma();
break;
case BUTTON_SW3:
Carpma();
break;
case BUTTON_SW4:
Bolme();
break;
}
default:
return DefWindowProc(hwnd, Message, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX winc;
HWND hwnd;
MSG msg;
memset(&winc,0,sizeof(winc));
winc.cbSize = sizeof(WNDCLASSEX);
winc.lpfnWndProc = WndProc;
winc.hInstance = hInstance;
winc.hCursor = LoadCursor(NULL, IDC_ARROW);
winc.hbrBackground = (HBRUSH)(COLOR_3DHILIGHT+9);
winc.lpszClassName = "WindowClass";
winc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
winc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if(!RegisterClassEx(&winc)) {
MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
return 0;
}
hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Dort Islem",WS_VISIBLE|WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
1020,
700,
NULL,NULL,hInstance,NULL);
EditBox1 = CreateWindowEx(WS_EX_CLIENTEDGE | WS_EX_WINDOWEDGE, TEXT("Edit"), TEXT(""),
WS_CHILD | WS_VISIBLE, 200, 100, 220,
25, hwnd, HMENU(EDIT_SW), NULL, NULL);
EditBox2 = CreateWindowEx(WS_EX_CLIENTEDGE | WS_EX_WINDOWEDGE, TEXT("Edit"), TEXT(""),
WS_CHILD | WS_VISIBLE, 200, 180, 220,
25, hwnd, HMENU(EDIT_SW2), NULL, NULL);
EditBox3 = CreateWindowEx(WS_EX_CLIENTEDGE | WS_EX_WINDOWEDGE, TEXT("Edit"), TEXT(""),
WS_CHILD | WS_VISIBLE, 200, 260, 220,
25, hwnd, HMENU(EDIT_SW3), NULL, NULL);
Button1 = CreateWindow("button", "TOPLA", WS_VISIBLE | WS_CHILD, 60, 350, 100, 25, hwnd, HMENU(BUTTON_SW), NULL, NULL);
Button2 = CreateWindow("button", "ÇIKAR", WS_VISIBLE | WS_CHILD, 210, 350, 100, 25, hwnd, HMENU(BUTTON_SW2), NULL, NULL);
Button3 = CreateWindow("button", "ÇARP", WS_VISIBLE | WS_CHILD, 60, 400, 100, 25, hwnd, HMENU(BUTTON_SW3), NULL, NULL);
Button4 = CreateWindow("button", "BÖL", WS_VISIBLE | WS_CHILD, 210, 400, 100, 25, hwnd, HMENU(BUTTON_SW4), NULL, NULL);
hWndLabel = CreateWindowEx(WS_EX_CLIENTEDGE | WS_EX_WINDOWEDGE, TEXT("Static"), TEXT("1. Sayi"), WS_CHILD | WS_VISIBLE, 30, 100, 150, 25, hwnd, HMENU(EDIT_SWL1),NULL, NULL);
hWndLabel2 = CreateWindowEx(WS_EX_CLIENTEDGE | WS_EX_WINDOWEDGE, TEXT("Static"), TEXT("2. Sayi"), WS_CHILD | WS_VISIBLE, 30, 180, 150, 25, hwnd, HMENU(EDIT_SWL2),NULL, NULL);
hWndLabel3 = CreateWindowEx(WS_EX_CLIENTEDGE | WS_EX_WINDOWEDGE, TEXT("Static"), TEXT("Sonuç"), WS_CHILD | WS_VISIBLE, 30, 260, 150, 25, hwnd, HMENU(EDIT_SWL3),NULL, NULL);
if(hwnd == NULL) {
MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
return 0;
}
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
void Toplama()
{
int lxm=1;
char veri[1024];
int lxm2=1;
char veri2[1024];
lxm=GetWindowTextLength(EditBox1) + 1;
GetWindowText(EditBox1,veri,lxm);
lxm2=GetWindowTextLength(EditBox2) + 1;
GetWindowText(EditBox2,veri2,lxm2);
int Sayi1 = atoi(veri);
int Sayi2 = atoi(veri2);
int Sayi3 = Sayi1 + Sayi2;
ostringstream tplm;
tplm<<Sayi3;
string toplam = tplm.str();
const char *ctoplam = toplam.c_str();
SetWindowText(EditBox3, ctoplam);
}
void FarkAlma()
{
int lxm=1;
char veri[1024];
int lxm2=1;
char veri2[1024];
lxm=GetWindowTextLength(EditBox1) + 1;
GetWindowText(EditBox1,veri,lxm);
lxm2=GetWindowTextLength(EditBox2) + 1;
GetWindowText(EditBox2,veri2,lxm2);
int Sayi1 = atoi(veri);
int Sayi2 = atoi(veri2);
int Sayi3 = Sayi1-Sayi2;
ostringstream tplm;
tplm<<Sayi3;
string toplam = tplm.str();
const char *ctoplam = toplam.c_str();
SetWindowText(EditBox3, ctoplam);
}
void Carpma()
{
int lxm=1;
char veri[1024];
int lxm2=1;
char veri2[1024];
lxm=GetWindowTextLength(EditBox1) + 1;
GetWindowText(EditBox1,veri,lxm);
lxm2=GetWindowTextLength(EditBox2) + 1;
GetWindowText(EditBox2,veri2,lxm2);
int Sayi1 = atoi(veri);
int Sayi2 = atoi(veri2);
int Sayi3 = Sayi1*Sayi2;
ostringstream tplm;
tplm<<Sayi3;
string toplam = tplm.str();
const char *ctoplam = toplam.c_str();
SetWindowText(EditBox3, ctoplam);
}
void Bolme()
{
int lxm=1;
char veri[1024];
int lxm2=1;
char veri2[1024];
lxm=GetWindowTextLength(EditBox1) + 1;
GetWindowText(EditBox1,veri,lxm);
lxm2=GetWindowTextLength(EditBox2) + 1;
GetWindowText(EditBox2,veri2,lxm2);
int Sayi1 = atoi(veri);
int Sayi2 = atoi(veri2);
int Sayi3 = Sayi1/Sayi2;
ostringstream tplm;
tplm<<Sayi3;
string toplam = tplm.str();
const char *ctoplam = toplam.c_str();
SetWindowText(EditBox3, ctoplam);
}
C++ İle Windows Form Oluşturma
C++ İle Tablo Yapımı
SANATSAL BİLGİ
22/07/2018