TN040: MFC/OLE 就地調整大小及縮放

注意事項注意事項

由於它第一次線上文件中包含尚未更新下列技術提示。如此一來,某些程序和主題可能已經過期或不正確。如需最新資訊,建議您先搜尋線上文件索引中有興趣的主題。

就地編輯與相關的問題以及如何為伺服器應該完成正確縮放和就地調整大小,將會討論這個注意事項。 就地啟動 WYSIWYG 的概念不會執行進一步在該容器中的,伺服器彼此互相合作,以及特別解讀 OLE 規格中有許多相同的方式。

因為間的密切互動之容器和支援就地啟動的伺服器之間有許多一般使用者應該維護的期望:

  • 顯示簡報 (中繼檔繪製的COleServerItem::OnDraw覆寫) 看起來應該完全相同做為它的繪製進行編輯 (不包括任何編輯工具不會顯示)。

  • 當容器的縮放時,[伺服器] 視窗應該太!

  • 容器和伺服器應該會顯示物件加以編輯使用相同的度量資訊。 這表示使用的數字為基礎的對應模式邏輯像素 / 英吋 — 不是實體的像素 / 英吋,顯示裝置上呈現時。

注意事項注意事項

就地啟動僅適用於內嵌 (沒有連結項目),因為縮放只套用至內嵌的物件。您會看到 Api 在這兩COleServerDocCOleServerItem ,用於縮放。這個二分法的原因是將是有效的連結及內嵌的項目,函式,將以COleServerItem (這可讓您有通用的實作) 和函式只適用於內嵌的物件位於COleServerDoc類別 (伺服器的觀點來看,它是document的內嵌)。

助號放在伺服器實作器,因為伺服器必須留意的容器的縮放因數並修改其適當的編輯介面。 但是伺服器如何判斷容器所使用的比例?

MFC 支援,可用來縮放

目前的縮放因數可藉由呼叫COleServerDoc::GetZoomFactor。 當文件不是就地啟動時呼叫這永遠會導致 100%的縮放因數 (或 1: 1 的比例)。 當就地啟動可能會傳回 100%以外的項目時,請呼叫它。

如需範例的正確縮放,請參閱 MFC OLE 範例 HIERSVR。 放大 HIERSVR 複雜的原因是它會顯示文字,而且文字,在一般情況下,無法縮放線性的方式 (提示、 印刷樣式慣例、 設計寬度和高度所有複雜的問題) 的事實。 儘管如此,HIERSVR 是合理的參考以進行實作是否正確,縮放轉換,所以就 MFC 教學課程手繪多邊形 (步驟 7)。

COleServerDoc::GetZoomFactor根據為數種不同公制可從容器或實作的縮放因數會決定您COleServerItemCOleServerDoc類別。 目前的縮放因數簡單地說,取決於下列公式:

Position Rectangle (PR) / Container Extent (CE)

位置矩形是由容器所決定的。 在就地啟動過程中將它傳回給伺服器時COleClientItem::OnGetItemPosition稱為,容器會呼叫伺服器時,會更新COleServerDoc::OnSetItemRects (有一個呼叫COleClientItem::SetItemRects)。

容器範圍是稍嫌複雜,來計算。 如果容器,然後按一下 [ COleServerItem::OnSetExtent (有一個呼叫COleClientItem::SetExtent),那麼容器範圍就是這個值轉換為一邏輯英吋的像素數目為基礎的像素。 如果容器都不會呼叫 SetExtent (這通常是如此),那麼容器範圍就是從傳回的大小COleServerItem::OnGetExtent。 因此,如果容器都不會呼叫 SetExtent,架構假定如果同時包含容器會呼叫它具有 100%的自然延伸 (所傳回的值 COleServerItem::GetExtent)。 所指定的另一種方式,架構假定容器顯示 100%(沒有多餘、 不小於) 的項目。

請務必注意,雖然COleServerItem::OnSetExtentCOleServerItem::OnGetExtent有類似的名稱,不會去相同的屬性的項目。 OnSetExtent呼叫是為了讓伺服器知道有多少的物件 (不論其比例) 的容器中的 [看得見和OnGetExtent的容器,以判斷物件的理想的大小,會呼叫。

藉由查看每個所涉及的 Api,就可以清楚地瞭解哪:

COleServerItem::OnGetExtent

這個函式應該會傳回 「 自然大小 」 以微米單位的項目。 想到 「 自然大小 」 的最佳方式是將它定義為可能會出現在列印時的大小。 傳回以下的大小為一常數的特定項目的內容 (非常類似的中繼檔為一常數特定項目)。 縮放套用至項目時,不會變更此大小。 它通常不會變更當容器提供此項目更多或較少的空間藉由呼叫OnSetExtent。 變化的例子可能是沒有 「 界 」 所功能被包圍的文字容器所傳送的最後一個範圍為基礎的簡單文字編輯器。 如果伺服器不會變更,伺服器應該可能會設定位元系統登錄中的 OLEMISC_RECOMPOSEONRESIZE (請參閱 OLE SDK 文件,如需詳細資訊,此選項)。

COleServerItem::OnSetExtent

當容器"程度 」 物件的顯示,會呼叫這個函式。 多數容器會呼叫這個根本方法。 預設實作會儲存最後一個值,從容器中 'm_sizeExtent',這會用在接收到COleServerDoc::GetZoomFactor計算上文所述的容器範圍值時。

COleServerDoc::OnSetItemRects

只有當文件是就地啟動時,會呼叫這個函數。 容器會更新項目的位置或套用至項目剪取時會呼叫它。 位置的矩形,如前所述,提供為分子的縮放比例計算。 伺服器可以要求項目位置變更藉由呼叫COleServerDoc::RequestPositionChange。 可能的容器,或是根本不加入這個要求回應藉由呼叫OnSetItemRects (有一個呼叫 COleServerItem::SetItemRects)。

COleServerDoc::OnDraw

請務必了解中繼檔建立藉由覆寫的COleServerItem::OnDraw產生中繼完全相同檔案,不論目前的縮放因數。 容器會縮放成適當的中繼檔。 這是檢視的重要區別OnDraw的伺服器項目和OnDraw。 縮放檢視控點上,項目只是建立 zoomable 中繼檔後,交的容器,才能執行適當的縮放。

若要確保您的伺服器會正確運作,最好是使用的實作COleServerDoc::GetZoomFactor如果您的文件是就地啟動。

MFC 支援就地調整大小

MFC 會完全實作就地調整大小的介面,OLE 2 規格中所述。 使用者介面支援的COleResizeBar類別,將自訂訊息 WM_SIZECHILD,並在這封郵件的特殊處理COleIPFrameWnd

若要實作不同架構所提供的內容比這封郵件的處理。 如上所述,架構會保留最多至容器的就地調整大小的結果,則伺服器會回應變更縮放比例。 如果容器有反應藉由將兩者都設定容器的範圍,並處理期間的位置矩形其COleClientItem::OnChangeItemPosition (稱為呼叫的結果COleServerDoc::RequestPositionChange) 然後就地調整大小,將會導致 「 更多或更少"的項目顯示在編輯視窗中。 如果容器有反應只是設定在處理期間的位置矩形COleClientItem::OnChangeItemPosition、 縮放比例會變更,並且會顯示此項目 「"拉近或拉。

伺服器可以控制 (某種程度) 此交涉期間發生什麼事。 試算表,例如可能會選擇更多或較少的儲存格時顯示使用者調整視窗大小時在編輯項目就地。 Word-processor 可能會選擇變更 「 頁面邊界 」,讓它們完全一樣的視窗並重新將文字換行至新的邊界。 伺服器實作以上,進而自然的範圍 (從傳回的大小COleServerItem::OnGetExtent) 時進行的調整大小。 這樣會使位置矩形及之容器的範圍內以相同的數量,因而導致相同的縮放比例,但更大或較小的檢視區域的變更。 此外,或多或少會顯示所產生的中繼檔中的文件OnDraw。 如此一來,當使用者調整大小,請在項目,而非只是檢視區域時,正在變更文件本身。

您可以實作自訂的調整大小,且仍然充分利用提供的使用者介面COleResizeBar藉由覆寫 WM_SIZECHILD 訊息在您COleIPFrameWnd類別。 如需有關的細節 WM_SIZECHILD,請參閱 技術的附註 24

請參閱

其他資源

技術的備忘稿編號

依類別的技術注意事項