Aracılığıyla paylaş


TN040: MFC/OLE Yerinde Yeniden Boyutlandırma ve Yakınlaştırma

Dekont

Aşağıdaki teknik not, çevrimiçi belgelere ilk kez eklendiğinden beri güncelleştirilmemiştir. Sonuç olarak, bazı yordamlar ve konular güncel olmayabilir veya yanlış olabilir. En son bilgiler için, çevrimiçi belge dizininde ilgilendiğiniz konuyu aramanız önerilir.

Bu notta yerinde düzenlemeyle ilgili sorunlar ve sunucunun doğru yakınlaştırmayı ve yerinde yeniden boyutlandırmayı nasıl gerçekleştirmesi gerektiği açıklanır. Yerinde etkinleştirme ile WYSIWYG kavramı, kapsayıcıların ve sunucuların birbirleriyle işbirliği yapması ve özellikle OLE belirtimini çok benzer şekilde yorumlaması konusunda bir adım daha ilerletilir.

Yerinde etkinleştirmeyi destekleyen bir kapsayıcı ve sunucu arasındaki yakın etkileşim nedeniyle, son kullanıcıdan sürdürülmesi gereken bir dizi beklenti vardır:

  • Sunu görüntüsü (geçersiz kılmada COleServerItem::OnDraw çizilen meta dosyası) düzenleme için çizildiği zamanla tam olarak aynı görünmelidir (düzenleme araçlarının görünmemesi dışında).

  • Kapsayıcı yakınlaştırıldığında, sunucu penceresi de yakınlaştırılmalıdır!

  • Hem kapsayıcı hem de sunucu aynı ölçümleri kullanarak düzenleme için nesneleri görüntülemelidir. Bu, görüntü cihazında işlenirken inç başına fiziksel pikselleri değil, inç başına mantıksal piksel sayısını temel alan bir eşleme modu kullanmak anlamına gelir.

Dekont

Yerinde etkinleştirme yalnızca eklenmiş (bağlı olmayan) öğeler için geçerli olduğundan, yakınlaştırma yalnızca eklenmiş nesneler için geçerlidir. Hem hem de COleServerDoc COleServerItem yakınlaştırma için kullanılan API'leri görürsünüz. Bu dikotominin nedeni, yalnızca hem bağlı hem de eklenmiş öğeler için geçerli olan işlevlerin içinde COleServerItem olmasıdır (bu, ortak bir uygulamaya sahip olmanıza olanak tanır) ve yalnızca katıştırılmış nesneler için geçerli olan işlevlerin COleServerDoc sınıfında bulunmasıdır (sunucunun perspektifinden, eklenmiş olan belgedir).

Yükün çoğu, sunucunun kapsayıcının yakınlaştırma faktörüne dikkat etmesi ve düzenleme arabirimini uygun şekilde değiştirmesi gerektiği için sunucu uygulayıcısına yerleştirilir. Ancak sunucu, kapsayıcının kullandığı yakınlaştırma faktörünü nasıl belirler?

Yakınlaştırma için MFC Desteği

Geçerli yakınlaştırma faktörü çağrılarak COleServerDoc::GetZoomFactorbelirlenebilir. Belge yerinde etkin olmadığında bunu çağırmak her zaman %100 yakınlaştırma faktörüne (veya 1:1 oranında) neden olur. Yerinde etkinken çağırmak %100 dışında bir şey döndürebilir.

Doğru yakınlaştırma örneği için bkz. MFC OLE örneği HIERSVR. HIERSVR'da yakınlaştırma, metin görüntülemesi ve metnin genel olarak doğrusal bir şekilde ölçeklendirilmemesi nedeniyle karmaşıktır (ipuçları, tipografik kurallar, tasarım genişlikleri ve yüksekliklerin tümü konuyu karmaşıklaştırır). Yine de HIERSVR, yakınlaştırmayı doğru uygulamak için makul bir başvurudur ve MFC Öğretici KARALAMA (7. adım) da öyledir.

COleServerDoc::GetZoomFactor, kapsayıcıdan veya ve COleServerDoc sınıflarınızın COleServerItem uygulanmasından elde edilebilir bir dizi farklı ölçümü temel alarak yakınlaştırma faktörünü belirler. Kısacası, geçerli yakınlaştırma faktörü aşağıdaki formülle belirlenir:

Position Rectangle (PR) / Container Extent (CE)

POSITION RECTANGLE kapsayıcı tarafından belirlenir. Çağrıldığında COleClientItem::OnGetItemPosition yerinde etkinleştirme sırasında sunucuya döndürülür ve kapsayıcı sunucunun COleServerDoc::OnSetItemRects öğesini çağırdığında (çağrısıyla COleClientItem::SetItemRects) güncelleştirilir.

CONTAINER EXTENT değerinin hesaplanması biraz daha karmaşıktır. Kapsayıcı çağrıldıysa COleServerItem::OnSetExtent (çağrısıyla COleClientItem::SetExtent), CONTAINER EXTENT değeri mantıksal inç başına piksel sayısına göre piksele dönüştürülür. Kapsayıcı SetExtent (genellikle böyledir) olarak adlandırılmadıysa, CONTAINER EXTENT öğesinden COleServerItem::OnGetExtentdöndürülen boyut olur. Bu nedenle, kapsayıcı SetExtent olarak adlandırılmadıysa çerçeve, bunu yaptıysa kapsayıcının doğal kapsamın %100'ünün (öğesinden COleServerItem::GetExtentdöndürülen değer) çağıracağını varsayar. Başka bir şekilde de belirtildiği gibi, çerçeve kapsayıcının öğenin %100'ünün (artık, daha az değil) görüntülendiğini varsayar.

Benzer adlara sahip olsalar da COleServerItem::OnSetExtent COleServerItem::OnGetExtent öğenin aynı özniteliğini işlemediklerine dikkat etmek önemlidir. OnSetExtent , sunucunun kapsayıcıda nesnenin ne kadarının görünür olduğunu (yakınlaştırma faktöründen bağımsız olarak) bilmesini sağlamak için çağrılır ve OnGetExtent nesnenin ideal boyutunu belirlemek için kapsayıcı tarafından çağrılır.

İlgili API'lerin her birine bakarak daha net bir resim elde edebilirsiniz:

COleServerItem::OnGetExtent

Bu işlev, öğenin HIMETRIC birimlerinde "doğal boyut" döndürmelidir. "Doğal boyutu" düşünmenin en iyi yolu, yazdırıldığında görünebilecek boyut olarak tanımlamaktır. Burada döndürülen boyut, belirli bir öğe içeriği için sabittir (belirli bir öğe için sabit olan meta dosyası gibi). Öğeye yakınlaştırma uygulandığında bu boyut değişmez. Kapsayıcı çağrısı OnSetExtentyaparak öğeye daha fazla veya daha az alan verdiğinde genellikle değişmez. Bir değişiklik örneği, kapsayıcı tarafından gönderilen son uzantıya göre metni sarmalayan "kenar boşluğu" özelliği olmayan basit bir metin düzenleyicisi olabilir. Bir sunucu değişirse, sunucunun büyük olasılıkla sistem kayıt defterinde OLEMISC_RECOMPOSEONRESIZE bitini ayarlaması gerekir (bu seçenek hakkında daha fazla bilgi için OLE SDK belgelerine bakın).

COleServerItem::OnSetExtent

Kapsayıcı nesnenin "daha fazla veya daha az" değerini gösterdiğinde bu işlev çağrılır. Kapsayıcıların çoğu bunu hiç çağırmaz. Varsayılan uygulama, kapsayıcıdan alınan son değeri yukarıda açıklanan CONTAINER EXTENT değeri hesaplanırken kullanılan 'm_sizeExtent' içinde COleServerDoc::GetZoomFactor depolar.

COleServerDoc::OnSetItemRects

Bu işlev yalnızca belge yerinde etkin olduğunda çağrılır. Kapsayıcı öğenin konumunu veya öğeye uygulanan kırpmayı güncelleştirdiğinde çağrılır. YUKARıDA açıklandığı gibi POSITION RECTANGLE, yakınlaştırma faktörü hesaplaması için pay sağlar. Bir sunucu, öğesini çağırarak COleServerDoc::RequestPositionChangeöğe konumunun değiştirilmesini isteyebilir. Kapsayıcı bu isteği çağırarak OnSetItemRects (çağrısıyla) COleServerItem::SetItemRectsyanıt verebilir veya yanıtlamayabilir.

COleServerDoc::OnDraw

geçersiz kılınarak COleServerItem::OnDraw oluşturulan meta dosyasının geçerli yakınlaştırma faktöründen bağımsız olarak tam olarak aynı meta dosyasını ürettiğini fark etmek önemlidir. Kapsayıcı meta dosyasını uygun şekilde ölçeklendirir. Bu, görünümün OnDraw ve sunucu öğesinin öğesi arasındaki önemli bir ayrımdır OnDraw. Görünüm yakınlaştırmayı işler, öğe yalnızca yakınlaştırılabilir bir meta dosyası oluşturur ve uygun yakınlaştırmayı yapmak için kapsayıcıya bırakır.

Sunucunuzun doğru davrandığını doğrulamanın en iyi yolu, belgeniz yerinde etkinse uygulamasını COleServerDoc::GetZoomFactor kullanmaktır.

Yerinde Yeniden Boyutlandırma için MFC Desteği

MFC, OLE 2 belirtiminde açıklandığı gibi yerinde yeniden boyutlandırma arabirimini tam olarak uygular. Kullanıcı arabirimi sınıfı, özel ileti WM_SIZECHILD ve içinde bu iletinin COleIPFrameWndözel işlenmesi tarafından COleResizeBar desteklenir.

Bu iletinin çerçeve tarafından sağlanandan farklı bir şekilde işlenmesini uygulamak isteyebilirsiniz. Yukarıda açıklandığı gibi, çerçeve kapsayıcıya kadar yerinde yeniden boyutlandırmanın sonuçlarını bırakır; sunucu yakınlaştırma faktöründeki değişikliğe yanıt verir. Kapsayıcı işlemi sırasında COleClientItem::OnChangeItemPosition hem CONTAINER EXTENT hem de POSITION RECTANGLE ayarını yaparak tepki verirse (çağrısının COleServerDoc::RequestPositionChangesonucu olarak adlandırılır) yerinde yeniden boyutlandırma, düzenleme penceresinde öğenin "daha fazla veya daha az" olarak gösterilmesine neden olur. Kapsayıcı yalnızca işleme COleClientItem::OnChangeItemPositionsırasında POSITION RECTANGLE ayarını yaparak tepki verirse, yakınlaştırma faktörü değişir ve öğe "yakınlaştırıldı veya uzaklaştırıldı" olarak gösterilir.

Bir sunucu, bu anlaşma sırasında ne olacağını (bir dereceye kadar) denetleyebiliyor. Örneğin bir elektronik tablo, kullanıcı öğeyi yerinde düzenlerken pencereyi yeniden boyutlandırdığında daha fazla veya daha az hücre göstermeyi seçebilir. Sözcük işlemcisi, "sayfa kenar boşluklarını" pencereyle aynı olacak şekilde değiştirmeyi ve metni yeni kenar boşluğuna yeniden yazmayı seçebilir. Sunucular, yeniden boyutlandırma tamamlandığında doğal kapsamı (döndüren COleServerItem::OnGetExtentboyut) değiştirerek bunu uygular. Bu, hem POSITION RECTANGLE hem de CONTAINER EXTENT öğesinin aynı miktarda değişmesine neden olur ve bu da aynı yakınlaştırma faktörüne, ancak daha büyük veya daha küçük bir görüntüleme alanına neden olur. Ayrıca, tarafından OnDrawoluşturulan meta dosyasında belgenin daha fazla veya daha azı görünür. Bu durumda, kullanıcı yalnızca görüntüleme alanı yerine öğeyi yeniden boyutlandırdığında belgenin kendisi değişir.

Özel yeniden boyutlandırma uygulayabilir ve sınıfınızdaki COleIPFrameWnd WM_SIZECHILD iletisini geçersiz kılarak tarafından COleResizeBar sağlanan kullanıcı arabiriminden yararlanmaya devam edebilirsiniz. WM_SIZECHILD özellikleri hakkında daha fazla bilgi için bkz . Teknik Not 24.

Ayrıca bkz.

Sayıya Göre Teknik Notlar
Kategoriye Göre Teknik Notlar