İleti Eşleme Aralıkları için İşleyiciler
Bu makalede, bir ileti aralığını tek bir ileti işleyici işleviyle eşleme (bir iletiyi yalnızca bir işleve eşlemek yerine) açıklanmaktadır.
Birden fazla iletiyi veya denetim bildirimini tam olarak aynı şekilde işlemeniz gereken zamanlar vardır. Böyle durumlarda, tüm iletileri tek bir işleyici işleviyle eşlemek isteyebilirsiniz. İleti eşleme aralıkları, bitişik bir ileti aralığı için bunu yapmanıza olanak sağlar:
Komut kimliklerinin aralıklarını şu şekilde eşleyebilirsiniz:
Bir komut işleyici işlevi.
Bir komut güncelleştirme işleyici işlevi.
Bir dizi denetim kimlikleri için denetim bildirimi iletilerini bir ileti işleyici işleviyle eşleyebilirsiniz.
Bu makalede ele alınan konular şunlardır:
İleti Eşleme Girdisi Yazma
İçinde. CPP dosyası, aşağıdaki örnekte gösterildiği gibi ileti eşlemesi girdinizi ekleyin:
ON_COMMAND_RANGE(ID_MYCMD_ONE, ID_MYCMD_TEN, &OnDoSomething)
İleti eşleme girdisi aşağıdaki öğelerden oluşur:
İleti eşleme aralığı makros:
Makro parametreleri:
İlk iki makro üç parametre alır:
Aralığı başlatan komut kimliği
Aralığı sona erdiren komut kimliği
İleti işleyici işlevinin adı
Komut kimlikleri aralığı bitişik olmalıdır.
Üçüncü makro,
ON_CONTROL_RANGE
ek bir ilk parametre alır: EN_CHANGE gibi bir denetim bildirimi iletisi.
İşleyici İşlevini Bildirme
İşleyici işlev bildiriminizi içine ekleyin. H dosyası. Aşağıdaki kod, aşağıda gösterildiği gibi bunun nasıl görünebileceğini gösterir:
public:
afx_msg void OnDoSomething(UINT nID);
Tek komutlar için işleyici işlevleri normalde parametre almaz. Güncelleştirme işleyici işlevleri dışında, ileti eşleme aralıkları için işleyici işlevleri UINT türünde ek bir parametre (nID) gerektirir. Bu parametre ilk parametredir. Extra parametresi, kullanıcının gerçekte hangi komutu seçtiğini belirtmek için gereken ek komut kimliğini içerir.
İşleyici işlevlerini güncelleştirmeye yönelik parametre gereksinimleri hakkında daha fazla bilgi için bkz . Komut Kimlikleri Aralığı Örneği.
Komut Kimlikleri Aralığı örneği
Aralıkları ne zaman kullanabilirsiniz? Bir örnek, MFC örnek HIERSVR içindeki Yakınlaştır komutu gibi komutları işlemektir. Bu komut görünümü yakınlaştırarak normal boyutunun %25 ile %300'ü arasında ölçeklendir. HIERSVR'ın görünüm sınıfı, Yakınlaştırma komutlarını işlemek için şuna benzeyen bir ileti eşleme girdisiyle bir aralık kullanır:
ON_COMMAND_RANGE(ID_VIEW_ZOOM25, ID_VIEW_ZOOM300, &OnZoom)
İleti eşleme girdisini yazarken şunları belirtirsiniz:
Bitişik aralığın başlangıcı ve bitişi olan iki komut kimlikleri.
Burada ID_VIEW_ZOOM25 ve ID_VIEW_ZOOM300.
Komutlar için işleyici işlevinin adı.
İşte
OnZoom
burada.
İşlev bildirimi şuna benzer olacaktır:
public:
afx_msg void OnZoom(UINT nID);
Güncelleştirme işleyicisi işlevleri benzerdir ve büyük olasılıkla daha fazla yararlı olacaktır. Bir dizi komut için işleyici yazmak ON_UPDATE_COMMAND_UI
ve aynı kodu tekrar tekrar yazarken veya kopyalarken bulmak oldukça yaygındır. Çözüm, makroyu kullanarak bir komut kimlikleri aralığını bir güncelleştirme işleyici işleviyle eşlemektir ON_UPDATE_COMMAND_UI_RANGE
. Komut kimlikleri bitişik bir aralık oluşturmalıdır. Örneğin, HIERSVR örneğinin OnUpdateZoom
görünüm sınıfında işleyiciye ve ON_UPDATE_COMMAND_UI_RANGE
ileti eşleme girdisine bakın.
Tek komutlar için işleyici işlevlerini güncelleştirme normalde türünde CCmdUI*
tek bir parametre (pCmdUI) alır. İşleyici işlevlerinden farklı olarak, ileti eşleme aralıkları için güncelleştirme işleyici işlevleri, UINT türünde ek bir parametre (nID) gerektirmez. Kullanıcının gerçekte hangi komutu seçtiğini belirtmek için gereken komut kimliği nesnesinde CCmdUI
bulunur.
Denetim Kimlikleri Aralığı örneği
Başka bir ilginç durum, bir dizi denetim kimliği için denetim bildirimi iletilerini tek bir işleyiciyle eşlemektir. Kullanıcının 10 düğmeden birine tıklayabildiğini varsayalım. 10 düğmenin tümünü bir işleyiciyle eşlemek için ileti eşleme girdiniz şöyle görünür:
ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON1, IDC_BUTTON10, OnButtonClicked)
makroyu ON_CONTROL_RANGE
ileti eşlemenize yazarken şunları belirtirsiniz:
Belirli bir denetim bildirimi iletisi.
İşte BN_CLICKED.
Bitişik denetim aralığıyla ilişkili denetim kimliği değerleri.
Bunlar IDC_BUTTON1 ve IDC_BUTTON10.
İleti işleyici işlevinin adı.
İşte
OnButtonClicked
burada.
İşleyici işlevini yazarken, aşağıdaki gibi ek UINT parametresini belirtin:
void CRangesView::OnButtonClicked(UINT nID)
{
int nButton = nID - IDC_BUTTON1;
ASSERT(nButton >= 0 && nButton < 10);
// ...
}
OnButtonClicked
Tek bir BN_CLICKED iletisinin işleyicisi parametre almaz. Bir dizi düğme için aynı işleyici bir UINT alır. Ek parametre, BN_CLICKED iletisini oluşturmakla sorumlu olan denetimin tanımlanmasını sağlar.
Örnekte gösterilen kod tipiktir: ileti aralığı içinde bir int
değerine geçirilen değeri dönüştürme ve durumun bu olduğunu onaylama. Ardından, tıklanan düğmeye bağlı olarak farklı eylemler gerçekleştirebilirsiniz.