TN040: mfc/ole yeniden boyutlandırma ve yakınlaştırma yerinde
Not
İlk çevrimiçi belgelerinde yer almıştır beri aşağıdaki teknik Not güncelleştirilmedi.Sonuç olarak bazı yordamlar ve konuları eski veya yanlış.En son bilgiler için çevrimiçi belgelere dizini ilgilendiğiniz konu aramak önerilir.
Bu not, yerinde düzenleme ilgili sorunları ve bir sunucu doğru yakınlaştırma gerçekleştirmek ve yerinde yeniden boyutlandırma tartışılacaktır. Yerinde etkinleştirme WYSIWYG kavramı bu kapsayıcılardaki bir adım ileri alınır ve sunucuları birbirleriyle işbirliği ve özellikle çok ole belirtiminde aynı şekilde yorumlayabilir.
Kapsayıcı ve yerinde etkinleştirme destekleyen sunucu arasında yakın etkileşim nedeniyle saklanması gereken son kullanıcı tarafından beklentilerini sayısı vardır:
Sunu ekranı (çizilmiş meta COleServerItem::OnDraw geçersiz kılar) tam olarak aynı zaman da (düzenleme araçlarını görünmez olmasıdır) düzenleme için çizilen olarak görünmelidir.
Kapsayıcı yakınlaştırır, sunucu penceresi çok gerekir!
Kapsayıcı ve sunucu nesneleri aynı ölçüler kullanarak düzenlemek görüntülemelidir. Bu değer sayısına göre eşleştirme modu kullanarak anlamına gelir mantıksal inç başına piksel — değil fiziksel piksel / inç, görüntü aygıtında işlenirken.
Not
Yerinde etkinleştirme (bağlı değil) katıştırılmış öğeler için yalnızca uygulandığı için yakınlaştırma katıştırılmış nesneler için yalnızca uygulanır.API ikisini de görürsünüz COleServerDoc ve COleServerItem yakınlaştırma için kullanılır.Bu dichotomy için bağlı ve katıştırılmış öğeler için geçerli olan işlevler içinde bulunduğunuz nedeni COleServerItem (Bu, ortak uygulama izin verir) ve katıştırılmış nesneler için geçerli olan işlevler içinde bulunan COleServerDoc sınıfı (olduğu sunucunun açısından bakıldığında, document katıştırılmış).
Çoğu yükünü yerleştirilir üzerinde sunucu Uygulayıcısı, sunucu konteynerin yakınlaştırma faktörü unutmayın ve düzenleme Arabirimi uygun şekilde değiştirin. Ancak sunucu kapsayıcısı kullanarak yakınlaştırma faktörü nasıl belirlemediğine?
mfc yakınlaştırma desteği
Geçerli yakınlaştırma faktörü çağırarak belirlenebilir COleServerDoc::GetZoomFactor. Belge yerinde etkin olmadığında bu arama her zaman bir % 100 yakınlaştırma faktörü (veya 1: 1 oranı) neden olur. Yerinde etkin % 100'den başka bir şey döndürürken, çağrılıyor.
mfc ole örnek düzgün yakınlaştırma bir örnek için bkz: HIERSVR. Metni görüntüler ve metin, genel olarak, doğrusal bir şekilde (ipuçları, Tipografi kuralları, tasarım genişlikleri ve yükseklikleri tüm mat karmaşıklaştırabilir) ölçeklendirilemez gerçeği tarafından HIERSVR yakınlaştırma karmaşık. Yine de, HIERSVR düzgün yakınlaştırma uygulamak için makul bir başvuru ve böylece mfc öğretici KARALAMA (7. adım).
COleServerDoc::GetZoomFactorçok sayıda farklı ölçüler kullanılabilir konteyner veya uygulanmasındaki esas yakınlaştırma faktörü belirler, COleServerItem ve COleServerDoc sınıfları. Kısacası, geçerli yakınlaştırma katsayısı aşağıdaki formülle belirlenir:
Position Rectangle (PR) / Container Extent (CE)
POZİSYON DİKDÖRTGEN konteyner tarafından belirlenir. Yerinde etkinleştirme sırasında sunucu döndü, COleClientItem::OnGetItemPosition denir ve sunucunun kapsayıcısını çağırdığında güncelleştirilmiş COleServerDoc::OnSetItemRects (bir çağrı ile COleClientItem::SetItemRects).
KAPSAYICI ölçüde hesaplamak için biraz daha karmaşıktır. Kap çağırdı, COleServerItem::OnSetExtent (bir çağrı ile COleClientItem::SetExtent), KONTEYNER ölçüde piksel piksel / mantık inç sayısını esas dönüştürülen bu değeri ise. Konteyner (genellikle olan durum) SetExtent çağırmadı sonra KAP ölçüde dönen boyutudur COleServerItem::OnGetExtent. Kapsayıcı SetExtent adlı değil, bu nedenle framework olsaydı kapsayıcı, doğal uzantısı ile % 100 adlı varsayar (dönen değeri COleServerItem::GetExtent). Başka bir deyişle, belirtilen kapsayıcı öğe (az) daha fazla, % 100 görüntülüyor framework varsayar.
Ancak unutmayın önemlidir COleServerItem::OnSetExtent ve COleServerItem::OnGetExtent benzer adlara sahip maddenin aynı özniteliği değiştirmek değil. OnSetExtentnesnenin ne kadarının görünür (bakılmaksızın, büyütme faktörü) kapsayıcısında bildiğiniz sunucu adı verilen ve OnGetExtent ideal bir nesnenin boyutunu belirlemek için kapsayıcı adlandırılır.
Katılan API'ların her biri bakarak daha net bir resim elde edebilirsiniz:
COleServerItem::OnGetExtent
Bu işlev, maddenin HIMETRIC birim "doğal boyutu" döndürmelidir. "Doğal boyutu" düşünmek iyi yazdırıldığında görünebilir boyutu tanımlamak için yoludur. Bir maddeyi içeriği (çok belirli bir madde için sabit meta dosyası gibi) burada döndürülen boyutu sabittir. Yakınlaştırma öğeye uygulanan bu boyutu değişmez. Kapsayıcı öğe daha fazla veya daha az çağırarak sunacaktır zaman genellikle değişmez OnSetExtent. Bir örneği, basit bir metin düzenleyici konteyner tarafından gönderilen son ölçüde temel metin kaydırılan yok "Kütük" özelliğine sahip olabilir. Bir sunucu değiştirirseniz, sunucu büyük olasılıkla sistem kayıt defterinde bit OLEMISC_RECOMPOSEONRESIZE ayarlamanız gerekir (Bu seçeneği daha fazla bilgi için ole sdk belgelerine bakın).
COleServerItem::OnSetExtent
"Daha fazla veya daha az" nesnesinin kapsayıcı gösterir, bu işlevi çağrılır. Çoğu kapsayıcıları bu hiç çağırmayacaktır. Varsayılan uygulama olarak kullanılan 'm_sizeExtent' kapsayıcısında alınan son değeri saklayan COleServerDoc::GetZoomFactor yukarıda açıklanan KAPSAYICI TESTİN değeri hesaplarken.
COleServerDoc::OnSetItemRects
Belge yerinde etkin olduğunda, bu işlevi çağrılır. Öğenin konumunu veya öğeye uygulanan kırpma kabı güncelleştirir, denir. POZİSYON DİKDÖRTGEN yukarıda anlatıldığı gibi pay için yakınlaştırma faktörü hesaplama sağlar. Bir sunucu öğenin konumunu çağırarak değiştirilmesi isteği COleServerDoc::RequestPositionChange. Kap olabilir ya da çağırarak bu isteğine yanıt vermeyebilir OnSetItemRects (bir çağrı ile COleServerItem::SetItemRects).
COleServerDoc::OnDraw
Meta dosyası, geçersiz kılarak oluşturulan ayýrt etmek önemlidir COleServerItem::OnDraw geçerli büyütme faktörü ne olursa olsun tam olarak aynı meta üretir. Konteyner meta dosyası uygun olarak ölçeklenir. Bu görünümün arasında önemli bir ayrım, OnDraw ve sunucu maddenin OnDraw. Yakınlaştırma görünümü tanıtıcıları yalnızca öğe oluşturur bir zoomable meta ve uygun yakınlaştırma yapmak için konteyner yukarı çıkar.
Sunucunuzun doğru davrandığını sağlamak için en iyi yol uygulaması kullanmaktır COleServerDoc::GetZoomFactor belgenizi yerinde etkin olduğunda.
mfc destek yerinde yeniden boyutlandırma
mfc ole 2 belirtiminde açıklandığı gibi tam olarak yerinde yeniden boyutlandırma arabirimini uygular. Kullanıcı arabirimi tarafından desteklenen COleResizeBar özel bir ileti sınıfı WM_SIZECHILDve özel işleme bu iletinin COleIPFrameWnd.
Bu ileti çerçevesi tarafından sağlanan daha farklı işleme uygulamak isteyebilirsiniz. Yukarıda açıklandığı gibi framework sonuçlarını yerinde kapsayıcısına yeniden boyutlandırma bırakır — sunucu yakınlaştırma faktörü değişikliğe yanıt verir. Her ikisini de belirleyerek kapsayıcı tepki verir, KAPSAYICI kapsamını ve POZİSYON DİKDÖRTGEN işlenmesi sırasında kendi COleClientItem::OnChangeItemPosition (çağrı sonucu olarak adlandırılan COleServerDoc::RequestPositionChange) yerinde yeniden boyutlandır "daha fazla veya daha az" öğesinin düzenleme penceresinde gösterirken neden sonra. Konteyner yalnızca konum DİKDÖRTGEN işlenirken ayarlayarak tepki verir, COleClientItem::OnChangeItemPosition, yakınlaştırma faktörü değiştirecek ve madde gösterilecek "in veya out getirildi."
Bir sunucu, bu görüşmede neler (dereceye kadar) kontrol edebilirsiniz. Elektronik tablo, örneğin değişiminde daha fazla veya daha az hücre kullanıcı öğeyi düzenlerken boyutlandırır yerinde göstermek. Bir word-processor pencere aynıdır ve yeni kenar boşluğu için metni yeniden kaydırması "kenar" değiştirmek istediğinizde tercih. Sunucularını uyguladığınızdan bu doğal uzantısı değiştirerek (dönen boyutu COleServerItem::OnGetExtent) ne zaman yeniden boyutlandırma yapılır. Bu konum DİKDÖRTGEN hem KAPSAYICI ölçüde aynı büyütme faktörü, ancak daha büyük bir kaynaklanan ya da daha küçük görüntüleme alanında aynı miktarda değiştirmek neden olur. Buna ek olarak, daha az belgenin tarafından oluşturulan meta dosyası olarak görülebilir OnDraw. Bu durumda kullanıcı görüntüleme alanı yerine madde boyutlandırdığında belgenin değiştirme.
Özel yeniden boyutlandırma uygulamak ve hala tarafından sağlanan kullanıcı arabirimi yelpazesinin COleResizeBar geçersiz kılma olarak WM_SIZECHILD , message, COleIPFrameWnd sınıfı. Özellikleri hakkında daha fazla bilgi için WM_SIZECHILD, bakın Teknik Not 24.