Tam Sürümünü Görmek İçin : Visual C++ 6.0 ve GUI oluşturma
neurorebel
09/12/2004, 08:36
Visual C++ 6.0 ile nasıl doğru dürüst GUI oluşturulur ? Her butonu,statici illaki kodlamı oluşturacaz ?? yoksa dialogları mı kullanalım?? nedir bunun oluru bu konuda deneyimli kimselerin fikirleri nedir ?? O kadar öğrendik APIdir kıldır yündür bu saatten sonra sürükle bırakçılık mı yapalım Delphiye geçip !? Component falan geliştirebiliyorum ama database'e yönelik bir uygulama geliştirmeyi düşündüğümde Visual C++ ile imkansız gibi geliyo nerdeyse... Tek kitlendiğim yer GUI oluşturmak (çok uzun iş diğerleriyle 1 saatte yapabilecekken). Yani kısacası C++'ın gücünü kullanırken geliştirme süresinide abartmamak istiyorum ve (.NET falan kullanmak istemiyorum sırf bi GUI yapacam diye). İmdaaaat kayboldum !!!
Euclides
09/12/2004, 13:23
database'e yönelik bir uygulama geliştirmeyi düşündüğümde Visual C++ ile imkansız gibi geliyo nerdeyse...
Database için ister OLE kullanabilir istersen ODBC'e direkt erişebilirsin.
GUI yapmanın neresinde takıldığı söylersen daha iyi olur.
VC++'lada 1 saatte "onlar" gibi GUI'ler yaparsın...
Arkantos
09/12/2004, 17:42
Bence düğmelerin ve kontrollerin tasarımı diyorsanız zaten Resource Editor var. Ama bunların olayları diyorsanız ben de (çok doğru bir tabir olmuş) - C++'nin güçlü özelliklerini - nasıl Win32 API ile kullanırım derken bu konuyla ilgili güzel kaynaklar buldum. Ben de hala bu tekniği yeni yeni öğreniyorum.
Not : Bunu başka bir haber grubuna bir buton oluşturulması diye postalamıştım. Aynen aktarıyorum:
Kontrollerin tasarımını yaptığımızı ve olayları işleme kısmını hazırladığımızı farzediyorum.Olayları işlemek için basit bir kontrol nesnesi sınıfı yazabilirsiniz. Örneğin:
class BasitKontrol
{
public:
/* */
void Gizle ();
void Goster ();
BOOL GorunurMu ();
/* */
protected:
HWND tPencere; // Hangi pencereye ait old. gösteren tanıtıcı
};
Daha sonra bu basit kontrol nesnesinden bir buton ya da onay
kutusu 'checkbox' türetebiliriz.
class Dugme : public BasitKontrol
{
public:
/* */
void BasliginiDegistir (char * const yeniBaslik);
/* */
};
gibi. Bu komutları işlemek için de bir Denetleyici nesnesi
yazmalısınız. Bu denetleyicinin de komutları işlemek için bir
Komutlarıİsle işlevi olmalı ve kullandığımız tüm kontrolleri bu
denetleyici nesnesinin içerisine göndermeliyiz:
class Denetleyici
{
/* */
void KomutlariIsle (HWND tPencere, int dugmeNo, int komut);
/* */
private:
Dugme ilkdugme_;
};
void Denetleyici::KomutlariIsle(HWND tPencere, int dugmeNo, int komut)
{
/* */
switch (komut)
{
case IDC_BUTTON1:
if (komut == BN_CLICKED) // Düğme tıklandı ise
ilkdugme_.BasliginiDegistir ("Düğme tıklandı");
break;
}
}
Bu yukardaki IDC_BUTTON1 düğmeyi ilk oluşturulurken Resource Editör
tarafından her kontrole verilen rastgele bir belirleyici numara. Buna
istersek IDC_DUGME1 gibi kendimiz de bir isim verebiliriz.
En sonunda tek yapılması gereken "İleti Döngüsü" kısmında tüm
komutları kontrol etmek oluyor.
LRESULT CALLBACK MesajIsler (HWND tPencere, UINT mesaj, ...)
{
/* */
case WM_COMMAND:
denetleyici-> KomutlariIsle (...);
return TRUE;
/* */
}
Bunun bir örneğini http://www.relisoft.com/win32/windlg.html adresinden bulabilirsiniz. Ayrıca dediğiniz gibi C++'nin güçlü özelliklerini kullanarak Win32 API'yi nasıl kullanırım diyorsanız http://www.relisoft.com/win32/index.htm adresindeki Win32 API makalelerini incelemenizi tavsiye ederim.
Veritabanı olayına gelince MYSQL'in C++ API'si var. Oldukça kolay ve kullanışlı.
MySQL++ Ana Sayfa
http://tangentsoft.net/mysql++/
MySQL++ Mail Listesi
http://lists.mysql.com/plusplus
Ben de sizin tam tersinize :) Delphide VeriTabanı Programlama'dan C++'ye geçtim. MYSQL'in C++ API'sini kullanmanın da Delphi de veritabanı oluşturmak kadar basit olduğunu söyleyebilirm..
Euclides
09/12/2004, 18:50
win32API kullanırken 1'Den fazla olmayan pencerelere class yaratmak pek avantazjı değil :)(zaten win32API class'da kullanmaz)
eğer ki kendi controllerimizi yapmak istiyorsak o zaman dolaylı yoldan kullanabiliriz.
mesela:
class SuperSubButton
{
public:
LRESULT CALLBACK LocalWndProc(HWND hWnd,UINT uMsg,LPARAM lParam,WPARAM wParam);
...
...
private:
SuperSubClass pMe;
...
...
};
...
...
SuperSubButton::SuperSubButton(SuperSubButton pX)
{
pMe=pX;
....Pencereyi yarat...
SetWindowLong(hWnd,0,pMe);
}
//==================================================
LRESULT CALLBACK GlobalWndProc(HWND hWnd,UINT uMsg,LPARAM lParam,WPARAM wParam)
{
SuperSubClass *pX=(SuperSubClass)GetWindowLong(hWnd,0);
if(pX!=NULL)
{
return pX->LocalWndProc(hWnd,uMsg,lParam,wParam);
}else{
return DefWindowProc(hWnd,uMsg,lParam,wParam); //WM_NCCREATE uçtu :)
}
}
Arkantos
09/12/2004, 19:01
win32API kullanırken 1'Den fazla olmayan pencerelere class yaratmak pek avantazjı değil :)(zaten win32API class'da kullanmaz)
Olabilir katılıyorum az pencere oluştururken sınıf kullanmak pek avantajlı olmayabilir ama uzun vadede C++ ile beraber kullanınca baya pratik oluyor :)
Bir ikincisi ve asıl önemli olan işin içine kaynak yönetimi 'Resource Management' girince sınıfları kullanmak oldukça faydalı oluyor.
Evet Win32 API'nin C Fonksiyonları olduğunu biliyorum.
Ben pencere sınıflarını şöyle yazıyorum:
#if !defined PENCERE_H
#define PENCERE_H
#include <windows.h>
#include <string>
class Kaynak
{
enum { MAK_UZUNLUK = 255 };
public:
Kaynak (HINSTANCE tOrnek, int kaynakNo);
operator char const * () const { return bellek_; }
private:
char bellek_ [MAK_UZUNLUK + 1];
};
// PencereSinifi özelliklerini öğren
template <class T>
inline T PencereBilgileriniOgren (HWND tPencere, int hangisi = GWL_USERDATA)
{
return reinterpret_cast<T> (::GetWindowLong (tPencere, hangisi));
}
// PencereSinifi özelliklerini ayarla
template <class T>
inline void PencereBilgileriniAyarla (HWND tPencere, T deger, int hangisi = GWL_USERDATA)
{
::SetWindowLong (tPencere, hangisi, reinterpret_cast<long> (deger));
}
class BasitPencereSinifi
{
public:
BasitPencereSinifi (char const * isim, HINSTANCE tOrnek)
: isim_ (isim), tOrnek_ (tOrnek)
{}
BasitPencereSinifi (int kaynakNo, HINSTANCE tOrnek);
char const * IsimOgren () const { return isim_.c_str (); }
HINSTANCE HangiProgramaAit () const { return tOrnek_; }
HWND AcikPencereyiOgren ();
protected:
HINSTANCE tOrnek_;
std::string isim_;
};
class PencereSinifi: public BasitPencereSinifi
{
public:
PencereSinifi (char const * sinifIsmi, HINSTANCE tOrnek, WNDPROC mesajisler);
PencereSinifi (int kaynakNo, HINSTANCE tOrnek, WNDPROC mesajisler);
void ArkaPlanRenginiAyarla (int renk)
{
sinif_.hbrBackground = reinterpret_cast<HBRUSH> (renk + 1);
}
void IkonlariAyarla (int kaynakNo);
void Kaydet ();
protected:
void VarsayilanlariAyarla ();
WNDCLASSEX sinif_;
};
class UstPencereSinifi: public PencereSinifi
{
public:
UstPencereSinifi (int kaynakNo, HINSTANCE tOrnek, WNDPROC mesajisler);
};
class PencereYapici
{
public:
PencereYapici (PencereSinifi & penceresinifi);
operator HWND () { return tanitici_; }
void BaslikEkle (char const * baslik)
{
pencereAdi_ = baslik;
}
void MenuEkle () { pencereStili_ |= WS_SYSMENU; }
void DikeyKaydirmaCubuguEkle () { pencereStili_ |= WS_VSCROLL; }
void YatayKaydirmaCubuguEkle () { pencereStili_ |= WS_HSCROLL; }
void Olustur ();
void Goster (int gosterim = SW_SHOWNORMAL);
protected:
PencereSinifi & sinif_;
HWND tanitici_;
DWORD genisletilmisPencereStili_;
char const * pencereAdi_; // pencere adı için gösterge
DWORD pencereStili_; // pencere stili
int x_; // pencerenin yatay konumu
int y_; // pencerenin dikey konumu
int genislik_; // pencere genişliği
int yukseklik_; // pencere yüksekliği
HWND taniticiAna_; // ana pencere için tanıtıcı
HMENU taniticiMenu_; // menü için tanıtıcı
void * bilgiler_; // pencere oluşturma bilgileri için gösterge
};
class UstPencereYapici: public PencereYapici
{
public:
UstPencereYapici (PencereSinifi & penceresinifi, char const * baslik);
};
#endif
Tabi ki bu tekniği ben geliştirmedim :)
neurorebel
09/12/2004, 22:33
Yaw işte sorun burada... Çok fazla angarya iş var... C++ ile kendi frameworkunu oluşturup (Win32API ile ya da MFCden türeterek) onu kullanmak en makulu gibi görünüyor... Benim merak ettiğim resource editor gibi kolay bi araç yok mu dur ?? Yani en hızlı yöntem nedir? Siz neler kullanıyorsunuz yani orta ölçekli bir uygulama geliştirirken örneğin 3 - 5 form olan bir veritabanı uygulaması (Delphi ya da Borland C++ Builder ile sonuca daha kolay varılıyor ama VC++...) ... Bahsettiğiniz tekniklerden haberim var zaten önümüze ilk çıkan seçenekler bunlar zaten...
Arkantos
09/12/2004, 23:11
Resource Editor VC++ ile zaten geliyor. Ama Win32 API kullanmak istiyorsan kontrollerin olaylarını kendin kodlamak zorundasın. MFC'yi bilmiyorum. VC++.NET ile System::Windows::Forms ad alanını kodunuza ekleyerek daha kolay bir şekilde butonların olaylarını yazabiliyorsunuz. Veritabanı uygulamaları geliştirmek için Delphi gibi bir ortam kolay sonuca gitmek açısından uygun olabilir. Ama Win32 ile geliştirilen uygulamalar hem Delphi hem de .NET ile hazırlanan uygulamalardan daha hızlı çalışır :) Aslında ben de C++ ile veritabanı konusunda yeniyim ..
neurorebel
10/12/2004, 09:36
Yaw .NET te ayrı bi hikaye zaten... .NET'te sadece C# kullanıyorum... C++'ın nasıl avantajları olur .NET platformunda bilemem çünkü pek denemedim ( gerçi bi kitap edindim VC++.NET diye ama... ). Zaten .NET'i sevmedimde pek(!) :mad: ... şimdi herkes programcı kesilir başımıza iyi izle...
neurorebel
10/12/2004, 13:32
Resource Editor VC++ ile zaten geliyor. daha güçlüsü var mı acep ? onu merak etmiştim aslen :)
Arkantos
10/12/2004, 17:43
Resource Editor VC++ ile zaten geliyor.
daha güçlüsü var mı acep ? onu merak etmiştim aslen :)
Bildiğim kadarıyla yok ..
Yaw işte sorun burada... Çok fazla angarya iş var... C++ ile kendi frameworkunu oluşturup (Win32API ile ya da MFCden türeterek) onu kullanmak en makulu gibi görünüyor... Benim merak ettiğim resource editor gibi kolay bi araç yok mu dur ?? Yani en hızlı yöntem nedir? Siz neler kullanıyorsunuz yani orta ölçekli bir uygulama geliştirirken örneğin 3 - 5 form olan bir veritabanı uygulaması...
Form üzerinde hızlı çalışma yapmak için MFC tabanlı uygulamalarda CFormView sınıfını ve bu sınıftan üretilmiş pencereleri kullanmak mümkün. Bunun için yeni bir MFC Uygulaması projesi açıp başlangıçtaki Seçenekler bölümünde en sonda yer alan taban sınıfını CFormView seçmek gerekli. VC++ 6.0 da kaynak alanında hazır bir form karşına gelecektir. Bu form ana pencereye iliştirilmiş bir öğe olup, senin tarafından hazırlanacak diğer formlarda aynı pencere üzerinde dinamik olarak kullanılabilir. Zaten hazırlayacağın herbir form için ayrı bir sınıf oluşturulacağı için kaynak yönetimi kolay olacaktır. Ancak burada en büyük sorun, form sınıfları arasında ki iletişimi sağlamak olacaktır. Bundan dolayı herbir form için bir veri saklama sınıfı oluşturman ve bu yardımcı sınıflar aracılığı ile form verilerini işlemen gerekebilir.
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.