DEV C++ WINDOWS FORM
DEV C++ ile örnek bir Windows formu oluşturma. Forma textbox ve button ekleme. C++ Windows form ile textboxlara girilen iki sayıyı toplamak.
Merhaba;
C++ ile ilk Windows formu oluşturmak istediğimde ben de kaynağa ihtiyaç duymuştum. Baktığım onca Türkçe kitap ve sitelerde bu konuda birkaç anlaşılmayan soyut anlatım dışında nerdeyse hiçbir şey yoktu.
Bende Türkiye’de kaynak eksikliği olan bu konuda ihtiyacı olacaklar için faydalı olacak bu bilgileri paylaşmaya karar verdim.
Uygulama Visual Studio ile de yapılabilir. Ancak DEV C++ ile yapmak hem visual studio’da hem de diğer platform ve derleyicilerde kolayca yapabilmenizi sağlayacak.
Bundan önce çok önemli 3 makale yazdım. Bunlardan biri C++ ile header dosyalarını kullanma, biri DEV C++ ile dll dosyası oluşturup kullanma, diğeri ise Visual Studio ile dll dosyaları oluşturup kullanma. O yazılar ile birlikte bu form uygulamalarının önemli bir kaynak eksikliğini gidereceğini düşünüyorum.
Öncelikle şunu da belirteyim. Ben hiçbir derleyici ve platformda wizard kullanmam. Bu tür kolaylığı olan uygulamalar öğretmekten çok unutturmaya yarıyor. Kod yazma ve algoritma becerisini geliştirmek isteyenler sıkışmadıkça kolaylık oluyor diye sürükle bırak form araçlarınıkullanmasın.
Şimdi uygulamamızı oluşturacağız. DEV C++ derleyicisinde File>>New>>Project adımları ile "New Project" mini penceresini açın. Burada çeşitli uygulama örnekleri var ama siz empty Project seçeneğini seçin. Windows Application seçeneğini seçmeyin. Nedeni basit, her şeyi kendimiz yapacağız.
Projenize bir isim verin ve OK tuşuna basın. Projenizi kaydetmek istediğiniz yeri soracaktır. Belli bir yerde boş bir klasöre kaydedin.
Şimdi karşınızda boş bir beyaz sayfa var. Sayfanın başlığı muhtemelen Untitled diye geçiyor. File>>Save As adımları ile "Save As" penceresini açın. Amaç karşınızdaki boş beyaz sayfayı da kaydetmek. Çünkü projeniz oluşturulmuş olsa da bu sayfa henüz kaydedilmedi.
Bu sayfayı projeyi oluştururken seçtiğiniz klasöre kaydedin. Kaydetmeden önce bir isim verin. Source veya main gibi isimler veya WinForm gibi bir isim verebilirsiniz. Dikkat edeceğiniz husus kayıt türü kısmında "C++ Source Files" seçeneği seçili olsun.
Şimdi kalan en önemli ayarı yapacağız. Bu ayar proje derlenmeden önce yapılmalıdır. Başta uygulamayı boş bir proje olarak seçmiştik. Şimdi bunun bir Windows Application uygulaması olduğunu derleyiciye bildireceğiz. Aksi halde hem konsol uygulaması hem de form uygulaması beraber çalışır ve hem siyah ekranı hem de form ekranını beraber görürsünüz.
Project >> Project Options adımları ile Project Options mini penceresini açın ve sağ alt köşede type kısmında "Win32 GUI" satırını seçin OK tuşuna tıklayın. Şimdi artık aşağıdaki kodları yazarak projenizi çalıştırabilirsiniz.
Kodlar sizi korkutmasın. Zamanla alışacaksınız.
LRESULT CALLBACK kısmı geri dönüşlerin yazıldığı kısımdır.
Event olaylarını; örneğin bir buttona tıklandığında yapılması gerekenler bu kısma yazılır. Kod uzun olduğunda bu kısma yazmak imkansızlaşır. Bu nedenle ben button eventine Islem() fonksiyonunu atadım ve CallBack kısmında button eventinde bu fonksiyonu çağırdım.
Button eventini de kendiniz yazıyorsunuz. CALLBACK kısmında en üstte switch(Messengr) kısmında gelen mesaj eğer komut ise "WM_COMMAND: " kısmına geçecek burada da "switch(prmw)" ile hangi kontrolden sinyal gelmişse o kontrol ile ilgili bloku çalıştıracaktır.
switch(Messengr)
{
case WM_DESTROY: {
PostQuitMessage(0);
break;
}
case WM_COMMAND:
switch(prmw)
{
case BUTTON_SW:
Islem();
break;
}
prmw sizin event gerçekleşen form elemanlarının id sini tutar. Hangi form aracına aitse onun blokunu çalıştırır. Buraya istediğiniz kadar button vb. event yazabilirsiniz.
İnt WINAPI ile başlayan kısım formu ve elemanlarını oluşturan kısımdır.
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, 450, 100, 220,
25, hwnd, HMENU(EDIT_SW2), NULL, NULL);
EditBox3 = CreateWindowEx(WS_EX_CLIENTEDGE | WS_EX_WINDOWEDGE, TEXT("Edit"), TEXT(""),
WS_CHILD | WS_VISIBLE, 700, 100, 220,
25, hwnd, HMENU(EDIT_SW3), NULL, NULL);
Button1 = CreateWindow("button", "TOPLA", WS_VISIBLE | WS_CHILD, 60, 350, 150, 25, hwnd, HMENU(BUTTON_SW), NULL, NULL);
Yukarıdaki kısım oluşturduğum textboxlar ve buttonlardır.
Şimdi text kutularındaki verileri alıp toplayalım. Bir char dizisine textboxlardaki değeri atacayağız.
int lxm=1;
char veri[1024];
Textboxtaki metinin boyutunu alalım. Ve buna 1 ekleyelim.
lxm=GetWindowTextLength(EditBox1) + 1;
Textbox’taki değeri okuyalım.
GetWindowText(EditBox1,veri,lxm);
Editbox idsine sahip textboxta yer alan veriyi char değişkenine atıyoruz. Atayacağımız kısmın uzunluğu lxm kadar olacaktır.
C++ ile textboxlardan alınan bir değeri integer tipine dönüştürmek için;
int Sayi1 = atoi(veri);
komutu kullanılır.
Toplama işlemini yaptıktan sonra sonucu tekrar textbox’a yazdırmamız için char tipine dönüştürmemiz gerek.
ostringstream tplm;
tplm<<Sayi3;
string toplam = tplm.str();
const char *ctoplam = toplam.c_str();
Şimdi sonucu yazdıralım.
SetWindowText(EditBox3, ctoplam);
Biraz kodlara kafa yorarsanız kavrayabilirsiniz. Zamanla kendinizi geliştirirsiniz.
Kolay Gelsin.
Tüm kodlar.
#include <windows.h>
#include <cstring>
#include <cstdio>
#include <iostream>
#include <sstream>
#define EDIT_SW 11
#define EDIT_SW2 11
#define EDIT_SW3 11
#define BUTTON_SW 3
HWND EditBox1;
HWND EditBox2;
HWND EditBox3;
HWND Button1;
void Islem();
using namespace std;
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
switch(Message)
{
case WM_DESTROY:
{
PostQuitMessage(0);
break;
}
case WM_COMMAND:
switch(wParam)
{
case BUTTON_SW:
Islem();
break;
}
default:
return DefWindowProc(hwnd, Message, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wc;
HWND hwnd;
MSG msg;
memset(&wc,0,sizeof(wc));
wc.cbSize = sizeof(WNDCLASSEX);
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszClassName = "WindowClass";
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if(!RegisterClassEx(&wc)) {
MessageBox(NULL, "Window Registration Failed!","Error!", MB_ICONEXCLAMATION|MB_OK);
return 0;
}
hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass", "Caption",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, 450, 100, 220,
25, hwnd, HMENU(EDIT_SW2), NULL, NULL);
EditBox3 = CreateWindowEx(WS_EX_CLIENTEDGE | WS_EX_WINDOWEDGE, TEXT("Edit"), TEXT(""),
WS_CHILD | WS_VISIBLE, 700, 100, 220,
25, hwnd, HMENU(EDIT_SW3), NULL, NULL);
Button1 = CreateWindow("button", "TOPLA", WS_VISIBLE | WS_CHILD, 60, 350, 150, 25, hwnd, HMENU(BUTTON_SW), 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 Islem()
{
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);
}
4 button kullanarak toplama, çıkarma, çarpma ve bölme işleminin yapıldığı örnek uygulama aşağıdadır.
DEV C++ İLE ÇOKLU BUTTON 4 İŞLEM UYGULAMASI
DEV C++ İLE DLL DOSYASI OLUŞTURMA
DEV C++ FORMA RESİM EKLEME
SANATSAL BİLGİ
30/12/2016