Visual C++ ile Veritabanı (BÖLÜM 4)

DOĞRU VERİ TABANI TEKNOLOJİSİNİ SEÇİM

 

Veri saklama çoğu yazılım uygulamasının zorunlu bir parçasıdır. Hemen hemen bütün C++ uygulamaları bazı tip verileri saklanmasını veya sürekli kalmasını gerektirir.

 

Çoğu uygulamaların veriyi verimli bir şekilde tekrar alması gerekir. Bu uygulamalar tipik olarak sırayla depo edilmiş özel bilgileri geri almak için veri boyunca arama yapmaları gereklidir. Bu arama yapma ve verinin geri alınması bir veri tabanının kullanımını gerektirir.

 

Devamı »

Visual C++’da Sınıf Yapıları (BÖLÜM 3)

Sınıf Yapıları

 

Constructor ve Destructor Fonksiyonları

 

Program geliştirmekte uzun süredir uğraşıyorsanız, programınızın bazı elemanları için hazırlık yapılmasının gerektiğini bilirsiniz. Nesnelerle çalışıyorsanız bu durumla daha da sık karşılaşıyorsunuzdur. Hatta gerçek problemler düşünülürse, her nesne bu tür bir hazırlığa gereksinim duyar. C++’da bu gereksinim, sınıf bildirimi içerisine constructor fonksiyonlarının konulmasıyla karşılanır. Bir sınıfın yapıcısı (constructor), bu sınıfa ait nesnelerin her oluşturuluşunda çağrılır. Böylelikle bir nesne için gerçekleştirilmesi gereken tüm hazırlıklar constructor fonksiyonu tarafından otomatik olarak yapılabilir.

 

            Constructor fonksiyonu ait olduğu sınıf ile aynı addadır ve bu fonksiyonun geri döndüreceği bir veri tipi yoktur. Constructor fonksiyonu olan örnek sınıfı aşağıda inceleyelim.

 

                #include <iostream>

using namespace std;

 

class myclass {

                int a;

public:

                myclass(); //constructor

                void show();

};

 

myclass::myclass()

{

                cout << “constructor’da\n”;

                a=10;

}

 

void myclass::show()

{

                cout << a;

}

 

int main()

{

                myclass ob;

                ob.show();

                return 0;

}

 

            Bu basit örnekte a değeri myclass() constructorı (yapıcısı) tarafından hazır hale getiriliyor. Constructor, ob nesnesi oluşturulurken çağrılır. Nesne, kendisine ait bildirim deyimi istenildiğinde oluşturulur. C++’da, değişkeninin bildirim deyiminin bir “iş deyimi” olması oldukça önemli. C’de program geliştirirken, bildirim deyimleri basitçe değişkenlerin oluşturulduğu yer olarak düşünülebilir. Oysa C++’da, nesne constructor’a, sahip olabileceğinden değişkenin bildirim deyimi dikkate değer sayıda işin yapılmasını sağlayabilir.

 

            myclass()’ı nasıl tanımladığımıza dikkat edelim. Daha önce de söylediğimiz gibi, bu fonksiyonun return (döndürme) tipi yoktur. C++’ın resmi yazılım kurallarına göre constructor’ların return tipi olması doğru değildir.

 

            Global nesneler için nesne constructor’u, bir kere, program ilk çalışmaya başladığında çağrılır. Yerel nesneler için ise constructor, bildirim deyiminin her işletilişinde çağrılır. Constructor’ın tersi destructor’dır. Bu fonksiyon, nesne yok edilirken çağrılır. Nesnelerle çalışıyorsak onların yok edilmeleri esnasında bazı işlemlerin yapılması gerekir. Örneğin, oluşturulduğunda bellekte yer kaplayan bir nesne, yok edilirken bu belleği serbest bırakmak isteyecektir. Destructor da sınıfta aynı addadır, fakat başında ~ işareti vardır. Aşağıdaki sınıfın destructor fonksiyonunu inceleyelim.

 

                #include <iostream>

using namespace std;

 

class myclass {

                int a;

public:

                myclass(); //constructor

                ~myclass(); //destructor

                void show();

};

 

myclass::myclass()

{

                cout << “constructor’da\n”;

                a=10;

}

 

myclass::~myclass()

{

                cout << “Yokediliyor…\n”;

}

 

void myclass::show()

{

                cout << a << “\n”;

}

 

int main()

{

                myclass ob;

                ob.show();

                return 0;

}

 

            Sınıfa ait destructor, nesne yok edilirken çağrılır. Yerel nesneler bulundukları alandan çıkılınca yok edilirken global nesneler program sona erdiğinde yok edilirler. Bir constructor’ın veya destructor’ın adresinin alınması imkansızdır.

 

Parametre Alan Constructor’lar

 

            Bir constructor fonksiyonuna argüman göndermeniz mümkündür. Bunun için constructor fonksiyonunun bildirimine ve tanımına, uygun parametreler eklemeniz yeterlidir. O halde nesneleri deklare ederken argümanları belirleyeceğiz. Bunu yapacağımızı görmek için aşağıdaki örneğe bir göz atalım.

 

                #include <iostream>

using namespace std;

 

class myclass {

                int a;

public:

                myclass(int x); //constructor

                void show();

};

 

myclass::myclass(int x)

{

                cout << “constructor’da\n”;

                a=x;

}

 

void myclass::show()

{

                cout << a << “\n”;

}

 

int main()

{

                myclass ob(4);

                ob.show();

                return 0;

}

 

            myclass’ın parametre aldığı constructor fonksiyonu, myclass()’a gönderilen değer a’nın hazırlığı için kullanılmaktadır. ob’un main()’in içerisinde nasıl deklare edildiğine özellikle dikkat edin. ob’dan sonra gelen parantezlerin içinde verilen 4 değeri, a’ya lk değer vermek için myclass()’ın x parametresine gönderilen argümandır.

 

            Gerçekte parametreli bir constructor’a argüman gönderme işlemi şu notasyonla yapılmalıdır.

 

                myclass ob = myclass(4);

 

            Fakat, C++ programcılarının çoğu, kısa şekli tercih etmektedir. Bu iki yazım şekli arasında, aslında teknik açıdan küçük bir fark bulunmaktadır. Bu fark, consturctor’ların kopyalanmasıyla ilgilidir ve daha sonra ele alınacaktır. Fakat aradaki bu fark konusunda şu anda endişelenmemiz gerekmiyor.

 

Sınıflarda Miras

 

            C++ için miras, bir sınıfın bir diğer sınıfın özelliklerini mirasla alabildiği mekanizmadır. Miras, sınıflar arasında en genelden en özele doğru bir hiyerarşinin oluşmasını sağlar.

 

            Konuya başlamadan önce, sık kullanacağımız iki terimi tanıyalım. Bir sınıf, diğer sınıftan miras aracılığıyla oluşturulurken, ebeveyn sınıfa temel sınıf, mirasla oluşturulan sınıfa ise alt sınıf diyoruz. Genelde miras süreci, temel sınıfın tanımlanmasıyla başlar. Temel sınıf, tüm alt sınıfların sahip olacağı genel özellikleri tanımlar. Esasen temel sınıf, bir takım özelliklerin en genel tanımını temsil etmektedir. Alt sınıf, bu genel özellikleri mirasla alır ve onlara sadece kendisine özgü yeni özellikler ekler.

 

            Bir sınıfın bir diğer sınıftan mirasla oluşmasının ne anlama geldiğini anlamak istiyoruz. Bunun için kısa ve basit bir örnekle işe başlayalım. Bu örnek basit olduğu halde mirasın anahtar özelliklerinden pek çoğunu bize gösterecek. İlk olarak temel sınıfın deklarasyonunu inceleyelim.

 

                // Temel sınıf tanımlanıyor.

                class B {

                               int i;

                public:

                                void set_i (int n);

                               int get_i();

                };

 

Bu temel sınıf kullanılarak bir alt sınıf oluşturuluyor.

 

                // Alt sınıf tanımlanıyor.

                class D : public B {

                               int j;

                public:

                               void set_j (int n);

                               int mul();

};

 

            Bu deklarasyonu daha yakından inceleyelim. D sınıf adından sonra public anahtar kelimesi, derleyiciye, temel sınıfın tüm public elemanlarının alt sınıfın da public elemanları olacağını söylemektedir. Fakat temel sınıfın tüm private elemanları kendisine private (özel) kalır ve alt sınıf onlara doğrudan erişemez.

 

            B ve D sınıflarını kullanan programın tamamı:

 

                // Mirasa basit bir örnek.

                #include <iostream>

                using namespace std;

 

                // Temel sınıfın tanımlanması.

                class B {

                               int i;

                public:

                               void set_i (int n);

                               int get_i();

                };

 

                // Alt sınıfın tanımlanması.

                class D : public B {

                               int j;

                public:

                               void set_j(int n);

                               int mul();

                };

 

                // Temel sınıf için i değerinin verilmesi.

                void B::set_i(int n)

{

                               i = n;

                }

 

                // Temel sınıf için i değerinin döndürülmesi.

                void D::set_j (int n)

                {

                               j = n;

                }

 

                // Temel sınıfın i’si çarpı alt sınıfın j’si değerinin döndürülmesi.

                int D::mul()

                {

                               // Alt sınıf, temel sınıfın public fonksiyonlarını çağırabilir.

                               Return j * get_i();

                }

 

                int main()

{

                               D ob;

 

                               ob.set_i(10); // Temel sınıfta i’ye değer veriliyor.

                               ob.set_j(4); // Alt sınıfta j’ye değer veriliyor.

 

                               cout << ob.mul(); // ekranda 40 gösteriliyor.

 

                               return 0;

                }

 

mul() fonksiyonunu nasıl tanımladığımıza bir bakalım. Bu fonksiyonda, B temel sınıfına ait olan, D’ye ise ait olmayan get_i() fonksiyonunu herhangi bir nesneye bağlamadan çağırdığımıza dikkatinizi çekmek istiyorum. Bu, mümkündür, çünkü B’nin public üyeleri D’nin de public üyeleri olmuştur. Fakat, mul()’un doğrudan i’ye erişmek yerine get_i()’yi çağırmak zorunda olmasının nedeni şudur: Temel sınıfa private olarak ait olan üyeler (bu durumda i), bu sınıfa özel üyeler olarak kalmaktadır ve herhangi bir alt sınıf tarafından bu üyelere erişilemez. Bir sınıfın private üyelerine alt sınıflar tarafından erişilememesi, depolama özelliğinin sürdürülmesi için gereklidir. Eğer bir sınıfa ait private üyeler, bu sınıfın mirasla alınması ile public yapılabilseydi, depolama (encapsulation) özelliği ortadan kalkardı.

 

            Temel sınıfın mirasla alınması, genelde şu notasyonla yapılır.

 

                class alt-sınıf-ismi:erişim-türü alt-sınıf-ismi {

                .

                .

                .

                };

 

        Burada erişim-türü yerine üç anahtar kelimeden birini yazacağız: public, private veya protected.

 

Nesne İşaretçileri

 

            Şimdiye kadar nesnelere ait üyelere nokta işaretini kullanarak erişiyorduk. Bu yöntem, tek nesneyle çalışıyorsak doğrudur. Fakat nesnelere erişirken bu nesneye atanan bir işaretçiyi de kullanabiliriz. Erişimi işaretçi ile gerçekleştiriyorsak, nokta işareti yerine ok işareti (->) kullanacağız..

 

            Nesne işaretçilerini herhangi bir değişkeni nasıl deklare ediyorsak o şekilde deklare edeceğiz. Bunun için sınıf adını belirledikten sonra değişken adının başına bir yıldız işareti (asteriks) koyacağız. Nesnenin adresini elde etmek için ise adın başına & işaretini koyacağız, tıpkı herhangi bir tipteki değişkenin adresini alırken yaptığımız gibi.

 

            Diğer tiplerin işaretçileri gibi, nesne işaretçileri de arttırıldıkları zaman bu tipteki diğer nesneyi işaret edeceklerdir. Basit bir örnekle açıklayalım.

 

                #include <iostream>

                using namespace std;

 

                class myclass {

                int a;

public:

                myclass (int x); // constructor

                int get();

};

 

myclass::myclass(int x)

{

                a = x;

}

 

int myclass::get()

{

                return a;

}

 

int main()

{

                myclass ob(120); // Nesne oluşturuluyor.

                myclass *p; // Nesne için işaretçi oluşturuluyor.

 

                p = &ob; // ob’nin adresi p’ye atanıyor.

 

                cout << “Nesneyi kullanan değer: ” << ob.get();

                cout << “\n”;

 

                cout << “İşaretçiyi kullanan değer: ” << p->get();

 

                return 0;

}

 

Devamı »

Visual C++ Nesneleri (BÖLÜM 2)

Nesne Temelli Program Yazmak

 

Nesne temelli programlama (OOP), standart yapılı programlama tekniklerinin uzantısı olarak düşünülebilir. Class (sınıf), dosya ve işleve eklenen, modülasyonun yeni öğesidir. OOP, yazılım nesneleriyle gerçek nesnelerin (şekiller, cihazlar, pencereler, belgeler) modellerini yaptığınız bir programlama stilidir. C gibi geleneksel programlama dilleriyle bile OOP yapmak olasıdır, ancak C++, OOP için doğrudan destek sağlar ve nesneler açısından düşünmeyi ve kodlamayı çok daha kolay ve doğal hale getirir.

 

OOP’yi daha çok ya da az kapsamlı kullanabilirsiniz. Örneğin, diğer türlü C’ye aşırı benzeyen bir programda tek yeni veri tipi sağlamak için kullanabilirsiniz. Ya da, çözmeye çalıştığınız problemin tümünü modellemek için nesne yönelimli tasarım kullanabilirsiniz. Örneğin MFC, Windows uygulamalarının modelini yapar ve pencereleri, belgeleri, iletişim kutularını, düğmeleri ve hatta uygulamayı tüm olarak simgelemek için sınıf nesnelerini sık sık kullanır.

 

Nesne yönelimli tasarım işlemi, problemin dikkatle belirlenmesiyle başlar. Bir sonraki adım, iyi nesneler yapabilecek öğeler için problemi incelemektir. Tasarım sürdükçe, yavaş yavaş bu nesnelerin yapısını ve davranışlarını geliştirirsiniz. Sonuç olarak, sıradüzendeki C++ sınıflarının yaptığı sıklıkta, nesneleri gerçekleştirirsiniz.

 

SDI ve MDI Uygulamaları

 

İki temel Doküman/Görünüm program tipi vardır.

 

·        SDI (Single Document Interface – Tek Dokümanlı Arabirim)

·        MDI (Multiple Document Interface – Çok Dokümanlı Arabirim)

 

Bir SDI programı tek bir doküman destekler ve hemen tek bir görünümü destekler. Bir anda tek bir görünümü destekler. Bir anda tek bir doküman açık olabilir. Bir SDI uygulaması belli bir göreve odaklanır.

 

            Bir MDI programında çeşitli farklı doküman tipleri kullanılabilir ve bu dokümanların her biri bir veya daha fazla görünüme sahip olabilir. Bir anda birden fazla doküman açık olabilir ve açık olan doküman o dokümanın ihtiyaçlarına uygun özelleştirilmiş bir araç çubuğu ve menüler kullanılır.

İletişim Kutusu Nedir?

 

İletişim kutusu, kullanıcıya geri besleme sağlamak veya kullanıcıdan giriş almak için kullanılan özelleştirilmiş pencerelerdir. İletişim kutuları tek satırlık mesajlar veren basit mesaj kutularından karmaşık kontroller içeren iletişim kutularına kadar değişik biçim ve büyüklükte olabilirler.

 

Ayrıca iletişim kutuları, bir program başlatılırken telif ve başlangıç bilgilerini görüntülemek amacıyla kullanıcı ile tek taraflı iletişim içinde kullanılır. Developer Studio ve Microsoft Word programlarının açılış ekranları tek taraflı iletişim için kullanılan iletişim kutularına iki örnektir. İletişim kutuları bazen kullanıcıya uzun süren bir işlemin ilerleyişi hakkında bilgi  vermek içinde kullanılır.

            Çeşitli farklı tipte iletişim kutuları vardır ve her biri özel bir amaca sahiptir. İki ana iletişim kutusu tipi vardır.

 

·        Modal (Kipli) iletişim kutuları

·        Modeless (Kipsiz) iletişim kutuları

 

Modal İletişim Kutusu: En yaygın kullanılan iletişim kutusu tipi modal iletişim kutusudur. Modal iletişim kutusu açıkken kullanıcı programda herhangi başka bir işlem yapamaz, önce bu iletişim kutusuyla işini bitirmelidir.

 

            Modeless İletişim Kutusu: Modeless iletişim kutusu açıkken programda başka işlemler yapılabilir. Modeless iletişim kutusuna bir örnek Developer Studio’nun kullanıldığı Find and Replace iletişim kutusudur. İletişim kutusu açıkken ana menüden seçim yapabilir ve hatta başka iletişim kutuları açabilirsiniz. Bunu dışındaki diğer tüm Developer Studio iletişim kutları modaldır. Bunlar açık olduğu sürece kullanıcı Developer Studio’nun diğer kısımlarıyla etkileşimde bulunamaz.

 

Giriş İçin İletişim Kutularını Kullanmak

 

            Çoğu insan iletişim kutlarını düşündüklerinde kullanıcıdan bilgi girişi alan iletişim kutularını düşünürler. İletişim kutuları çoğunlukla kullanıcı girişleri ile ilgili kontroller içerirler. Bir iletişim kutusuna çeşitli kontroller ekleyebilirsiniz.

 

            Bazı iletişim kutularının kullanılması Windows programlarında o kadar sık gerekli olur ki bunlar iletişim sisteminin bir parçası olarak içermektedir. Genel iletişim kutuları (Common Dialog Boxes) olarak bilinen bu iletişim kutuları bir fonksiyon çağırma yoluyla kullanılabilirler ve sizin bir iletişim kutusu kaynağı yaratmanız gerekmektedir. Dosya açma, seçme, yazı tipi ve renk seçme ve kelime bulup değiştirme işlemleri için genel iletişim kutuları vardır.

 

Mesaj Kutuları Eklemek

 

            En basit iletişim kutusu tipi bilgi görüntülemek için kullanılan mesaj kutusudur. Bu iletişim kutusu tipi o kadar basittir ki MFC sınıf kütüphanesini kullanarak tek satırlı bir kodla iletişim kutusunu yaratabilirsiniz. Örneğin, parametrelerin MFC’nin sağladığı öndeğerleri ile bir mesaj kutusu göstermek için şu satırı kullanmanız yeterlidir.

 

            AfxMessageBox(“Merhaba!”);

 

            Bu kod satırı sarı bir üçgen içinde ünlem işareti olan bir mesaj kutusu yaratır. En az tek bir parametre kullanmanız gerekir: Bu, iletişim kutusu içinde görüntülenen mesajdır. Seçime bağlı olarak bir ikon stili ve düğme düzeni de seçebilirsiniz. Aşağıdaki tabloda düğme düzenlerine ait parametre değerleri gösterilmektedir

 

Kullanılan İkon

Anlamı

Mesaj Kutusu Biçimi

Ünlem “!” işareti

Warning (Uyarı)

MB_ICONEXCLAMATION

Daire içindeki “i” işareti

Information (Bilgi)

MB_ICONINFORMATION

Soru “?” işareti

Question (Soru)

MB_ICONQUESTION

Daire içindeki “x” işareti

Error (Hata)

MB_ICONSTOP

            Tablo 2.1 Mesaj Kutusu İkonları

 

Ayrıca mesaj kutusunda kullanılabilecek bir düğme düzenlemesi de belirleyebilirsiniz. Ön değer olarak mesaj kutusunda OK etiketli tek bir düğme vardır. Ancak bazen kullanıcıya basit bir soru sorup cevabını almak gerekebilir. Bu düğme düzenlemelerinin bir kullanımı, bir hata sırasında kullanıcıya ne yapılması gerektiğini sormaktır. Örneğin, aşağıdaki kod soru işareti ikonu içeren ve kullanıcıya mevcut dosyasının silinmesinin istenip istenmediğini soran bir mesaj kutusu görüntüler.

 

                int nGeriDonenDeger = AfxMessageBox(“Varolan dosyanın üzerine kaydetmek istediğinizden eminmisiniz?”, MN_YESNOCANCEL | MB_ICONQUESTION);

if (nGeriDonenDeger == IDYES)

{//Dosyanın Üzerine Kaydet}

 

            Yukarıda verilen kod programda kullanıldığında kullanıcı Yes, No ve Cancel düğmelerinden birini seçebilir. Aşağıdaki tablo bir mesaj kutusunda bulunabilecek düğme düzenlerini göstermektedir.

 

Mesaj Kutusu Biçimi

Kullanılan Düğmeler

MB_ABORTRETRYIGNORE

Abort, Retry ve Ignore

MB_OK

OK

MB_OKCANCEL

OK ve Cancel

MB_RETRYCANCEL

Retry ve Cancel

MB_YESNO

Yes ve No

MB_YESNOCANCEL

Yes, No ve Cancel

            Tablo 2.2 Mesaj Kutusu Düğmeleri

 

            Mesaj kutusunun döndürdüğü değer kullanıcının hangi düğmeye tıkladığını gösterir. Aşağıdaki tabloda döndürülecek değerler ve tıklanılan düğme karşılaştırması gösterilmiştir.

 

Döndürülen Değer

Basılan Düğme

IDABORT

Abort

IDCANCEL

Cancel

IDIGNORE

Ignore

IDNO

No

IDOK

OK

IDRETRY

Retry

IDYES

Yes

            Tablo 2.3 Mesaj Kutusu Düğmelerinden Dönen Değerler

Bir İletişim Kutusu Eklemek

 

            Bir programa bir iletişim kutusu eklemek için genelde dört adım gereklidir.

 

·        Developer Studio kaynak araçlarını kullanarak iletişim kutusu kaynağı tasarlayın ve yaratın.

·        CDialog sınıfından türetilmiş ve iletişim kutusunu yönetecek bir C++ sınıfı yaratmak için Class Wizard’ı kullanın.

·        Gerekirse iletişim kutusuna gönderilecek mesajlar üzerinde iletişim yapmak için fonksiyonlar ekleyin.

·        İletişim kutusu ana menüden seçilirse menü kaynağı üzerinde değişiklik yapılmalı ve Class Wizard kullanılarak mesaj fonksiyonları yaratılmaktadır.

 

Kaynakları Anlama

 

            İletişim kutuları özelleştirilmiş pencere tipleridir. Ancak, yaygın olarak kısa süreliğine kullanıldıklarından genellikle program kaynağı olarak saklanır ve yalnızca gerektiğinde yüklenirler. Bunu, az miktarda serbest belleği olan bir makinede bir Windows programı çalıştırdığında gerekebilirsiniz. Her iletişim kutusu açıldığında EXE dosyadan iletişim kutusu kaynaklarını yüklemek için sabit diske erişim yapılır.

 

Bir İletişim Kutusu Kaynağı Yaratmak

 

            Developer Studio bir iletişim kutusunu görsel olarak yaratmanıza ve düzenlemenize olanak sağlar. Fareye kullanarak kontroller ekleyebilir ve  büyüklüklerini değiştirebilirsiniz. Bir fare düğmesine tıklamayla iletişim kutusunun ve kontrollerinin özelliklerini ayarlayabilirsiniz.

 

            Aşağıdaki adımları izlemeden önce bir MFC App Wizard’ı kullanarak bir SDI projesi oluşturun.

 

·        Insert menüsünden Resource komutunu seçerek New Resource iletişim kutusunu görüntüleyin. Sonra kaynak tipi olarak Dialog seçin ve OK’e tıklayın.

·        Resource ağacından Dialog klasörüne farenin sağ tuşu ile tıklayın ve açılan menüden Insert Dialog komutunu seçin.

 

İlk başta görüntülenen iletişim kutusu, biri OK etiketli diğeri Cancel etiketli iki düğme kontrolü içerir. MFC sınıf kütüphanesi genellikle bu kontrollerin işleyişiyle ilgilidir. Biz bu iletişim kutusuna istediğimiz kontrolleri ekleyip istediklerimizi çıkartabiliriz.

 

İletişim Kutusunun Özelliklerini Değiştirmek

 

            Her iletişim kutusu, farenin sağ tuşuyla tıklayarak ve açılan menüden Properties komutunu seçerek görüntüleyebileceğiniz özelliklere sahiptir. General sekmesinin altındaki iletişim kutusu özellikleri şunlardır:

 

            ID: Normalde IDD_DIALOG1 gibi bir şeydir. İletişim kutularını IDD_ ile başlayan bir tanımlayıcı ile isimlendirmek bir MFC standardıdır. Siz iletişim kutularınıza daha anlamlı isimler verebilirsiniz: Bu iletişim kutusuna IDD_MERHABA adını verin.

 

            Caption: Normalde dialog düğmelerine sahiptir. Bunu da daha anlamlı bir başlıkla değiştirmelisiniz. Bu örnek iletişim kutusuna Merhaba başlığını verebilirsiniz.

 

            Menü: Normalde seçili değildir çünkü iletişim kutularının çoğu menü kullanmaz.

 

            X Pos: Normalde iletişim kutusunun varsayılan konumunu kullanmak için seçili değildir.

 

 

            Y Pos: Normalde iletişim kutusunun varsayılan konumunu kullanmak için seçili değildir.

 

            Font Name: İletişim kutusunun o anda kullandığı yazı tipinin ismini içerir.

 

            Font Size: İletişim kutusunun o anda kullandığı yazı tipinin büyüklüğünü içerir.

 

Styles sekmesinin altındaki iletişim kutusu özellikleri şunlardır.

 

            Style: Genelde çoğu iletişim kutusu Popup düğmesine sahiptir. Form görünümlerinde veya iletişim çubuklarında kullanılan özel iletişim kutusu şablonları söz konusu olduğunda stil Child olarak belirlenir.

 

            Border: Çoğu iletişim kutusu için Dialog Frame değerine sahiptir.

 

            Minimize Box: İletişim kutusu için simge durumuna küçültme (minimize) düğmesi yaratır. Bu onay kutusu bir çok iletişim kutusu için seçilmemiş durumdadır bu sayede iletişim kutusunda minimize etme düğmesi bulunmaz.

 

            Maximize Box: İletişim kutusu için maximize etme (ekranı kapla) düğmesi yaratır. Bu onay kutusu bir çok iletişim kutusu için seçilmemiş durumdadır, bu sayede iletişim kutusunda maksimize etme düğmesi bulunmaz.

 

            Title Bar: İletişim kutusu için bir başlı çubuğu yaratır. Bu onay kutusu hemen her zaman işaretlidir. Çünkü iletişim kutularının çoğu başlık çubuğuna sahiptir.

 

            System Menu: İletişi kutusu için system menüsünün sağlanması gerektiğini belirtir. Bu onay kutusu normalde işaretli durumdadır.

 

            Horizontal Scroll: İletişim kutusu için yatay kaydırma çubuğu yaratmak amacıyla kullanılır. Bu onay kutusu hemen her zaman seçilmemiş durumdadır çünkü iletişim kutuları çok nadir olarak kaydırma çubuğu kullanırlar.

 

            Vetical Scroll: İletişim kutusu için düşey kaydırma çubuğu yaratmak amacıyla kullanılır. Yatay kaydırma çubuğu gibi bu özellik de çok nadir kullanılır.

 

            Clip Siblings: Sadece çocuk pencerelerinde kullanılır.

 

            Clip Children: Ana pencereler için kullanılır çoğu iletişim kutusu için bu onay kutusu seçilmemiş durumdadır.

 

            More Styles sekmesi iletişim kutusu için ilave özellikler içerir.

 

System Modal: Modal bir iletişim kutusu yaratır. Bu seçenek seçilirse kullanıcı başka bir programa geçemez.

 

Absolute Align: İletişim kutusu ilk görüntülendiğinde nereye yerleştirileceğini belirtmek için kullanılır. Onay kutusu seçilirse, iletişim kutusu ana pencere yerine ekrana göre hizalanır.

 

            No Idle Message: İletişim kutusunun mesaj kuyruğu boşken belli bir pencere mesajının, WM_ENTERIDLE mesajının gönderilmesine engel olur. Bu onay kutusu normalde seçilmemiş durumdadır.

 

            Local Edit: Bir düzeltme kontrolü belleğinin nasıl tahsis edileceğini belirtmek için kullanılır. Bu onay kutusu normal olarak seçilmemiş durumdadır. Bu durumda düzeltme kontrolleri programın veri bölümleri dışındaki belleği kullanır.

 

            Visible: İletişim kutusu ilk görüntülendiğinde görünür olmasını belirtmek için kullanılır. Bu onay kutusu normalde işaretli durumdadır. Form görünümlerinde bu onay kutusu seçili değildir.

 

            Disabled: İletişim kutusu ilk görüntülendiğinde kullanılamaz durumda olmasını sağlamak içindir. Bu onay kutusu normalde işaretsiz durumdadır.

 

            3D-Look: İletişim kutusuna üç-boyutlu bir görünüm verir. Bu onay kutusu normalde işaretsiz durumdadır.

 

            Set Foreground: İletişim kutusunun ön plana yerleştirilmesini sağlar bu onay kutusu normalde işaretsiz durumdadır.

 

            No Fail Create: Bir hata olsa bile Windows’a iletişim kutusunu yaratmasını söyler. Bu onay kutusu normalde işaretsiz durumdadır.

 

            Control: Bir çocuk kontrolü olarak kullanılabilecek bir iletişim kutusu kaynağı yaratır. Bu onay kutusu normalde işaretsiz durumdadır.

 

            Center: İletişim kutusu ilk görüntülendiğinde ortada görüntülenmesini sağlar. Bu onay kutusu normalde işaretsiz durumdadır.

 

            Center Mouse: Fare imleci iletişim kutusunun ortasına konumlandırır. Bu onay kutusu normalde işaretsiz durumdadır.

 

            Context Help: Ortama duyarlı yardım için araç çubuğuna bir soru işareti ikonu ekler. Bu onay kutusu normalde işaretsiz durumdadır.

 

İletişim Kutusuna Kontrol Eklemek

 

            İletişim kutusuna ekleyebileceğiniz basit bir kontrol statik düzenleme kontrolüdür. Statik düzenleme kontrolü iletişim kutusu ile etkileşim gerektirmez. Genellikle iletişim kutusunun içerdiği diğer kontroller için düz metin etiketi olarak kullanılır. Statik düzenleme kontrolü eklemek için şu adımları izleyin.

 

·        Kontrol araç çubuğundan Static Text kontrolünü seçin. İletişim kutusu üzerinde hareket edildiğinde imleç artı işaretine dönüşür.

·        İmleci iletişim kutusunun ortasına getirin ve sol tuşla tıklayın. Statik bir düzenleme kontrolü yaratılır ve kontrol Static etiketini içerir.

·        Statik düzenleme kontrolünün etiketini değiştirmek için kontrole farenin sağ tuşuyla tıklayın ve kısayol menüsünden Properties komutunu seçin, başlığı Merhaba olarak değiştirin.

İletişim görüntülendiğinde statik düzenleme kontrolü görünür haldedir. Düzenleme kontrolleri, kontrollere etiket vermek veya değişmesi pek muhtemel olmayan mesajları görüntülemek için mükemmel bir seçimdir. Düzenleme kontrolünün kenarlarını fare ile sürükleyerek kontrolün büyüklüğünü ve konumunu değiştirmeyi deneyin.

 

İletişim Kutusu İçin Sınıf Yaratmak

 

            Programınızda iletişim kutusu ile etkileşimlerin çoğunu idare etmek için CDialog sınıfını kullanabilirsiniz. CDialog  sınıfı iletişim kutusunu kullanmayı kolaylaştıran üye fonksiyonları içerir. Özellikle sizin yarattığınız iletişim kutusu için CDialog sınıfından bir sınıf üretmek için ClassWizard’ı kullanmalısınız.

 

ClassWizard’ı başlatmak için şu metotlardan herhangi birini kullanın:

 

·        Developer Studio’da CTRL+W tuşlarına basın.

·        View menüsünden ClassWizaerd’ı seçin.

·        İletişim kutusunu editöründe herhangi bir yere farenin sağ tuşuyla tıklayın ve açılan menüden ClassWizard’ı seçin.

 

ClassWizard IDD_MERHABA gibi yeni bir kaynağın eklendiğini bilirse, bir iletişim kutusu yeni kutusu kaynağı için iki seçenek arasında bir seçim yapmanızı ister. Bu iki seçenek:

 

·        Yeni bir sınıf yaratmanız ya da

·        Mevcut bir sınıfı seçmenizdir.

 

ClassWizard, yeni iletişim kutusu kaynağını yönetecek bir sınıf yaratmak için New Class iletişim kutusunda girdiğiniz değerleri kullanır. IDD_MERHABA iletişim kutusuna ait değerleri girmek için aşağıdaki tablodaki değerleri kullanın.

 

Kontrol

Değer

Name

CMerhabaDlg

File Name

MerhabaDlg.cpp

Base Class

CDialog

Dialog ID

IDD_MERHABA

Automation

None

 

            OK düğmesine tıklayın. CMerhabaDlg sınıfı üretilecek ve projenize iki dosya eklenecektir:

 

·        MerhabaDlg.h dosyası sınıf bildirimini içerir.

·        MerhabaDlg.cpp dosyası sınıf tanımını içerir

 

İletişim Kutusuna İlk Değerler Vermek İçin Bir Mesaj Yöneticisi Yaratmak

 

            İletişim kutusundaki tüm kontroller yaratıldığında işletim sistemi iletişim kutusuna WM_INITDIALOG mesajını gönderir. Çoğu iletişim kutusu, gerekli her tür ilk değer verme işlemini gerçekleştirmek için WM_INITDIALOG mesajını kullanır. CMerhabaDlg sınıfını projenize ekledikten sonra, WM_INITDIALOG gibi mesajlar için bir fonksiyon eklemek amacıyla ClassWizard’ı kullanabilirsiniz. WM_INITDIALOG için bir mesaj yöneticisi eklemek üzere şu adımları izleyin:

 

·        CTRL+W tuşlarına basarak veya bir kaynak kod penceresinde farenin sağ tuşuyla tıklayıp menüden ClassWizard’ı seçerek ClassWizard’ı açın.

·        Message Maps sekmesini seçtikten sonra Class Name listesinden mesajla ilgili işlem yapacak olan sınıfı (bu örnekte, CMerhabaDlg sınıfını) seçin.

·        Object ID liste kutusundan mesajı üreten nesneyi (bu örnekte CMerhabaDlg nesnesini) seçin. Messages liste kutusuna gönderilen mesajların listesi görüntülenecektir.

·        Messages liste kutusundan WM_INITDIALOG mesajını seçin ve Add Function düğmesine tıklayın. ClassWizard CMerhabaDlg sınıfına otomatik olarak OnInitDialog fonksiyonunu ekleyecektir.

·        ClassWizard’ı kapatmak için OK düğmesine tıklayın.

 

CMerhabaDlg::OnInitDialog fonksiyonunun aslında değişkenlere ilk değer vermesi gerekmez. Bunun yerine bir mesaj kutusu görüntüleyebilirsiniz. OnInitDialog fonksiyonunu aşağıdaki kod gibi değiştirin.

 

                BOOL CMerhabaDlg::OnInitDialog()

                {

                               CDialog::OnInitDialog();

                               AfxMessageBox(“Merhaba iletişim kutusu açılacak!”);

                               return TRUE;

                }

 

Yeni İletişim Kutusu İçin Menü Seçeneği Eklemek

 

            Projeniz tarafından kullanılan menüye bir menü maddesi eklemek için bu kısımdaki adımları izleyin. Menüler projenizde kaynaklar olarak saklanır. O anki menü kaynaklarını görüntülemek için proje çalışma alanı penceresinde ResourceView sekmesini seçin. Kaynak ağacını o anki proje için tanımlanmış farklı kaynak tiplerini gösterecek şekilde genişletin; klasörlerden birisi Menu adındadır.

 

            IDR_MAINFRAME adlı tek menüyü görmek için Menu klasörünü açın. Menükaynak ikonuna çift tıklayarak menü kaynağını açın. Menü düzeltilmeye hazır biçimde kaynak editöründe görüntülenir. Üst seviyeli bir menü maddesine tıklamak o madde ile ilişkilendirilmiş açılan menüyü görüntüler.

 

            Her menünün son maddesi menü kaynağına yeni menü maddeleri eklmek için kullanılan boş bir kutudur. Bütün menü maddeleri ilk önce bir menü kaynağının sonuna eklenilir ve sonra doğru konumlarına taşınır. Yeni bir menü maddesi eklemek için şu adımları izleyin:

 

·        Menü Properties iletişim kutusunu görüntülemek için File menüsündeki boş kutuya çift tıklayın.

·        Bir menü maddesi eklemek için bir menü ID ve başlık girin. Bu örnek için menü ID olarak ID_FILE_MERHABA ve menü başlığı olarak &Merhaba girin.

·        Editöre geri dönmek için Menu Properties iletişim kutusunun dışında herhangi bir yere tıklayın.

 

Bir menü maddesi ekledikten sonra bir sonraki adım yeni menü maddesi ile ilgili mesaj yöneticisi fonksiyonunu eklemektir. ID_FILE_MERHABA menü maddesi için bir mesaj yöneticisi fonksiyonu eklemek üzere şu adımları izleyin:

 

·        CTRL+W tuşlarına basarak ve ya kaynak kod penceresinde farenin sağ tuşu ile tıklayıp menüden ClassWizard’ı seçerek ClassWizard’ı açın.

·        Message Maps adlı sekmeyi seçin ve mesajla ilgilenecek sınıfı (bu örnekte CMainFrame sınıfını) seçin.

·        Object ID liste kutusundan mesajı üreten nesneyi (bu önekte ID_FILE_MERHABA) seçin. Messages liste kutusunda iki tane mesaj yöneticisi fonksiyonu görüntülenir.

·        Messages liste kutusundan COMMAND mesajını seçin ve Add Function düğmesine tıklayın. Fonksiyon adı olarak ClassWizard’ın önerdiği OnFileMerhaba ismini kabul edin.

·        ClassWizard’ı kapatmak için OK düğmesine tıklayın.

 

CmainFrame::OnFileMerhaba fonksiyonunu aşağıdaki gibi değiştirin.

 

                Void CmainFrame::OnFileMerhaba()

                {

                               ChelloDlg dlgMerhaba;

                               if (dlgMerhaba.DoModal()==IDOK)

                                               AfxMessageBox(“OK Butonuna Tıklandı!”);

                               Else //IDCANCEL

                                               AfxMessageBox(“Cancel Butonu Tıklandı!”);

                }

 

MainFrm.cpp dosyasına MerhabaDlg.h dosyasında bulunan CMerhabaDlg sınıfının tanımını dahil etmek için MainFrm.h dosyasını dahil eden include deyiminin hemen üzerine aşağıdaki satırı ekleyin.

 

                #include “MerhabaDlg.h”

 

            Projenizi çalıştırın. DoModal üye fonksiyonu çağırıldığında IDD_MERHABA iletişim kutusu görüntülenir. İletişim kutusunun düğmelerinden birine basarak kutuyu kapatmadan fonksiyon sonlanmaz. OK düğmesine basarsanız döndürülen değer IDOK’dir. Cancel düğmesine basarsanız döndürülen değer IDCANCEL’dır.

Düğme Kontrolleri

 

Düğme Nedir?

 

            Düğme genellikle bir iletişim kutusunda, araç çubuğunda veya kontroller içeren diğer pencerelerde bulunan, yazı veya bitmap bir etiket içeren özel bir pencere tipidir. Windows’da beş tip düğme vardır.

 

Basılır Düğme: Hemen hemen bütün iletişim kutuları kullanıcının gerçekleştirebileceği bir işlemi belirtmek için en az bir basılır düğme (pushbutton) içerir. Bunlar yaygın olarak bir iletişim kutusunu kapatmak, bir arama işlemini başlatmak veya yardım istemek için kullanılır.

 

            Radyo Düğmesi: Birden fazla seçenek arasından sadece birinin seçilmesi gerektiği durumlarda (örneğin kullanıcı cinsiyet seçimi yapacağında) radyo düğmeleri (radio button) kullanılır. Çoğunlukla bir arada gruplanmış olan radyo düğmelerinden belli bir anda yalnızca birisi seçilebilir.

 

            Onay Kutusu: Onay kutuları (check box) beli bir koşulun True (doğru) ya da False (yanlış) olduğunu belirtmek için Boolean göstergeleri olarak kullanılır. Radyo düğmelerinden farklı olarak, bir gruptaki çok sayıda onay kutusu seçilebilir. Seçime bağlı olarak onay kutuları üçüncü bir durumu da destekler. Bu, kontrolün ne True ne de False olduğunu gösteren, onay kutusunun kullanılmaz olduğu durumdur.

 

            Grup Kutusu: Bir grup kutusu (group box) benzer amaçlar için kullanılan kontrolleri mantıksal olarak gruplar. Bu sayede kullanıcı kontroller arasındaki ilişkiyi kolaylıkla anlayabilir ve iletişim kutusunun kullanımı kolaylaşır. Radyo düğmeleri hemen her zaman bir grup kutusu içinde yer alır, böylece hangi kontrollerin birbirleriyle ilişkili olduğu anlaşılır.

Düğmeler İçin MFC Desteği

 

            Düğme kontrolleri normalde bir iletişim kutusunun parçası olarak yaratılır. Bir iletişim kutusuna bir düğme ekledikten sonra düğmeye basıldığında ve ya düğme seçildiğinde yaratılan olaylar karşısında ne yapılacağını belirleyen fonksiyonları eklemek için ClassWizard’ı kullanabilirsiniz. Ayrıca düğme kontrolleriyle ilişkili CButton nesnelerini yaratmak için ClassWizard’ı kullanabilirsiniz.

 

            Hem bir iletişim kutusu kaynağına eklenen düğmelerle hem de dinamik olarak yaratılan düğmelerle etkileşim için MFC CButton sınıfını kullanabilirsiniz. Bir düğme kontrolünü belli bir CButton nesnesiyle ilişkilendirmek için ClassWizard’ı kullanın.

 

Düğme Kontrollerinin Özellikleri

 

            Bütün kontroller gibi düğmelerde her kontrolün davranışını tamamlayan bir özellikler kümesine sahiptir. Beş farklı düğme kontrolü tipi olmasına rağmen bunlar ortak özelliklere sahiptir. Belli bir kontrolün özelliklerini görüntülemek için kontrolü farenin sağ tuşuyla tıkladığınızda çıkan menüden Properties komutunu seçebilirsiniz. Düğme kontrolü aşağıdaki özelliklere sahiptir.

 

            ID: Düğmenin kaynak ID’si Developer Studio IDC_BUTTON1 gibi varsayılan bir kaynak ID’si verir. Kontrollerin kaynak ID’si olarak IDC_önekini kullanmak Microsoft’un bir isimlendirme standardıdır.

 

            Caption: Düğmenin etiketi olarak gözüken yazıyı belirtir. Developer Studio, Button gibi sayılan bir değerdir. Düğmeyi, bu başlıktaki harflerden birine basarak klavyeden aktive etmek için o harfin başına & karakterini ekleyin.

 

            Visible: Düğmenin başlangıçta görünür olup olmayacağını belirler. Bu onay kutusu normalde işaretli durumdadır.

 

            Disabled: Düğmenin başlangıçta kullanılmaz durumda olacağını gösterir. Bu onay kutusu normalde işaretsiz durumdadır.

 

            Group: Bir gruptaki ilk kontrolü işaretler. Bu onay kutusu işaretlenemezse, bu özelliğe sahip bir kontrolü eden kontroller aynı grubun parçası olarak kabul edilir. Kullanıcı ok tuşlarını kullanarak aynı group içindeki kontroller arasında gezinebilir.

 

            Tab Stop: Bu kontrole klavyedeki Tab tuşuna basılarak erişilebileceğini gösterir. Bu onay kutusu normalde seçilmemiştir.

 

            Default Button: Bu kontrol iletişim kutusuna varsayılan düğmesi olarak belirler. Bir iletişim kutusunda yalnızca bir tane varsayılan düğme olabilir ve iletişim kutusunda herhangi başka bir kontrol kullanmadan Enter’a basılarak bu düğme çalıştırılabilir. Bu özellik yalnızca basılır düğme kontrolleri için kullanılabilir. Çoğu durumda bu onay kutusu işaretsiz durumdadır.

 

            Owner Draw: Düğmenin sahibi tarafından çizileceğini belirtir. Bu özellik yalnızca basılır düğme kontrolleri için kullanılabilir. Çoğu durumda bu onay kutusu işaretsiz durumdadır.

            Help ID: Bu kontrol için ortama duyarlı bir yardım ID’si yaratır. Bu seçenek normalde seçili değildir.

 

            Icon: Bu kontrolün yazı yerine bir icon göstereceğini belirtir. İkon, SetIcon fonksiyonu kullanılarak düğmeye atılır. Bu seçenek normalde seçili değildir.

 

            Bitmap: Bu kontrolün yazı yerine bir bitmap  göstereceğini belirtir. Bitmap, SetBitmap fonksiyonu kullanılarak düğmeye atanır. Bu seçenek normalde seçili değildir.

 

            Notify: Mesajların kontrolün sahibine gönderilmesi gerektiğini belirtir. Bu seçenek seçilmese bile düğme tıklama mesajları kontrolü sahibine gönderilecektir. Bu onay kutusu normalde seçili değildir.

 

            Horizantal Alignment: Yazının yatay olarak nasıl hizalanacağını gösterir. Seçilebilecek seçenekler Default, Left, Right ve Center’dır. Bu özellik normalde default olarak seçilidir.

 

            Multiline: Düğme üzerindeki yazı tek satıra  sığmayacak kadar uzunsa yazının birden fazla satır halinde gösterilmesini sağlar. Bu özellik grup kutuları için kullanılmaz bu onay kutusu normalde işaretli değildir.

 

            Flat: Düğmenin 3-boyutlu efektler olmadan çizilmesi gerektiğini belirtir. Bu stil grup kutuları için kullanılmaz. Bu onay kutusu normalde işaretli değildir.

 

            Vertical Alignment: Yazının dikey olarak nasıl hizalanacağını gösterir. Seçenekler Default, Top, Bottom ve Center’dır. Bu özellik normalde Default olarak seçilidir.

 

            Auto: Kontrolün tıklandığında değil seçildiğinde durum değiştirmesi gerektiğini belirtir. Bir kontrolü tıklamadan seçmek için Tab tuşuna basmanız gerekir bu özellik yalnızca onay kutuları ve radyo düğmeleri için kullanılabilir. Bu onay kutusu normalde işaretli değildir.

 

            Left Text: Yazının kontrolün sol tarafına yerleştirilmesinin gerektiğini belirtir. Bu özellik yalnızca onay kutuları ve radyo düğmeleri için kullanılabilir. Bu onay kutusu normalde işaretli değildir.

 

            Push-Like: Bir radyo düğmesi yada onay kutusunun basılı düğme gibi çizileceğini belirtir. Kontrolün işaretlendiğinde veya seçildiğinde aşağıya gömülü görünür.

 

            Tri-State: Bir onay kutusunun iki değil üç durumlu olabileceğini gösterir. True ve False durumlarına ek olarak, kontrol kullanılmaz durumda da olabilir. Bu durumda onay kutusunun durumu ne True ne de False’dur.

İletişim Kutularınızda Standart Basılır Düğme Düzenleri Kullanmak

 

        Kontroller içeren iletişim kutularında çok sayıda basılır düğme yaygın olarak kullanılır. Bu düğmelerin her biri özel bir anlam taşıdığından mümkün oldukça standart terminolojiyi kullanmanızda fayda var çünkü bu sayede programlarınızın kullanıcılarının işi en aza indirgenir. Aşağıda bu düğmelerin standart anlamları verilmektedir.

 

OK: İletişim kutusundaki bilgileri kabul edip kutuyu kapatmak için kullanılır. İletişim kutusunda kullanıcının girdiği tüm bilgiler program tarafından kullanılır. OK düğmesinin tüm harfleri büyük harf olan tek düğme olduğuna dikkat edin.

 

            Cancel: İletişim kutusu açıkken yapılan değişiklikleri iptal edip iletişim kutusunu kapatmak için kullanılır. Geri döndürülmeyecek değişiklikler yapıldıysa bu düğmenin etiketi Close yapılmalıdır.

 

            Close: iletişim kutusunu kapatmak için kullanılır. Programın herhangi bir işlem yaptığını göstermez. İletişim kutusu açıkken yapılan değişiklikleri iptal etmek için Cancel düğmesi kullanılmadığında Close kullanılır. Bir çok rpogram Cancel düğmesini Close olarak değiştirir.

 

            Help: Açık iletişim kutusu için ortama duyarlı yardım istemek için kullanılır.

 

            Apply: İletişim kutusunda girilen verilere dayanarak değişiklik yapmak için kullanılır. OK düğmesinden farklı olarak Apply düğmesine basıldığında iletişim kutusu açık kalmalıdır.

 

Üye Değişkenleri Bir Düğme Kontrolü İle İlişkilendirme

 

            Bir değere kontrol atamanın veya kontrolün değerini öğrenmenin en kolay yolu ClassWizard’ı kullanarak kontrolü sınıfın bir üye değişkeniyle ilişkilendirmektir. Bir üye değişkeni bir kontrol ile ilişkilendirirken üye değişkeni kontrol ile veya kontrolün değeri ile ilişkilendirebilirsiniz. Düğmeleri temsil eden üye değişkenlerin değer üzerinden ilişkilendirilmesi çok nadirdir. Bunun yerine bir çok düğme kontrolünü temsil etmek için CButton sınıfı kullanılır.

 

CDialog sınıfından türetilmiş bir sınıfa bir üye değişken eklemek için şua adımları izleyin.

 

·        ClassWizard’ı açın.

·        Member Variables adlı sekmeyi seçin.

·        İletişim kutusunu yöneten CDialog’dan türetilmiş sınıfı seçin.

·        Yeni üye değişkenle ilişkilendirilmiş kontrolü temsil eden kontrol ID’sini seçin.

·        Add Variable adlı düğmeye basın. Add Member Variable iletişim kutusu görünecektir. Kontrolün adını, kategorisini ve değişken tipini girdikten sonra OK’e tıklayın.

·        ClassWizard’ı kapatın.

 

Bir İletişim Kutusu Sınıfına Düğme Olayları Eklemek

 

            Düğmeler iletişim kutusu kaynağının parçaları olmasına ve iletişim kutusu her gösterildiğinde görünmesine rağmen düğmeler kullanılmadığında bir şey olmaz çünkü iletişim kutusu sınıfı düğme olayları karşısında ne yapılacağını bilmemektedir.

 

            Basılır düğmeler normalde bir iletişim kutusu sınıfındaki düğme olayları ile ilişkilendirilmiştir. Düğme tıklaması ile gerçekleşecek bir olayı eklemek için aşağıdaki adımları izleyin.

 

·        ClassWizard’ı açın.

·        Message Maps adlı sekmeyi seçin.

·        İlgili iletişim kutusu sınıfını seçin.

·        Nesne (Düğme) ID’sini seçin.

·        Messages liste kutusundan BN_CLICKED seçin.

·        Add Function düğmesine basın ve üye fonksiyon için önerilen varsayılan ismi kabul edin.

·        ClassWizard’ kapatın.

 

Düğmeleri Kullanılabilir Ve Kullanılamaz Hale Getirmek

 

            Çoğu kontrol varsayılan olarak başta kullanılabilir durumdadır. İlgili özellik kontrolün özellik listesinde ayarlanarak kontrol kullanılmaz hale getirilir. Bir kontrol yalnızca kullanılabilir haldeyse seçilebilir. CWnd sınıfı bir CWnd nesnesinin  kullanılabilir veya kullanılamaz olmasını sağlayan EnableWindow üye fonksiyonunu içerir. CButton ve tüm diğer kontroller CWnd sınıfından türetildiğinden CWnd sınıfındaki tüm üye verileri ve üye fonksiyonları içerirler. Bir düğmeyi şu şekilde kullanılamaz hale getirebilirsiniz.

 

                PButton -> EnableWindow(FALSE); // Kontrolü kullanılmaz hale getirir

 

            Pencere veya kontrol kullanılabilir duruma getirilecekse EnableWindow fonksiyonunun parametresi True, aksi halde False olmalıdır. EnableWindow’un parametresinin varsayılan değeri True’dur çünkü kontrolü kullanılabilir hale getirmek için bir parametre gerekmez.

 

                PButton -> EnableWindow(); // Kontrolü kullanılabilir hale getirir

 

            Düğme ve diğer kontrollerin iletişim kutusu tarafından alınan olaylara bağlı olarak kullanılabilir veya kullanılamaz hale getirilmesi yaygın bir işlemdir. Örnek olarak, bir düğmeye basmak başka bir düğmenin kullanılabilir veya kullanılamaz hale getirilmesine neden olabilir. Örneğin:

 

                void CbuttonDlg::OnBtnTest()

                {

                               static BOOL bEnableControl = FALSE;

                               m_btnAmp.EnableWindow(bEnableControl);

                               if(bEnableControl == TRUE)

                                               bEnableControl = FALSE;

                               else

                                               bEnableControl = TRUE;

                }

 

Düğmeleri Gizleme

 

            Bir iletişim kutusundaki bir düğmeyi gizlemeniz gerekebilir. CWnd sınıfı gerektiğinde bir pencereyi gizlemek veya göstermek için kullanılabilecek bir üye fonksiyonuna sahiptir. CWnd::ShowWindow üye fonksiyonunu şu şekilde kullanılır.

 

                PButton -> ShowWindow (SW_HIDE); //Kontrolü gizler

 

            Bu kod bir düğme kontrolü olan pButton penceresini gizler. Gizlenmiş bir pencereyi göstermek için ShowWindow fonksiyonu SW_SHOW parametresiyle kullanılır.

 

                PButton -> ShowWindow (SW_SHOW); //Kontrolü gösterir

 

            Bir örnekle kullanalım.

 

                void CbuttonDlg::OnBtnTest()

                {

                               static int nShowControl = SW_HIDE;

                               m_btnAmp.ShowWindow(nShowControl);

                               if(nShowControl == TRUE)

                                               nShowControl = SW_HIDE;

                               else

                                               nShowControl = SW_SHOW;

                }

 

Sekme Sırasını Tanımlama ve Ayarlama

 

            Bir iletişim kutusu kullanıcıya sunulduğunda klavye kontrollerden birinde odaklanmış olur. Bu kontrol klavyeden giriş alır. Bir kontrole odaklandığında o kontrolün etrafında noktalı bir çerçeve çizilir.

 

            Kullanıcı klavyeden Tab tuşuna basarak yeni bir kontrole odaklanabilir. Her tab tuşuna basıldığında yeni bir kontrole odaklanır. Bunun nasıl çalıştığını tam bilmiyorsanız Developer Studio’daki iletişim kutularından bazılarında bunu denemek isteyebilirsiniz.

 

            Kontroller daima sekme sırası (tab order) olarak bilinen sabit bir sırada seçilirler. Sekme sırası kullanıcıların fare kullanmadan kontrolleri seçmesine olanak sağlar. Hemen hemen tüm Windows kullanıcları fare kullanmalarına rağmen bazen klavyeyi kullanmak daha uygundur. Ayrıca Windows iletişim kutularında kontroller arasında Tab tuşuyla geçiş yapmak standart bir özellik olduğundan bu özelliği doğru kullanmanız gerekir.

 

            Bir iletişim kutusunda sekme sırasını kontrollerin kaynak kodunda tanımlandığı sırayı izler. Yeni kontroller ekledikçe bunlar sekme sırasının sonuna yerleştirilir. Bu sırayı değiştirmek için Developer Studio’nun içerdiği kaynak araçlarını kullanabilirsiniz

Düzenleme Kontrolleri

 

Devamı »