Fare düğmesi yayımlandıktan sonra kaydırma çubuğu kaydırmaya devam eder

Belirtiler

Farenin sol düğmesini bıraktığınızda, kaydırma çubuğu sürekli olarak kayar. Kaydırma çubuğunun türü bu sorun için ilgisiz, yani aynı sorun, kaydırma çubuğunun pencerenin parçası veya kaydırma çubuğu denetimi olmasına bakılmaksızın aynı sorun oluşur.

Neden

Bu sorun genellikle, kaydırma çubuğu bildirim iletilerinden birini alırken ortaya çıkan eylemlerin sonucu olarak ileti alma döngüsü yürütüldüğünde oluşur. Kaydırma sırasında, Windows 'da iç ileti alma döngüsü başlatılır. Bu ileti döngüsünün görevi, kaydırmayı izlemek ve uygun kaydırma çubuğu bildirim iletilerini göndermek için WM_HSCROLL ve WM_VSCROLL. WM_LBUTTONUP alındıktan sonra kaydırma sonlandırılır. Kaydırma sırasında başka bir ileti döngüsü başlatılırsa, WM_LBUTTONUP bu ileti döngüsü tarafından alınır ve uygulamanın kaydırma çubuğunun iç ileti alma döngüsüne erişimi yoktur WM_LBUTTONUP doğru şekilde gönderilemiyor. Bu nedenle WM_LBUTTONUP iç ileti Retriever tarafından hiç alınmayacaktır ve kaydırma hiçbir zaman sonlandırılmayacaktır. Kaydırılan uygulamanın bu soruna neden olması için iletileri açıkça alması gerekmez. Aşağıdaki işlevlerden herhangi birini çağırmak veya ileti alma döngüsüne sahip olan tüm iletileri işlemek, kaydırırken WM_LBUTTONUP kaybolmasına neden olabilir. Aşağıda listelenen işlevler bu kategoriye ayrılır:

DialogBox() DialogBoxIndirect() DialogBoxIndirectParam() DialogBoxParam() GetMessage() MessageBox() PeekMessage()

Çözüm

Kaydırma sırasında, WM_LBUTTONUP ileti, bir ileti alma çubuğu dışında herhangi bir ileti alma döngüsünden itibaren kuyruktan alınmamalıdır. Bir uygulama bu sorundan aşağıdaki gibi gelebilir:

  • Bir uygulama, arka plan işlemesini uygulamak için bir ileti alma döngüsü uygular; Örneğin, Paint kullanan bir zaman, arka plan işleme.

  • Uygulama, başka bir uygulama veya DLL ile iletişim kurmak için ileti alma döngüsünü uygular. Örneğin, gitmek için uygulamanın başka bir yerden veri alması gerekmektedir.

Olası geçici çözümler

İki olası geçici çözüm aşağıda listelenmiştir. İlk geçici çözüm birçok çıkış uygulaması ve Windows tarafından kullanılır; Ancak, nadiren de olsa ilk geçici çözüm uygun olmayabilir. Bu durumda, ikinci geçici çözüm kullanılabilir. Ancak mümkünse, lütfen ileti alma işlemini tamamen geri almayı unutmayın.

  • Zamanlayıcı-ileti tabanlı işleme 'yi kullanın. Karmaşık işlemleri daha küçük görevlere bölün ve her görevin nereden başlayıp biteceğini takip edin, sonra her görevi bir süreölçer iletisine göre gerçekleştirin. İşlemlerin tüm bileşenleri tamamlandığında süreölçeri sonlandırın. Bu geçici çözümün örneği için aşağıya bakın.

  • İleti alma döngüsünü uygulayın, ancak WM_LBUTTONUP içermediğinden emin olun. Bu, filtreler kullanılarak gerçekleştirilebilir. Bu geçici çözümün bazı örnekleri için aşağıya bakın.

Çözüm 1

Bir uygulamanın karmaşık bir Paint yordamı vardır. ScrollWindow () çağrısı yapmak için Paint mesajları oluşturur. Arka plan işlemi, boyama sırasında gerçekleşir.

  1. WM_PAINT iletiyi aldığınızda aşağıdakileri yapın:

    1. BeginPaint () öğesini arayın.

    2. 2 numaralı adımda kullanılmak üzere geçersiz kılınmış bir Global dikdörtgen değişkenine (örneğin, grcPaint) kopyalayın. Global dikdörtgen grcPaint, önceden elde edilen dikdörtgen (grcPaint) ve yeni geçersiz kılınan dikdörtgen (PS. rcPaint) şeklinde bir birleşim olabilir. Bunun kodu şuna benzer:

               RECT grcPaint;    // Should be initialized before getting the                           // first paint message.            :            :         UnionRect(&grcPaint, &ps.rcPaint,&grcPaint);
    3. PS. rcPaint ile ValidateRect () çağrısı yapın.

    4. EndPaint () çağrısı yapın.

    5. Süreölçer ayarlayın.

    Bu şekilde, daha fazla WM_PAINT ileti oluşturulmaz, çünkü geçersiz bölge yoktur ve bu, WM_TIMER iletiler üreten bir süreölçer ayarlanır.

  2. WM_TIMER iletisi aldıktan sonra genel Rect değişkenini denetleyin; boş değilse bir bölüm alıp boyayın. Ardından, Global Rect değişkenini ayarlayarak boyanmış bölgeyi içermez.

  3. Global Rect değişkeni boşken süreölçeri sonlandırın.

Çözüm 2

Bir uygulamanın, başka bir uygulamadan DDE yoluyla veya başka bir uygulamadan başka bir mekanizmanın ardından pencerede görüntülenen bazı verileri alması gereklidir. Bunu kaydırmak için uygulamanın istekte bulunması ve bir sunucu uygulamasından verileri alması gerekmektedir. PeekMessage () ayarlamak ve bu bilgileri almak için kullanılabilen üç farklı filtre vardır. Filtreler, PeekMessage () ile Uıfilterfirst ve uFilterLast parametreleri kullanılarak ayarlanabilir. ufilteröncelikle, onay verilen aralıktaki selamlaşma iletisini belirtir ve son son iletiyi, onay edilecek aralıktaki son mesajı belirtir.

  1. Gerekli verileri almak için yalnızca ilgili iletileri işaretleyin ve alın.

  2. Sıra formunu kaldırmadan WM_LBUTTONUP denetleme; kuyrukta varsa break. Aksi takdirde tüm iletileri alın ve gönderin.

  3. WM_LBUTTONUP ve WM_LBUTTONUP 'tan büyük tüm iletileri alın, ancak WM_LBUTTONUP geri alamaz.

Ek Bilgi

Sorunu yeniden oluşturma adımları

Aşağıdaki, WM_LBUTTONUP iletisinin kaybının önündeki olayların dizisidir:

  1. Fareyi kullanarak kaydırma çubuğunu tıklatın.

  2. Adım 1 bir WM_NCLBUTTONDOWN iletisi oluşturur.

  3. Adım 2, Windows iç ileti döngüsünün başlamasına neden olur. Bu ileti döngüsü, kaydırma çubuğu ile ilgili iletileri arar. Bu ileti döngüsünün amacı uygun WM_HSCROLL veya WM_VSCROLL mesajları üretsağlamaktır. İleti döngüsü ve kaydırma WM_LBUTTONUP alındığında sona erer.

  4. WM_HSCROLL veya WM_VSCROLL iletisi alınırken, uygulama doğrudan ileti alma döngüsüne gelir veya iletileri alma sonucu olan işlevleri arar.

  5. WM_LBUTTONUP, adım 4 ' te belirtilen ileti döngüsüyle sıradan kaldırılır. WM_LBUTTONUP gönderilir.

  6. Adım 5 WM_LBUTTONUP iletisinin başka bir yerde gönderilmesi ve adım 3 ' te sözü edilen iç ileti alımı döngüsü hiçbir zaman almaz. Adım 3 ' te ileti döngüsü, kaydırmayı durdurmak için WM_LBUTTONUP. Bu nedenle, kaydırma çubuğu kaydırmaya devam eder.

Daha fazla yardıma mı ihtiyacınız var?

Yeteneklerinizi geliştirin
Eğitimleri keşfedin
Yeni özellikleri ilk olarak siz edinin
Microsoft Insider 'a katılın

Bu bilgi yardımcı oldu mu?

Geri bildiriminiz için teşekkür ederiz!

Geri bildiriminiz için teşekkürler! Office destek temsilcilerimizden biriyle görüşmeniz yararlı olabilir.

×