PDA

Tam Sürümünü Görmek İçin : gorsel programlama ms visual c++


Flagrant
03/09/2006, 15:44
mrb,

Bu konu ile ilgili forumda daha once de baya soru gelmis ama ben tam anlamiyla istedigim seyi bulamadim.

Yapmak istedigim sey outlook tarzi bir sey yani bir console ekraninda calismayan, windows ortaminda calisan renkli gorsel seyler, mesela bir randevu defteri.

Yada en basitinden baslangicta. Iki kutucuk olsun, bu kutucuklari kullanici mouse uyla secsin ve icine rakamlar yazsin. Daha sonra yandaki butona tikladiginda bu iki sayinin carpimini yazdirsin program.

Sizlerden istedigim yardim, bu kodun nasil yazilacagi degil, bu programi yazmak icin izlemem gereken yollar. Yani ek bir program mi kullanmaliyim? Ek bir program kullanacaksam nasil bir mantikla calisiyor?

Mesela kutucuk olustururken kod mu yazmam lazim yoksa, kutucuk ekle diye bir ozellik mi oluyor?

Yardimlarinizi bekliyorum. Eger onereceginiz yontemler icin tutorial, notlar ...vs de gonderirseniz super olur...

Yardim eden herkese simdiden tesekkurler...


Meteryus
03/09/2006, 17:27
" Borland c++ Builder " edinmeni ve yardım dosyasını baştan sona okmanı öneririm.

Sabahi
04/09/2006, 20:04
MS Visual C++ ıle gorsel programlar yazmak ıcın farklı seceneklerınız var ancak hangi secenegi secerseniz secin ilk baslayan icin oldukca karmasık bir yapısı var. Yinede bir tavsiyede bulunmak gerekirse MFC kullanmanızı oneririm. Eger Vısual studioda bir MFC single dialog projesı baslatır ve biraz kurcalarsanız sordugunuz bazı soruların cevabını kendiniz kesfedebilirsiniz. Ortama alıstıktan ve command button, text box gibi controller ile tanıstıktan sonra gerıye kalan sorularınızı yıne sorarsanız yardımcı olmaya calısırız.

Mr_MOON
05/09/2006, 00:55
Kısacası C++ ile görsel progamlama olayı. Bunun için bir sürü alternatifin var.
Meteryusun dediği gibi C++ builder ile delphi ile program yazar gibi bileşenleri foruma koyarak program yazabilirsin. Ama ben %100 kod yazmak istiyoum dersen bi kaç seçeneğin var.

Mesela Tren gibi uzayan win32 apileri.

Yada wxwidets, fltk, Qt tarzı kütüphaneler.

<konu dışı>yeşilvadi hocam gelirse karalar bişeylerde uzun zamandır oda yok :)
acehreli hocam sen nerdesin :)

acehreli
05/09/2006, 19:15
Ben buradayim ama gorsel programlama ile hic ilgim yok :)

Ali

Flagrant
05/09/2006, 20:06
sabahi onerilerinle yola ciktim ve bir mfc application yarattim.

Dialog box yarattim..

Bazi seyleri anlar gibi oldum ama yinede sormak istedigim seyler var.
Bir tane button koyuyorum. Program otomatik olarak OnButton1 diye bir fonksiyon yaratiyor. Sanirim bu fonksiyon butona basildigi zaman otomatik olarak cagirilmis oluyor. Buttonun icine x = x*5 yazdim mesela... Ve en basta int x = 3 olarak belirledim. Simdi programi derliyorum ve bir sorun cikmiyor ve derlenen programda button a basiyorum zannedersem x i 15 yapiyor program ama ben bunu goremiyorum cunku gormek icin yazmam gereken komutlari bilmiyorum. Mesela bu diolog ekranina bir seyler yazdirabilmek icin hangi kodlari yazmam gerek? (yani cout , cin gibi komutlarin benzerleri mi var dialog boxlar icin?)Ve bu tarz komutlarin bilgisine nereden ulasabilirim?

Yardimlarinizi bekliyorum.. Tesekkurler

Sabahi
09/09/2006, 05:14
@Flagrant
Bu noktada arka planda neler olup bitiyor, biraz anlamaya calismak lazim. Eger daha once console programlari yazdiginizi kabul edersek bazi alisilagelmis kaliplarin MFC de goze carpmadigini farketmis olmalisiniz. Ornegin programlamaya basliyanlara ilk ogretilen main fonksiyonunun ortada olmamasi gibi. Bu farkliligin nedenini windows api islevlerinin IDE ve MFC vasitasi ile sarmalanmis olmasi seklinde izah edebiliriz. Bu farkliliklari daha iyi gozlemlemek icin eger bir iki dakikaninizi ayirir ve bir win32 projesi yaratirsaniz, win32 api ile en basit bir windows programi icin yazilan kodu irdeleyebilirsiniz ki dikkatinizi cekmek istedigim 1. MessageLoop (mesaj dongusu) 2. WndProc (Windows Procedure). Bunlari vurgulamamin nedeni windows programlarinin kalbinin burada attigidir, hangi dili, hangi kutuphaneyi kullanirlanirsaniz kullanin temelinde bu mesaj dongusu ve bu dongu sayesinde alinan mesajlarin wndproc tarafindan yerine getirilmesi esasi yatmaktadir. Windows programlarini MFC ile yazdigimizda bu mekanizmalar programcidan saklanmistir ve programcinin butun yapmasi gereken (en azindan basit bir program icin) kullanmak istedigi kontrolleri eklemek ve bu ekleme sonucunda sablon olarak temin edilen islevlerin icini doldurmak diyebiliriz. Bu noktada sordugunuz soruya geri donersek bir command button eklediginizde neler oluyor ve nasil kullanilir bir goz atabiliriz.
Ilk olarak butun kontrollerde oldugu gibi button kontrolude bir takim (properties) ozelliklere sahiptir ve bu ozellikler gerek static (kod yazarken), gerek dynamic (calisma ani) olarak degistirilebilirler. Bir kontrolun ne ozellkilere sahip oldugu sag tarafta properties kutusunda bulunabilir, veya bu kontrolun uzerine sag tiklanip properties secilirek. Bir Command button icin hazir gelen ozeliklerde cok bir degisiklige gerek yok. Genel olarak name(isim) ve caption(turkcesini bilmiyorum ama etiket diyebiliriz galiba) ozelliklerini saglamak simdilik yeterli olur.
Ikinci olarak sizin de dediginiz gibi button1 e tiklandiginda OnButton1 cagriliyor ancak daha uygun bir tanimlama yapmamiz gerekirse OnButton1 e message handler dememiz gerekiyor. Eger dikkat ettiyseniz button veya baska bir kontrol ekleyince begin message map ve end message map makro sunun arasina button click mesaji alindiginda bu mesajin nasil islem gorecegini gosteren ON_BN_CLICKED makrosu da otomatik olarak ekleniyor. Bu makrolarin amaci sizden gizlenmis olan message procedure'e bir mesaj alindiginda ne yapacagini bildirmek.

BEGIN_MESSAGE_MAP(CXXXDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1))
END_MESSAGE_MAP()

ikinci sorunuza gelince windows programlarinda cin, cout vesaire gibi console uygulamalarina yonelik akimlari kullanamazsiniz. Yerine amaciniza uygun bir baska kontrol kullanabilirsiniz. Ornegin x = x*5 isleminizin sonucunu yazdirmak icin edit veya static text kontrolleri uygun bir secim olabilir. Daha once C++ ile nesnel programlama deneyiminiz var oldugunu kabul edersek elinizde hazir bulunan projenize bir edit control ekleyin. (MS C++ 6.0 icin) eklediginiz edit kontrolun ustune sag tiklayin ve class wizard secin. Member variables sekmesine gecin. IDC_EDIT1 i secin ve Add Variable dugmesine tiklayin. Hazir olarak Member Variable name yazan kutuya m_Sonuc gibi bir isim yazin. Category kutusu Value olarak kalsin. Variable type olarak int i secin ve OK e tiklayin. Bu islemleri yaptiysaniz artik x*5 isleminin sonucunu sakliyabilecegimiz uye bir degiskenimiz oldu. Simdi OnButton1 fonksiyonuna geri donun ve ordaki x = x * 5 ifadesininden sonra m_Sonuc = x; diye bir satir ekleyin. Son olarak UpdateData(false); islevini cagirin ve programinizi tekrar derleyip calistirin.
Bir hatirlatma olarak UpdateData(false) edit box a bilgi yazmak icin, UpdateData(true) edit box tan bilgi okumak icin kullanilabilir ve bu yaptigimiz baska yontemler kullanilarakta yapilabilirdi.
Biraz uzun oldu ama umarim isinize yarar. Kolay gelsin.

Revne
09/09/2006, 15:52
veya benim en cok kullandıgı yontemi denersin...

char ss[100];
x = x * 5;
sprintf(ss,"Sayi=%d",x);
this->SetWindowText(ss);

Dialog penceresinin baslıgında gosteriyorum sonucu :)

Kolay Gelsin

Flagrant
11/09/2006, 17:18
Cevaplar icin tesekkurler cok isime yaradi ama iki kucuk sorum daha var.

Birincisi combo boxlarla ilgili. Mesela edi boxlarda gerekli ayarlamalardan sonra,

int x = m_editbox1 + m_editbox2; yaptigimizda editboxlarin icindeki sayilari topluyor.

ama ayni durum combo boxlarda olmuyor(type ini droplist yapsam bile). Bunu duzeltmek icin combobox i dropdown yapiyorum ve "atoi" methoduyla interger a ceviriyorum. Acaba direk combobox u droplist olarak secip islem yaptirma sansim var mi? Bir de Listboxlara interger yazdirilamiyor bu sebebten yine ayni mantikla cikan sonucu "itoa" methoduyla cstringe cevirip yazdiriyorum. Yaptigim islem mantikli mi, yoksa baska bir yolu var mi?


ikinci sorum biraz daha farkli. Mesela bir m_editbox1 im ve m_editbox2 im var ben kullanici girislerine gore hangi editbox i kullanacagima karar vermek istiyorum. Yani kullanici 2 girerse ikinci, 1 girerse birinci editbox a yazdirmak istiyorum. Tabi bunu yaparken if komutunu kullanmadan yapmak istiyorum. Bu ornegin daha genislerini yapmak icin. Mesela 50 tane editbox im oldugunda calisan bir sistem.(50 tane if yazmak mantiksiz olur heralde:)). Yani biraz array gibi calismasini istiyorum. m_editbox[1] seklinde olsa mesela hos olurdu :P

sorulardan birini bile biliyor olsaniz cevaplarsaniz cok sevinirim ...

tesekkurler...

Sabahi
11/09/2006, 22:45
Listboxlara interger yazdirilamiyor bu sebebten yine ayni mantikla cikan sonucu "itoa" methoduyla cstringe cevirip yazdiriyorum. Yaptigim islem mantikli mi, yoksa baska bir yolu var mi?
Listbox a int yazilir mi yazilmaz mi aklimda kalmamis ama mantikli olani string yazip string okumak zaten, en azindan benim dusuncem.

ikinci sorum biraz daha farkli. Mesela bir m_editbox1 im ve m_editbox2 im var ben kullanici girislerine gore hangi editbox i kullanacagima karar vermek istiyorum. Yani kullanici 2 girerse ikinci, 1 girerse birinci editbox a yazdirmak istiyorum. Tabi bunu yaparken if komutunu kullanmadan yapmak istiyorum. Bu ornegin daha genislerini yapmak icin. Mesela 50 tane editbox im oldugunda calisan bir sistem.(50 tane if yazmak mantiksiz olur heralde). Yani biraz array gibi calismasini istiyorum. m_editbox[1] seklinde olsa mesela hos olurdu
Bu biraz design ile ilgili. Eger gercekten 50 tane edit box kullanmak gibi bir ihtiyac varsa zaten bunlari tek tek koymanin bir manasi yok dynamic olarak yaratilmalari daha makul olur. Yine de yanilmiyorsam MFC array benzeri bir kullanima imkan taniyor. Radio controllar ile kullanimi daha yaygin, o yuzden ornek bulmak icin bu control uzerinde bir arastirma yaparsaniz yardimci bir kaynak bulmaniz mumkun.
Bu arada iyi bir programlama teknigi olmasada simdilik asagidaki gibi bir cozum de kullanilabilir.

void CXxxDlg::OnButton1()
{
CString *col[2];
col[0] = &m_edit1;
col[1] = &m_edit2;

int secenek = 1; // siz kullanicidan 1 yada 2 olarak alabilirsiniz

*col[--secenek] = "hello";
UpdateData(false);
}

int x = m_editbox1 + m_editbox2; yaptigimizda editboxlarin icindeki sayilari topluyor.

ama ayni durum combo boxlarda olmuyor(type ini droplist yapsam bile). Bunu duzeltmek icin combobox i dropdown yapiyorum ve "atoi" methoduyla interger a ceviriyorum. Acaba direk combobox u droplist olarak secip islem yaptirma sansim var mi?
Bu soruyu pek anlamadim. Normalde Combo ve list box kullanici ne secerse onu almak icin kullanilir. Siz herhangi bir indexteki degeri mi okumak istiyorsunuz? Oyle ise bu degeri nasil okuyorsunuz?