TN040: mfc/ole yeniden boyutlandırma ve yakınlaştırma yerinde

Bu Not, yerinde düzenleme ilgili sorunları ve bir sunucu doğru zum işlemleri gerçekleştirmek ve yerinde yeniden boyutlandırma tartışacağız. Yerinde etkinleştirme, WYSIWYG kavramı bir adım daha bu kaplarda alınır ve sunucuların birbirleri ile işbirliği ve özellikle çok ole özellikleri aynı şekilde yorumlamak.

Bir konteyner ve yerinde etkinleştirme destekleyen sunucu arasında yakın etkileşim nedeniyle orada beklentiler saklanması gereken son kullanıcı sayısı:

&Notnbsp;  Yerinde etkinleştirme (bağlı değil) katıştırılmış öğeler için yalnızca uygulandığı için yakınlaştırma yalnızca katıştırılmış nesneler için geçerlidir. Yakınlaştırma için kullanılan API hem COleServerDoc , hem de COleServerItem göreceksiniz. Bu ikilemi nedeni, yalnızca bağlı ve katıştırılmış öğeler için geçerli olan işlevleri COleServerItem olmasıdır (ortak bir uygulama var böylece) ve yalnızca katıştırılmış nesneleri için geçerli işlevler COleServerDoc sınıfında yer alır (sunucunun açısından, katıştırılmış olan belge 's).

Yükünü en sunucu konteynerin yakınlaştırma faktörü farkında olmalı ve uygun düzenleme arabirimi değiştirmek, sunucu implementor yerleştirilir. Ama nasıl sunucu kabı kullanarak yakınlaştırma faktörü belirler?

Yakınlaştırma mfc desteği

Geçerli yakınlaştırma faktörü, COleServerDoc::GetZoomFactorarayarak belirlenebilir. Belge yerinde etkin olmadığında bu arama her zaman bir % 100 yakınlaştırma faktörü (veya 1: 1 oran) neden olur. O çağrı ise % 100'den başka bir şey yerinde etkin döndürebilir.

Düzgün yakınlaştırma örnek için bkz: mfc ole örnek HIERSVR. HIERSVR içinde Yakınlaştırma metin görüntüler aslında karmaşık — ve metin, genel olarak, değil doğrusal bir biçimde (ipuçları, tipografi kuralları, tasarım genişlik ve yükseklikleri karmaşık olursa olsun). Yine de, HIERSVR düzgün yakınlaştırma uygulamak için makul bir başvuru ve böylece mfc eğitim KARALAMAK (7. adım).

COleServerDoc::GetZoomFactor farklı ölçümleri kullanılabilir konteyner veya uygulanması, COleServerItem ve COleServerDoc sınıfları bir dizi temel büyütme faktörü belirler. Kısacası, geçerli büyütme faktörü aşağıdaki formülle belirlenir

Pozisyon dikdörtgen (pr) / konteyner ölçüde (ce)

Pozisyon dikdörtgen konteyner tarafından belirlenir. COleClientItem::OnGetItemPosition olarak adlandırılır ve konteyner (ile COleClientItem::SetItemRectsçağrısı) sunucunun COleServerDoc::OnSetItemRects çağırdığında güncelleştirilir yerinde etkinleştirme sırasında sunucuya döndürülür.

Konteyner ölçüde hesaplamak biraz daha karmaşıktır. Bu değeri konteyner COleServerItem::OnSetExtent (bir arama ile COleClientItem::SetExtentiçin), sonra kabı ölçüde denir piksel piksel / mantık inç sayısını göre dönüştürülür. Konteyner (ki genellikle böyle olur) SetExtent olarak adlandırılan değil, konteyner ölçüde COleServerItem::OnGetExtentdöndürülen boyut demektir. Yani, konteyner SetExtent olarak adlandırılan değil, çerçeve yaptım eğer konteyner o %100 doğal ölçüde ( COleServerItem::GetExtentdöndürülen değeri) denen varsayar. Ya da başka bir deyişle, belirtilen kapsayıcı öğe (daha hayır daha az değil) % 100 görüntülüyor çerçeve varsayar.

COleServerItem::OnSetExtent ve COleServerItem::OnGetExtent adlarının benzer olmasına rağmen onlar aynı özniteliğin öğenin işlemek değil olduğunu unutmamak gerekir. OnSetExtent nesnenin ne kadarının görünür (bakılmaksızın, büyütme faktörü) kapsayıcısında biliyorum sunucunun izin vermek denir ve OnGetExtent ideal boyut nesnesinin belirlemek için konteyner tarafından denir.

Her burada yer API bakarak sen-ebilmek almak daha net bir resim:

COleServerItem::OnGetExtent

Bu işlev, maddenin HIMETRIC birimleri "doğal boyutu" döndürmelidir. "Doğal boyutu" düşünmek için en iyi yolu, onu bu yazdırıldığında görünür boyut olarak tanımlamaktır. Boyutu burada sabit bir maddeyi içerikleri (çok belirli bir madde için sürekli meta dosyası gibi) için döndürülür. Yakınlaştırma, maddeye uygulandığında bu boyutu değişmez. Kapsayıcı öğe daha fazla veya daha az yer OnSetExtentçağırarak verir zaman genellikle değişmez. Bir değişikliğe örnek, basit bir metin editörü ile konteyner tarafından gönderilen son ölçüde temel metin sarma "marj" mümkün değildir olabilir. Bir sunucu değiştirirseniz, sunucu büyük olasılıkla sistem kayıt defterinde biraz OLEMISC_RECOMPOSEONRESIZE ayarlamanız gerekir (Bu seçeneği daha fazla bilgi için ole sdk belgelerine bakın).

COleServerItem::OnSetExtent

"Az" nesnesinin kapsayıcı gösterir bu fonksiyonu denir. Çoğu kapsayıcıları bu tüm arayacak değil. Varsayılan uygulama COleServerDoc::GetZoomFactor yukarıda açıklanan konteyner ölçüde değerini hesaplarken kullanılan 'm_sizeExtent' konteyner alınan son değer depolar.

COleServerDoc::OnSetItemRects

Bu işlev, yalnızca belgenin yerinde etkin olduğunda denir. Konteyner öğenin konumunu veya öğeye uygulanan kırpma güncelleştirdiğinde denir. Pozisyon dikdörtgen yukarıda anlatıldığı gibi pay yakınlaştırma faktörü hesaplama sağlar. Bir sunucu, öğenin konumu COleServerDoc::RequestPositionChangeçağırarak değiştirilmesi talep edebilirsiniz. Konteyner olabilir ya da OnSetItemRects (ile COleServerItem::SetItemRectsçağrısı) arayarak bu isteğine yanıt vermeyebilir.

COleServerDoc::OnDraw

COleServerItem::OnDraw geçersiz kılarak oluşturulan meta dosyası tam olarak aynı meta, ne olursa olsun geçerli büyütme faktörü ürettiğini fark önemlidir. Konteyner meta dosyası uygun olarak ölçeklenir. Bu görünümün OnDraw ve sunucu maddenin OnDrawarasında önemli bir fark var. Yakınlaştırma görünümü kolları, sadece öğe oluşturan bir zoomable meta dosyası ve konteyner uygun yakınlaştırma yapmak kadar bırakır.

Sunucu doğru şekilde davranacağını sigortalamak için en iyi yolu belgenize yerinde aktif ise COleServerDoc::GetZoomFactor uygulanması kullanmaktır.

Mfc destek yerinde yeniden boyutlandırma

Mfc tam olarak, ole 2 belirtiminde açıklandığı gibi yerinde yeniden boyutlandırma arabirimini uygular. COleResizeBar sınıfı, bir özel mesaj WM_SIZECHILDve özel işlem COleIPFrameWnd bu iletinin kullanıcı arayüzü desteklenmektedir.

Bu mesajın ne çerçeve tarafından sağlanan daha farklı işleme uygulamak isteyebilirsiniz. Yukarıda açıklandığı gibi yerinde konteyner kadar yeniden boyutlandırma sonuçları çerçevesinde bırakır — sunucu yakınlaştırma faktörü değişikliğe yanıt verir. Her iki KAPSAYICI ölçüde ayarlayarak konteyner tepki ve pozisyon dikdörtgen ( COleServerDoc::RequestPositionChangearama sonucu olarak adlandırılır) onun COleClientItem::OnChangeItemPosition sonra yerinde işlenmesi sırasında yeniden boyutlandırma "az" maddenin düzenleme penceresinde gösterilen içinde sonuçlanır. Sadece COleClientItem::OnChangeItemPositionişleme sırasında pozisyon dikdörtgen belirleyerek konteyner tepki, zoom faktörü değişecek ve madde "veya yakınlaştırılmış." gösterilecek.

Sunucu, bu görüşme sırasında neler (dereceye kadar) kontrol edebilirsiniz. Elektronik, örneğin seçecek kullanıcı öğeyi düzenlerken pencere boyutlandırdığında daha fazla veya daha az hücre yerinde göstermek. Bir işlemci, onlar pencere ile aynı ve metni yeni kenar boşluğuna rewrap "sayfa kenar boşluklarını" değiştirmek tercih. Sunucular doğal ölçüde ( COleServerItem::OnGetExtentdöndürülen boyut) değiştirerek bu uygulamaya ne zaman yeniden boyutlandırma yapılır. Bu pozisyon dikdörtgen hem KAPSAYICI ölçüde aynı büyütme faktörü, ama daha büyük bir kaynaklanan ya da küçük görüntüleme alanında aynı miktarda değiştirmek neden olur. Ayrıca, daha fazla veya daha az belgenin OnDrawtarafından oluşturulan meta dosyası olarak görülebilir. Kullanıcı sadece görüntüleme alanı yerine öğeyi yeniden boyutlandırdığında belgenin kendisinde bu durumda değişiyor.

Özel boyutlandırma uygulamak ve hala kaldıraç COleIPFrameWnd sınıf WM_SIZECHILD iletisinde geçersiz kılarak COleResizeBar tarafından sağlanan kullanıcı arabirimi. WM_SIZECHILDözellikleri hakkında daha fazla bilgi için bkz: Teknik Not 24.

Teknik notlar numarasına göre |nbsp; Teknik notlar kategorisine göre

Index