2009-03-01 20 views
4

Windows'ta MFC kullanılarak yazılmış bir uygulama var. Menü öğelerinin etkinleştirme/devre dışı durumu çok fazla duruma bağlıdır. Örneğin, A koşulunun yerine getirilmesi durumunda menü öğesini etkinleştirmem gerekiyor VEYA eğer B durumu uygunsa, ancak A ve B'nin ikisi de aynı anda TRUE ise devre dışı bırakılmalıdır. Bunu kodda nasıl modelliyoruz? Sanırım bir çeşit devlet makinesini kullanmalıyım, ama eyalet makinem çok fazla devlet içermekte gibi görünüyor. Bu tür sorunları ele almanın genel yolu nedir? Yukarıdakilerin sadece bir örnek olduğunu, bunun gibi daha birçok koşul olacağını unutmayın. Ayrıca, menüyü her zaman etkin tutma seçeneği ve kullanıcı bastığında bir hata mesajı gösterme seçeneği, menüyü devre dışı bırakmam gerekmediği için mevcut değildir.UI durumunun işlenmesi

Netleştirmek gerekirse, MFC'de menü öğelerinin nasıl devre dışı bırakılacağını değil, aralarında çok sayıda bağımlı durum olduğunda bir menü öğesinin etkin/devre dışı bırakılıp bırakılmayacağına karar vermenin en iyi yolu nedir? alakalıdır.

cevap

0

Her UI eyleminden sonra çağrılan bir yöntem, updateUIStatus() yazmayı deneyin. Bu yöntem, koşullarınıza göre menü öğesinin (ve diğer herhangi bir UI bileşeninin) etkin veya devre dışı durumunu ayarlar.

tüm UI devlet güncellemelerini yapmak için tek yöntem olması hakkında güzel bir şey if (condition A && condition B) menu.setEnabled(true);

+0

Downside, ancak, büyük bir iş mantığı yöntemi sahip olma riski olurdu :( – cwap

+0

Ben de bunu düşündüm, ama UI tarafında olduğundan, bu gerçekten iş mantığı değil. Orada kararlar, sonra diğer sınıflar için çağrılar yapılmalıdır (yani, bazı iş mantığı sınıfında "isOptionValid()" çağrısı) –

+0

Alınan nokta - Gerçekten iş mantığı değil, "ui mantığı" gibi .. – cwap

0

MFC vardır, bunun yerine diyelim ki, birden fazla çağrı kalmadan, tek bir yerde bu mantığın tüm merkezileştirmek olmasıdır yerleşik bir Komut yönlendirme ve ON_UPDATE_COMMAND_UI makrosu biçimindeki menü öğelerini etkinleştirme ve devre dışı bırakma mekanizması. Daha fazla bilgi için, MSDN'deki How to: Update User-Interface Objects ve CCmdUI sınıf belgelerine bakın.

Bir eyalet makinesine ihtiyacınız yok. Her menü komutu için, komutun, örneğin belgenizde, görünümde veya ana çerçeve sınıfında ele alınması gerektiğine karar verin, ardından bir OnUpdate işleyicisini uygulayın ve uygun sınıf için bir ON_UPDATE_COMMAND_UI ileti eşleme girdisi ekleyin. Örnek olarak, this question'a verdiğim yanıta bir bakın.

+0

ON_UPDATE_COMMAND_UI, yalnızca nispeten kolay olan menüler ve araç çubuğu için işlenir. Ana konu, ON_UPDATE_COMMAND_UI'nin işlem yapmadığı iletişim kutusundaki kontrollerin nasıl etkinleştirileceği/devre dışı bırakılacağıdır. – zar

İlgili konular