Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu genel bakışta, iletişim kutularıyla ilgili bazı programlama konuları ele alınmaktadır.
Genel bakış aşağıdaki konuları içerir.
- İletişim Kutusu Yordamları
- İletişim Kutusu Klavye Arabirimi
- İletişim Kutusu Ayarları
- Özel İletişim Kutuları
İletişim Kutusu Yordamları
İletişim kutusu yordamı, sistemin yordama ileti göndermesi için gereken bilgilere veya gerçekleştirilecek görevlere sahip olduğu bir pencere yordamına benzer. Pencere yordamının aksine, bir iletişim kutusu yordamı hiçbir zaman DefWindowProc işlevini çağırmaz. Bunun yerine, bir iletiyi işlerse TRUE, işlemezse FALSE döndürür.
Her iletişim kutusu yordamı aşağıdaki forma sahiptir:
BOOL CALLBACK DlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
// Place message cases here.
default:
return FALSE;
}
}
Yordam parametreleri, hwndDlg parametresinin iletişim kutusunun pencere tutamacını almasıyla bir pencere yordamındakiyle aynı amaca hizmet eder.
Çoğu iletişim kutusu yordamı, WM_INITDIALOG iletisini ve denetimler tarafından gönderilen WM_COMMAND iletilerini işler, ancak başka mesajları genellikle işlemez. İletişim kutusu yordamı bir iletiyi işlemezse, sistemi iletileri dahili olarak işlemeye yönlendirmek için FALSE döndürmelidir. Bu kuralın tek istisnası WM_INITDIALOG iletisidir. İletişim kutusu yordamı, sistemi WM_INITDIALOG iletisini daha fazla işlemeye yönlendirmek için TRUE değerini döndürmelidir. Her durumda, prosedür DefWindowProc'i çağırmamalıdır.
- WM_INITDIALOG İletisi
- WM_COMMAND Mesajı:
- WM_PARENTNOTIFY Mesajı
- Control-Color İletileri
- İletişim Kutusu Varsayılan İleti İşleme
WM_INITDIALOG İletisi
Sistem, iletişim kutusu yordamına WM_CREATE iletisi göndermez. Bunun yerine, iletişim kutusunu ve tüm denetimlerini oluşturduğunda ancak iletişim kutusunu görüntülemeden önce bir WM_INITDIALOG iletisi gönderir. yordam, iletişim kutusunun görevle ilişkili geçerli ayarları görüntülediğinden emin olmak için gerekli başlatma işlemlerini gerçekleştirmelidir. Örneğin, bir iletişim kutusu geçerli sürücüyü ve dizini göstermek için bir denetim içerdiğinde, yordamın geçerli sürücüyü ve dizini belirlemesi ve denetimi bu değere ayarlaması gerekir.
Yordam, SetDlgItemText ve CheckDlgButtongibi işlevleri kullanarak denetimleri başlatabilir. Denetimler windows olduğundan, yordam EnableWindow ve SetFocusgibi pencere yönetimi işlevlerini kullanarak da bunları işleyebilir. Yordam, GetDlgItem işlevini kullanarak bir denetim için pencere tutamacını elde edebilir.
İletişim kutusu yordamı, herhangi bir denetimin içeriğini, durumunu ve konumunu gerektiği gibi değiştirebilir. Örneğin, dosya adlarının liste kutusu ve Aç düğmesi içeren bir iletişim kutusunda, kullanıcı listeden bir dosya seçene kadar yordam Aç düğmesini devre dışı bırakabilir. Bu örnekte, iletişim kutusu şablonu Aç düğmesinin WS_DISABLED stilini belirtir ve sistem bu stili oluştururken düğmeyi otomatik olarak devre dışı bırakır. İletişim kutusu yordamı, liste kutusundan kullanıcının bir dosya seçtiğini belirten bir bildirim iletisi aldığında, yordam Aç düğmesini etkinleştirmek için EnableWindowişleviniçağırır.
İletişim kutusunun resim yazısı çubuğunda özel bir simge görüntülemek için, WM_INITDIALOG işleyiciniz WM_SETICON iletisini iletişim kutusuna gönderebilir.
Uygulama, DialogBoxParam, DialogBoxIndirectParam, CreateDialogParamveya CreateDialogIndirectParamişlevlerinden birini kullanarak iletişim kutusunu oluşturursa, WM_INITDIALOG mesajı için lParam parametresi, işleve geçirilen ek parametreyi içerir. Uygulamalar genellikle iletişim kutusu yordamına ek başlatma bilgilerine bir işaretçi geçirmek için bu ek parametreyi kullanır, ancak iletişim kutusu yordamı parametrenin anlamını belirlemelidir. Uygulama iletişim kutusunu oluşturmak için başka bir işlev kullanıyorsa, sistem lParam parametresini NULL olarak ayarlar.
WM_INITDIALOG iletisinden dönmeden önce yordam, giriş odağını belirli bir denetime ayarlayıp ayarlamayacağını belirlemelidir. İletişim kutusu yordamı TRUEdöndürürse, sistem giriş odağını otomatik olarak pencere tanıtıcısı wParam parametresinde denetime ayarlar. Varsayılan odağı alan denetim uygun değilse, SetFocus işlevini kullanarak odağı uygun denetime ayarlayabilir. Prosedür giriş odağını ayarlarsa, sistemin varsayılan odağı ayarlamasını önlemek için FALSE döndürmelidir. Varsayılan giriş odağını alan denetim her zaman şablonda belirtilen görünür, devre dışı değil ve WS_TABSTOP stiline sahip ilk denetimdir. Böyle bir denetim yoksa, sistem varsayılan giriş odağını şablondaki ilk denetime ayarlar.
WM_COMMAND İletisi
Bir denetim, kullanıcı denetim üzerinde bir eylem gerçekleştirdiğinde, iletişim kutusu yordamına WM_COMMAND iletisi gönderebilir. Bildirim iletileri olarak adlandırılan bu iletiler, kullanıcı girişi yordamını bilgilendirir ve uygun yanıtları gerçekleştirmesine izin verir.
Statik denetimler dışında önceden tanımlanmış tüm denetimler, seçili kullanıcı eylemleri için bildirim iletileri gönderir. Örneğin, kullanıcı düğmeye her tıkladığında basmalı düğme BN_CLICKED bildirim iletisi gönderir. Her durumda, wParam parametresinin düşük sıralı sözcüğü denetim tanımlayıcısını, wParam yüksek sıralı sözcüğü bildirim kodunu ve lParam parametresi denetim penceresi tutamacını içerir.
İletişim kutusu yordamının bildirim iletilerini izlemesi ve işlemesi gerekir. Özellikle yordam, IDOK veya IDCANCEL tanımlayıcılarına sahip iletileri işlemelidir; bu iletiler, kullanıcının iletişim kutusunu kapatma isteğini temsil eden bir iletidir. Yordam, modsal iletişim kutuları için EndDialog işlevini ve modelsiz iletişim kutuları için DestroyWindow işlevini kullanarak iletişim kutusunu kapatmalıdır.
Sistem ayrıca, iletişim kutusunun penceresi menüsü gibi bir menüsü varsa ve kullanıcı bir menü öğesine tıklarsa, iletişim kutusu yordamına WM_COMMAND iletiler gönderir. Özellikle, kullanıcı iletişim kutusunun pencere menüsündeki Kapat seçeneğine tıkladığında, sistem wParam parametresinin IDCANCEL olarak ayarlandığı bir WM_COMMAND iletisi gönderir. İleti, İptal düğmesi tarafından gönderilen bildirim iletisiyle neredeyse aynıdır ve tam olarak aynı şekilde işlenmelidir.
WM_PARENTNOTIFY İletisi
Bir kontrol, kullanıcı kontrolün üzerine gelip fare düğmesine bastığında WM_PARENTNOTIFY iletisi gönderir. Bazı uygulamalar, denetimin amacını açıklayan bir metin satırı görüntüleme gibi denetimle ilgili bir eylem gerçekleştirmek için bu iletiyi bir sinyal olarak yorumlar.
Sistem, bir pencere oluşturup yok ettiğinde de WM_PARENTNOTIFY ileti gönderir, ancak iletişim kutusu şablonundan oluşturulan denetimler için göndermez. Sistem, denetimleri oluştururken WS_EX_NOPARENTNOTIFY stilini belirterek bu iletileri engeller. Bir uygulama, iletişim kutusu için kendi denetimlerini oluşturmadığı sürece bu varsayılan davranışı geçersiz kılamaz.
Control-Color İletileri
Denetimler ve sistem, iletişim kutusu yordamının belirli bir fırça ve renk kullanarak denetimin veya başka bir pencerenin arka planını boyamasını istediklerinde denetim rengi iletileri gönderebilir. Bu, uygulamalar iletişim kutularında ve denetimlerinde kullanılan varsayılan renkleri geçersiz kıldığında yararlı olabilir. WM_CTLCOLOR iletisinin yerini alan denetim rengi iletileri aşağıdadır.
- WM_CTLCOLORBTN
- WM_CTLCOLORDLG
- WM_CTLCOLOREDIT
- WM_CTLCOLORLISTBOX
- WM_CTLCOLORSCROLLBAR
- WM_CTLCOLORSTATIC
Denetim, kendi arka planını boyamadan hemen önce dialog kutusu işlemi'ne bir kontrol rengi mesajı gönderir. İleti, yordamın hangi fırçanın kullanılacağını belirtmesine ve arka plan ve ön plan renklerini ayarlamasına olanak tanır. Prosedür, fırça tutamacını geri döndürerek bir fırça belirtir. Arka plan ve ön plan renklerini ayarlamak için yordam, kontrolün görüntü aygıtı bağlamıyla SetBkColor ve SetTextColor işlevlerini kullanır. Mesajın wParam parametresindeki işleme, bir tanıtıcının kontrol rengi mesajını görüntü cihazı bağlamına ilettiği açıklanıyor.
Sistem, yordam WM_ERASEBKGND iletisini işlemezse, iletişim kutusu yordamına bir WM_CTLCOLORDLG iletisi gönderir. Önceden tanımlanmış iletişim kutusu sınıfının bir sınıf arka plan fırçası yoktur, bu nedenle bu ileti yordamın işi gerçekleştirmek için kodu eklemek zorunda kalmadan kendi arka planını tanımlamasına olanak tanır.
Her durumda, bir iletişim kutusu yordamı denetim rengi iletisini işlemediğinde, sistem kaydırma çubukları dışındaki tüm denetim ve pencerelerin arka planını boyamak için varsayılan pencere rengine sahip bir fırça kullanır. Uygulama, COLOR_WINDOW değerini GetSysColor işlevine geçirerek varsayılan pencere rengini alabilir. Arka plan boyanırken, görüntü cihazı bağlamı için ön plan rengi varsayılan metin rengine (COLOR_WINDOWTEXT) ayarlanır. Kaydırma çubukları için sistem varsayılan kaydırma çubuğu rengine (COLOR_SCROLLBAR) sahip bir fırça kullanır. Bu durumda, ekran cihazı bağlamı için arka plan ve ön plan renkleri sırasıyla beyaz ve siyah olarak ayarlanır.
İletişim Kutusu Varsayılan İleti İşleme
Önceden tanımlanmış iletişim kutusu sınıfının pencere yordamı, iletişim kutusu yordamının işlemediği tüm iletiler için varsayılan işlemeyi yürütür. İletişim kutusu yordamı herhangi bir ileti için FALSE döndürdüğünde, önceden tanımlanmış pencere yordamı iletileri denetler ve aşağıdaki varsayılan eylemleri gerçekleştirir:
| İleti | Varsayılan eylem |
|---|---|
| DM_GETDEFID | Bu iletiyi bir iletişim kutusuna gönderebilirsiniz. Eğer iletişim kutusunda varsa, varsayılan basma düğmesinin denetim tanımlayıcısını döndürür; aksi takdirde sıfır döndürür. |
| DM_REPOSITION | Bu iletiyi en üst düzey iletişim kutusuna gönderebilirsiniz. İletişim kutusu kendisini masaüstü alanına sığacak şekilde yeniden konumlandırır. |
| DM_SETDEFID | Bu iletiyi bir iletişim kutusuna gönderebilirsiniz. İletişim kutusu, varsayılan basma düğmesini wParam parametresindeki denetim tanımlayıcısı tarafından belirtilen denetime ayarlar. |
| WM_ACTIVATE | İletişim kutusu etkinleştirilirse, giriş odağını önceden kaydedilmiş tanıtıcı tarafından tanımlanan denetime geri yükler. Aksi takdirde, prosedür, tanıtıcı bilgiyi giriş odağına sahip denetime kaydeder. |
| WM_CHARTOITEM | Sıfır döndürür. |
| WM_CLOSE | BN_CLICKED bildirim iletisini iletişim kutusuna gönderip IDCANCEL denetim tanımlayıcısı olarak belirtir. İletişim kutusunda IDCANCEL denetim tanımlayıcısı varsa ve denetim şu anda devre dışıysa, yordam bir uyarı sesi çıkarır ve iletiyi göndermez. |
| WM_COMPAREITEM | Sıfır döndürür. |
| WM_ERASEBKGND | WM_CTLCOLORDLG iletisinden döndürülen fırçayı veya varsayılan pencere rengini kullanarak diyalog kutusu istemci alanını doldurur. |
| WM_GETFONT | Uygulama tarafından tanımlanan iletişim kutusu fontuna bir tanıtıcı döndürür. |
| WM_INITDIALOG | Sıfır döndürür. |
| WM_LBUTTONDOWN | Giriş odağını içeren birleşik giriş kutusuna bir CB_SHOWDROPDOWN iletisi gönderir ve denetimi açılan liste kutusunu gizlemeye yönlendirir. Prosedür, varsayılan eylemi tamamlamak için DefWindowProc çağırır. |
| WM_NCDESTROY | İletişim kutusundaki düzenleme denetimleri için ayrılan genel belleği serbest bırakır (DS_LOCALEDIT stilini belirten iletişim kutuları için geçerlidir) ve uygulama tanımlı yazı tiplerini serbest bırakır (DS_SETFONT veya DS_SHELLFONT stilini belirten iletişim kutuları için geçerlidir). Yordam, varsayılan eylemi tamamlamak için DefWindowProc işlevini çağırır. |
| WM_NCLBUTTONDOWN | Giriş odağını içeren birleşik giriş kutusuna bir CB_SHOWDROPDOWN iletisi gönderir ve denetimi açılan liste kutusunu gizlemeye yönlendirir. Yordam, varsayılan eylemi tamamlamak için DefWindowProc'ü çağırır. |
| WM_NEXTDLGCTL | Giriş odağını iletişim kutusundaki sonraki veya önceki denetime, wParam parametresindeki tanıtıcı tarafından tanımlanan denetime veya iletişim kutusundaki görünür, devre dışı olmayan ve WS_TABSTOP stiline sahip ilk denetime ayarlar. Giriş odağını içeren geçerli pencere bir denetim değilse yordam bu iletiyi yoksayar. |
| WM_SETFOCUS | Giriş odağını önceden kaydedilmiş bir denetim penceresi tutamacı tarafından tanımlanan denetime ayarlar. Böyle bir tanıtıcı yoksa, yordam giriş odağını iletişim kutusu şablonunda görünen, devre dışı olmayan ve WS_TABSTOP stiline sahip ilk denetime ayarlar. Böyle bir denetim yoksa, işlem giriş odağını şablondaki ilk denetime ayarlar. |
| WM_SHOWWINDOW | İletişim kutusu gizleniyorsa, giriş odağına sahip kontrolün tutamacını kaydeder ve ardından varsayılan işlemi tamamlamak için DefWindowProc çağırır. |
| WM_SYSCOMMAND | İletişim kutusu simge durumuna küçültüldüyse giriş odağına sahip denetime bir tanıtıcı kaydeder, ardından varsayılan eylemi tamamlamak için DefWindowProc çağırır. |
| WM_VKEYTOITEM | Sıfır döndürür. |
Önceden tanımlanmış pencere yordamı, varsayılan işleme için diğer tüm iletileri DefWindowProc geçirir.
İletişim Kutusu Klavye Arabirimi
Sistem, çeşitli tuşlar için özel işleme gerçekleştiren iletişim kutuları için özel bir klavye arabirimi sağlar. Arabirim, iletişim kutusundaki belirli düğmelere karşılık gelen iletiler oluşturur veya giriş odağını bir denetimden diğerine değiştirir. Bu arabirimde kullanılan anahtarlar ve bunların ilgili eylemleri aşağıdadır.
| Anahtar | Eylem |
|---|---|
| ALT+hatırlatıcı | Giriş odağını, belirtilen anımsatıcıyı içeren statik denetimden sonraki ilk denetime (WS_TABSTOP stiline sahip) taşır. |
| AŞAĞI | Giriş odağını gruptaki bir sonraki denetime taşır. |
| GİRMEK | WM_COMMAND iletisini iletişim kutusu yordamına gönderir. wParam parametresi, varsayılan onay düğmesinin IDOK veya denetim tanımlayıcısı olarak ayarlanır. |
| ESC | İletişim kutusu yordamına bir WM_COMMAND iletisi iletir. wParam parametresi IDCANCEL olarak ayarlanır. |
| SOL | Giriş odağını gruptaki önceki denetime taşır. |
| anımsatıcı | Giriş odağını, belirtilen anımsatıcıyı içeren statik denetimden sonraki ilk denetime (WS_TABSTOP stiline sahip) taşır. |
| SAĞ | Giriş odağını gruptaki bir sonraki denetime taşır. |
| SHIFT+TAB | Giriş odağını WS_TABSTOP stiline sahip önceki denetime taşır. |
| SEKME | Giriş odağını WS_TABSTOP stiline sahip bir sonraki denetime taşır. |
| YUKARI | Giriş odağını gruptaki önceki denetime taşır. |
Sistem, tüm kalıcı iletişim kutuları için klavye arabirimini otomatik olarak sağlar. Uygulama, ana ileti döngüsündeki iletileri filtrelemek için IsDialogMessage işlevini çağırmadığı sürece, modeless iletişim kutuları için arabirimi sağlamaz. Bu, uygulamanın iletiyi ileti kuyruğundan aldıktan hemen sonra IsDialogMessage iletmesi gerektiği anlamına gelir. İşlev, iletişim kutusu içinse iletileri işler ve iletinin işlendiğini ve TranslateMessage veya DispatchMessageişlevinegeçirilmemesi gerektiğini belirtmek için sıfır olmayan bir değer döndürür.
İletişim kutusu klavye arabirimi bir iletişim kutusundaki denetimler arasında hareket etmek için yön tuşlarını kullandığından, uygulama bu tuşları kullanarak IsDialogMessage çağrılan kalıcı iletişim kutularının veya modsuz iletişim kutularının içeriğini kaydıramaz. bir iletişim kutusunda kaydırma çubukları olduğunda, uygulamanın kaydırma çubukları için alternatif bir klavye arabirimi sağlaması gerekir. Sistem bir fare içerdiğinde kaydırma için fare arabiriminin kullanılabilir olduğunu unutmayın.
WS_TABSTOP Stili
WS_TABSTOP stili, kullanıcının SEKME tuşuna veya SHIFT+SEKME tuşlarına basarak taşıyabileceği denetimleri belirtir.
Kullanıcı SEKME veya SHIFT+SEKME tuşlarına bastığında, sistem önce bu tuşların şu anda giriş odağı olan denetim tarafından işlenip işlenmeyeceğini belirler. Denetime bir WM_GETDLGCODE iletisi gönderir ve denetim DLGC_WANTTAB döndürürse sistem anahtarları denetime geçirir. Aksi takdirde sistem, görünür, devre dışı değil ve WS_TABSTOP stiline sahip bir sonraki denetimi bulmak için GetNextDlgTabItemişlevini kullanır. Arama, denetimin şu anda giriş odağına sahip olmasıyla başlar ve denetimlerin oluşturulduğu sırayla( yani iletişim kutusu şablonunda tanımlanma sırasıyla) devam eder. Sistem gerekli özelliklere sahip bir denetimi bulursa, giriş odağını buna taşır.
WS_TABSTOP stiline sahip bir sonraki denetim için yapılan aramada WS_EX_CONTROLPARENT stiline sahip bir pencereyle karşılaşılırsa, sistem pencerenin alt öğelerini yinelemeli olarak arar.
Bir uygulama, WS_TABSTOP stiline sahip denetimleri bulmak için GetNextDlgTabItemde kullanabilir. İşlev, giriş odağını taşımadan WS_TABSTOP stiline sahip sonraki veya önceki denetimin pencere tutamacını alır.
WS_GROUP Tarzı
Varsayılan olarak, kullanıcı bir yön tuşuna her bastığında sistem giriş odağını sonraki veya önceki denetime taşır. Giriş odağına sahip geçerli denetim bu tuşları işlemediği ve sonraki veya önceki denetim statik bir denetim olmadığı sürece, kullanıcı yön tuşlarına basmaya devam ettikçe sistem giriş odağını iletişim kutusundaki tüm denetimler arasında taşımaya devam eder.
Bir uygulama, bu varsayılan davranışı değiştirmek için WS_GROUP stilini kullanabilir. Stil, bir denetim grubunun başlangıcını işaretler. Kullanıcı yön tuşlarına basmaya başladığında gruptaki bir denetimde giriş odağı varsa, odak grupta kalır. Genel olarak, bir gruptaki ilk denetimin WS_GROUP stiline sahip olması ve gruptaki diğer tüm denetimlerin bu stile sahip olmaması gerekir. Gruptaki tüm denetimler bitişik olmalıdır; diğer bir deyişle, bunlar hiçbir araya gelen denetim olmadan art arda oluşturulmuş olmalıdır.
Kullanıcı bir yön tuşuna bastığında, sistem önce giriş odağını içeren geçerli denetimin yön tuşlarını işleyip işlemediğini belirler. Sistem denetime bir WM_GETDLGCODE iletisi gönderir ve denetim DLGC_WANTARROWS değerini döndürürse anahtarı denetime geçirir. Aksi takdirde sistem, gruptaki bir sonraki denetimi belirlemek için GetNextDlgGroupItemişlevini kullanır.
GetNextDlgGroupItem denetimleri oluşturuldukları sırayla (veya ters sırada) arar. Kullanıcı RIGHT veya DOWN tuşuna basarsa, GetNextDlgGroupItem, denetimin WS_GROUP stiline sahip olmaması durumunda sonraki denetimi döndürür. Aksi takdirde, işlev aramanın sırasını tersine çevirir ve WS_GROUP stiline sahip ilk denetimi döndürür. Kullanıcı LEFT veya UP tuşuna basarsa, geçerli denetim WS_GROUP stiline sahip olmadığı sürece işlev önceki denetimi döndürür. Geçerli denetim bu stile sahipse, işlev aramanın sırasını tersine çevirir, WS_GROUP stiline sahip ilk denetimi bulur ve bulunan denetimin hemen önündeki denetimi döndürür.
Gruptaki bir sonraki denetim için yapılan aramada WS_EX_CONTROLPARENT stiline sahip bir pencereyle karşılaşılırsa sistem, pencerenin alt öğelerini yinelemeli olarak arar.
Sistem sonraki veya önceki denetime sahip olduktan sonra, denetim türünü belirlemek için denetime bir WM_GETDLGCODE iletisi gönderir. Sistem daha sonra giriş odağını statik bir denetim olup olmadığını denetlemek için taşır. Denetim otomatik bir radyo düğmesiyse, sistem ona bir BM_CLICK iletisi gönderir. Bir uygulama, bir gruptaki denetimleri bulmak için GetNextDlgGroupItemde kullanabilir.
Genel olarak, gruptaki ilk denetim WS_GROUP ve WS_TABSTOP stillerini birleştirir, böylece kullanıcı SEKME tuşunu kullanarak gruptan gruba geçebilir. Grup radyo düğmeleri içeriyorsa, uygulama yalnızca gruptaki ilk denetime WS_TABSTOP stilini uygulamalıdır. Kullanıcı gruptaki denetimler arasında hareket ettiğinde sistem stili otomatik olarak taşır. Bu, kullanıcı SEKME tuşunu kullanarak gruba geçtiğinde giriş odağının her zaman en son seçilen denetimde olmasını sağlar.
Anımsatıcı
Anımsatıcı, bir düğmenin etiketinde veya statik kontrolün metninde seçili bir harf veya basamaktır. Sistem, kullanıcı anımsatıcıya karşılık gelen tuşa her bastığında veya bu tuşla ALT tuşuna birlikte bastığında giriş odağını anımsatıcıyla ilişkili denetime taşır. Anımsatıcılar, kullanıcının klavyeyi kullanarak belirli bir denetime geçmesi için hızlı bir yol sağlar.
Uygulama, denetimin etiketine veya metnine seçili harf veya rakamdan hemen önce ve işareti (&) ekleyerek denetim için bir anımsatıcı oluşturur. Çoğu durumda, iletişim kutusu şablonundaki denetimle sağlanan null ile sonlandırılan dize ve işaretini içerir. Ancak bir uygulama, SetDlgItemText işlevini kullanarak denetimin mevcut etiketini veya metnini değiştirerek istediğiniz zaman bir anımsatıcı oluşturabilir. Her denetim için yalnızca bir anımsatıcı belirtilebilir. Önerilse de, iletişim kutusundaki anımsatıcıların benzersiz olması gerekmez.
Kullanıcı bir harf veya basamak tuşuna bastığında, sistem önce giriş odağını içeren geçerli denetimin anahtarı işleyip işlemediğini belirler. Sistem denetime bir WM_GETDLGCODE iletisi gönderir ve denetim DLGC_WANTALLKEYS veya DLG_WANTMESSAGE değerini döndürürse, sistem anahtarı denetime geçirir. Aksi takdirde, anımsatıcısı belirtilen harf veya rakamla eşleşen bir denetim arar. Bir denetimi bulana veya tüm denetimleri inceleyene kadar aramaya devam eder. Arama sırasında, SS_NOPREFIX stiline sahip tüm statik denetimleri atlar.
Eşleşen bir kısayol tuşuna (mnemonik) sahip bir denetim araması WS_EX_CONTROLPARENT stiline sahip bir pencereyle karşılaşırsa, sistem pencerenin alt öğelerini rekürsif olarak arar.
Sistem bir statik denetim bulursa ve denetim devre dışı bırakılmazsa, sistem giriş odağını görünür olan, devre dışı bırakılmayan ve WS_TABSTOP stiline sahip statik denetimden sonraki ilk denetime taşır. Sistem eşleşen bir anımsatıcıya sahip başka bir denetim bulursa, giriş odağını bu denetime taşır. Denetim varsayılan bir seçmeli düğme ise, sistem iletişim kutusu yordamına bir BN_CLICKED bildirim iletisi gönderir. Denetim başka bir düğme stiliyse ve iletişim kutusunda aynı anımsatıcıya sahip başka bir denetim yoksa, sistem denetime BM_CLICK iletisini gönderir.
İletişim Kutusu Ayarları
İletişim kutusu ayarları, iletişim kutusundaki denetimlerin geçerli seçimleri ve değerleridir. İletişim kutusu yordamı, iletişim kutusu oluşturulduğunda kontrolleri bu ayarlara başlatmaktan sorumludur. Ayrıca, iletişim kutusunu yok etmeden önce denetimlerden geçerli ayarları almaktan da sorumludur. Ayarları başlatmak ve almak için kullanılan yöntemler denetimin türüne bağlıdır.
Daha fazla bilgi için aşağıdaki konulara bakın:
- Radyo Düğmeleri ve Onay Kutuları
- İletişim Kutusu Düzenleme Denetimleri
- Liste Kutuları, Birleşik Giriş Kutuları ve Dizin Listeleri
- İletişim Kutusu denetim iletileri
Radyo Düğmeleri ve Onay Kutuları
İletişim kutuları, kullanıcının bir seçenek listesinden seçim yapmasına izin vermek için radyo düğmelerini ve onay kutularını kullanır. Radyo düğmeleri kullanıcının birbirini dışlayan seçenekler arasından seçim yapmasına olanak tanır; onay kutuları kullanıcının seçeneklerin bir bileşimini seçmesine olanak tanır.
İletişim kutusu yordamı, onay kutusunu ayarlayan veya temizleyen CheckDlgButton işlevini kullanarak onay kutusunun ilk durumunu ayarlayabilir. Birbirini dışlayan radyo düğmeleri grubundaki radyo düğmeleri için, iletişim kutusu yordamı uygun radyo düğmesini ayarlamak ve diğer radyo düğmelerini otomatik olarak temizlemek için CheckRadioButtonişlevini kullanabilir.
İletişim kutusu sonlandırilmeden önce, iletişim kutusu yordamı, düğmenin geçerli durumunu döndüren IsDlgButtonChecked işlevini kullanarak her radyo düğmesinin ve onay kutusunun durumunu denetleyebilir. bir iletişim kutusu genellikle bu bilgileri kaydederek iletişim kutusunu bir sonraki oluşturma işleminde düğmeleri başlatır.
İletişim Kutusu Düzenleme Denetimleri
Birçok iletişim kutusunda kullanıcının giriş olarak metin sağlamasına olanak sağlayan düzenleme denetimleri vardır. çoğu iletişim kutusu yordamı, iletişim kutusu ilk kez başlatıldığında bir düzenleme denetimi başlatır. Örneğin, iletişim kutusu yordamı, kullanıcının seçip değiştirebileceği veya yerine yenisini koyabileceği bir önerilen dosya adını kontrol içine yerleştirebilir. İletişim kutusu yordamı, belirli bir arabellekteki metni düzenleme denetimine kopyalayan SetDlgItemText işlevini kullanarak düzenleme denetimindeki metni ayarlayabilir. Düzenleme denetimi giriş odağını aldığında, düzenleme için metnin tamamını otomatik olarak seçer.
İletişim kutusu yordamının metni sonlandırmadan önce geri alması gerektiğinden, düzenleme denetimleri metni otomatik olarak iletişim kutusuna geri döndürmez. GetDlgItemText işlevini kullanarak düzenleme kontrolü metnini bir arabelleğe kopyalayarak metni elde edebilir. İletişim kutusu yordamı genellikle düzenleme denetimini daha sonra başlatmak için bu metni kaydeder veya işlenmek üzere üst pencereye geçirir.
Bazı iletişim kutuları, kullanıcının sayı girmesini sağlayan düzenleme denetimlerini kullanır. İletişim kutusu yordamı, düzenleme denetiminden metin alan ve metni ondalık değere dönüştüren GetDlgItemInt işlevini kullanarak düzenleme denetiminden bir sayı alabilir. Kullanıcı sayıyı ondalık rakamlarla yazar. İmzalı veya imzasız olabilir. İletişim kutusu yordamı, SetDlgItemInt işlevini kullanarak bir tamsayı görüntüleyebilir. SetDlgItemInt, imzalı veya imzasız bir tamsayıyı ondalık basamaklardan oluşan bir dizeye dönüştürür.
Liste Kutuları, Birleşik Giriş Kutuları ve Dizin Listeleri
Bazı iletişim kutularında, kullanıcının bir veya daha fazla ad seçebileceği ad listeleri görüntülenir. Örneğin, bir dosya adlarının listesini görüntülemek için, iletişim kutusunda genellikle bir liste kutusu ve DlgDirList ve DlgDirSelectEx işlevleri kullanılır. DlgDirList işlevi otomatik olarak bir liste kutusunu geçerli dizindeki dosya adlarıyla doldurur. DlgDirSelect işlevi, seçili dosya adını liste kutusundan alır. Bu iki işlev birlikte, kullanıcının adını ve konumunu yazmak zorunda kalmadan bir dosya seçebilmesi için bir iletişim kutusunun dizin listesini görüntülemesi için kullanışlı bir yol sağlar.
İletişim kutusu, dosya adlarının listesini görüntülemek için bir kombinasyon kutusu da kullanabilir. DlgDirListComboBox işlevi, birleşik giriş kutusunun liste kutusu bölümünü, geçerli klasördeki dosya adlarıyla otomatik olarak doldurur. DlgDirSelectComboBoxEx işlevi, liste kutusu bölümünden seçili bir dosya adını alır.
İletişim Kutusu Denetim İletileri
Birçok denetim, denetimler tarafından alındığında bazı eylemleri gerçekleştirmelerine neden olan önceden tanımlanmış iletileri tanır. Örneğin, BM_SETCHECK iletisi onay kutusunu ayarlar ve EM_GETSEL iletisi denetimin metninin seçili olan bölümünü alır. Denetim iletileri, denetimlere standart işlevlerden daha fazla ve daha esnek bir erişim sağlar, bu nedenle iletişim kutusu kullanıcıyla karmaşık etkileşimler gerektirdiğinde genellikle kullanılır.
İletişim kutusu yordamı, denetim tanımlayıcısını sağlayarak ve SendMessage işleviyle aynı olan SendDlgItemMessage işlevini kullanarak, iletiyi alacak denetimi tanımlamak için pencere tutamacı yerine denetim tanımlayıcısı kullanması dışında bir denetime ileti gönderebilir. Belirtilen bir mesaj, iletişim kutusu prosedürünün mesajla birlikte parametre göndermesini gerektirebilir ve mesajın buna karşılık gelen dönüş değerleri olabilir. Her denetim iletisinin işlemi ve gereksinimleri, iletinin amacına ve bunu işleyen denetime bağlıdır.
Denetim iletileri hakkında daha fazla bilgi için bkz. Windows denetimleri.
Özel İletişim Kutuları
Bir uygulama, önceden tanımlanmış iletişim kutusu sınıfı yerine iletişim kutuları için uygulama tanımlı bir pencere sınıfı kullanarak özel iletişim kutuları oluşturabilir. Uygulamalar genellikle bir iletişim kutusu kendi ana penceresi olduğunda bu yöntemi kullanır, ancak standart örtüşen pencerelere sahip uygulamalar için kalıcı ve modsuz iletişim kutuları oluşturmak için de yararlıdır.
Uygulama tanımlı pencere sınıfı, uygulamanın iletişim kutusu için bir pencere yordamı tanımlamasına ve iletileri iletişim kutusu yordamına göndermeden önce işlemesine olanak tanır. Ayrıca uygulamanın bir sınıf simgesi, bir sınıf arka plan fırçası ve iletişim kutusu için bir sınıf menüsü tanımlamasına da olanak tanır. Uygulamanın bir iletişim kutusu oluşturmaya çalışmadan önce pencere sınıfını kaydetmesi ve iletişim kutusu şablonuna pencere sınıfının atom değerini veya adını sağlaması gerekir.
Birçok uygulama, önce önceden tanımlanmış iletişim kutusu sınıfının sınıf bilgilerini alıp WNDCLASS yapısını bilgilerle dolduran GetClassInfo işlevine geçirerek yeni bir iletişim kutusu sınıfı oluşturur. Uygulama, sınıfın adı, fırçası ve simgesi gibi tek tek yapı üyelerini değiştirir, ardından RegisterClass işlevini kullanarak yeni sınıfı kaydeder. Bir uygulama WNDCLASS yapısını kendi başına doldurursa, cbWndExtra üyesini DLGWINDOWEXTRAolarak ayarlamalıdır. Bu, sistemin her iletişim kutusu için gereken ek bayt sayısıdır. Bir uygulama her iletişim kutusu için ek bayt da kullanıyorsa, sistemin gerektirdiği fazladan baytların ötesinde olmalıdır.
Özel iletişim kutusunun pencere yordamı, diğer pencere yordamlarıyla aynı parametrelere ve gereksinimlere sahiptir. Ancak diğer pencere yordamlarından farklı olarak, bu iletişim kutusunun pencere yordamı, işlemediği iletiler için DefWindowProc işlevi yerine DefDlgProc işlevini çağırmalıdır. DefDlgProc, iletişim kutusu yordamını çağırmayı içeren önceden tanımlanmış iletişim kutusunun pencere yordamıyla aynı varsayılan ileti işlemeyi yürütür.
Bir uygulama, önceden tanımlanmış iletişim kutusunun pencere yordamını alt sınıflara ayırarak özel iletişim kutuları da oluşturabilir. SetWindowLong işlevi, bir uygulamanın belirtilen pencere için pencere yordamını belirtmesine olanak tanır. Uygulama, SetClassLong işlevini kullanarak da alt sınıf kullanmaya çalışabilir, ancak bunu yapmak yalnızca uygulamaya ait olanları değil sistemdeki tüm iletişim kutularını etkiler.
Özel iletişim kutuları oluşturan uygulamalar bazen iletişim kutuları için alternatif bir klavye arabirimi sağlar. Modeless iletişim kutuları için bu, uygulamanın IsDialogMessage işlevini çağırmadığı ve bunun yerine özel pencere yordamındaki tüm klavye girişlerini işlediği anlamına gelebilir. Böyle durumlarda uygulama, giriş odağını bir denetimden diğerine taşımak için gereken kodu en aza indirmek için WM_NEXTDLGCTL iletisini kullanabilir. Bu mesaj, DefDlgProciletildiğinde, giriş odağını belirtilen denetime taşır ve denetimlerin görünümünü güncelleyerek varsayılan butonun kenarlığını taşır veya bir radyo düğmesini otomatik olarak seçer.