Ця Примітка обговорять питання, що стосуються на місці монтажу і як сервер повинен виконати правильні масштабування і на місці зміни розміру. З активацією на місці WYSIWYG концепція береться ще один крок у цьому контейнерів і серверів співпрацювати один з одним і зокрема інтерпретувати OLE специфікації багато так само.
З-за тісної взаємодії між контейнер і сервер, що підтримує активації на місці є кілька очікування від ліцензійну, які повинні бути розташовані:
Примітка Тому що на місці активації застосовується лише до елементів, які є вбудованими (не зв'язані), масштабування відноситься тільки до впроваджені об'єкти. Ви побачите API в COleServerDoc і COleServerItem , які використовуються для масштабування. Причина цього дихотомії є те, що тільки ті функції, які є дійсними для зв'язування та впровадження об'єктів у COleServerItem (це дозволяє вам мати спільної реалізації) та функції, що діють лише для впроваджених об'єктів розташовані в COleServerDoc клас (з точки зору сервера, це документ , який вбудований).
Більшість тягаря розміщена на implementor сервер, в тому, що сервер повинен бути інформовані про Коефіцієнт масштабування у тара і змінити його інтерфейс редагування, відповідно. Але як сервер визначаємо коефіцієнт масштабування, що використовує контейнера?
Підтримка MFC для масштабування
Поточного параметра може бути визначено за номером COleServerDoc::GetZoomFactor. Називати це, коли документ не є активним на місці завжди призводить до на 100% збільшення фактор (або співвідношенні 1: 1). Називаючи його, у той час як активний на місці може повернути щось інше, ніж 100 %.
Приклад масштабування правильно в розділі MFC OLE зразок HIERSVR. Масштабування в HIERSVR є ускладнюється тим, що вона відображає текст — і текст, загалом, не масштабі лінійним чином (натяки, друкарські конвенцій, дизайн, ширина і висота всіх ускладнити це питання). Тим не менше, HIERSVR розумні посилання для здійснення масштабування правильно, і тому MFC підручник КАРАКУЛІ (Крок 7).
COleServerDoc::GetZoomFactor визначає Коефіцієнт масштабування, на основі цілий ряд різних метриках доступні з контейнера або з реалізації ваших класах COleServerItem і COleServerDoc . Коротше кажучи, поточний Коефіцієнт масштабування визначається за формулою
Розташуйте прямокутник (PR) / контейнер мірою (CE)
ПОЗИЦІЯ ПРЯМОКУТНИК визначається контейнера. Повертається до сервера під час активації на місці при COleClientItem::OnGetItemPosition називається і оновлюється, коли у Тара закликає сервера COleServerDoc::OnSetItemRects (із закликом до COleClientItem::SetItemRects).
КОНТЕЙНЕР МІРОЮ є трохи більш складним, щоб обчислити. Якщо контейнер називається COleServerItem::OnSetExtent (із закликом до COleClientItem::SetExtent), потім КОНТЕЙНЕР МІРОЮ це значення перетворюється на пікселі на основі кількість пікселів на дюйм логічним. Якщо контейнер не називається SetExtent, (що зазвичай випадку), то КОНТЕЙНЕР МІРОЮ є розмір, повернувся з COleServerItem::OnGetExtent. Таким чином, якщо контейнер не називається SetExtent, рамках припускає, що якщо це було зроблено у Тара б назвав його з 100%, натуральних ступеня (значення, що повернувся з COleServerItem::GetExtent). Або, заявив, іншим способом, рамках припускає, що контейнер відображення 100% (ні більше, ні менше) елемента.
Важливо відзначити, що хоча COleServerItem::OnSetExtent і COleServerItem::OnGetExtent мають схожі імена, вони не маніпулювати одного атрибута елемента. OnSetExtent , називається сервером знати, скільки об'єкта є видимими у тара (незалежно від параметра) і OnGetExtent називається на контейнер визначити ідеальний розмір об'єкта.
Дивлячись на кожному з цих інтерфейсів участь тут ви можете отримати чітку картину:
COleServerItem::OnGetExtent
Цю функцію слід повернути "розмір природно", в одиницях HIMETRIC з елемент. Кращий спосіб думати про "розмір природно" є визначити його як розмір, він може відображатися під час друку. Розмір повернувся, тут є постійним для певного елемента змісту, (так само, як метафайл, яке є постійною певного елемента). Цей розмір не змінюється, коли масштабування застосовується до елемента. Це зазвичай не змінюється в разі контейнер надає елемент більше або менше місця за номером OnSetExtent. Прикладом зміни, може бути, простий текстовий редактор з немає можливості "маржа", що загорнуті тексту, на основі останнього мірою послав контейнера. Якщо змінити сервер, сервер ймовірно повинні встановити OLEMISC_RECOMPOSEONRESIZE, трохи в системному реєстрі (див. документацію OLE SDK для отримання додаткової інформації про цей параметр).
COleServerItem::OnSetExtent
Ця функція викликається під час контейнер показує "менше" об'єкта. Більшість контейнери не будемо називати це на всіх. За замовчуванням реалізація зберігає останнє значення, отримані з контейнера в 'm_sizeExtent', що використовується в COleServerDoc::GetZoomFactor , під час обчислення значення мірі КОНТЕЙНЕР, описані вище.
COleServerDoc::OnSetItemRects
Ця функція викликається тільки тоді, коли документ є активним на місці. Це називається, коли контейнер оновлень або розташування елемента або відсікання, застосовується до елемента. ПОЗИЦІЯ ПРЯМОКУТНИК, як обговорюється вище, забезпечує чисельника розрахунок фактор масштабу. Сервер, можна запитати, що за номером COleServerDoc::RequestPositionChangeзмінити позицію елемента. Контейнер може бути або може не відповідати на це запрошення, зателефонувавши OnSetItemRects (із закликом до COleServerItem::SetItemRects).
COleServerDoc::OnDraw
Важливо розуміти, що метафайл, створений головним COleServerItem::OnDraw виробляє точно так же метафайл, незалежно від поточного параметра. Контейнер буде масштабувати метафайл відповідно. Це важлива відмінність між зору OnDraw та пункт сервер OnDraw. Перегляд маркерів масштабування, елемент просто створює на масштабовані метафайл і залишає його до контейнера зробити відповідні масштабування.
Кращий спосіб переконатися, що ваш сервер поводиться правильно, полягає у використанні реалізації COleServerDoc::GetZoomFactor , якщо документ є активним на місці.
Для зміни розміру на місці MFC підтримки
MFC повністю реалізує інтерфейс зміни розміру на місці, як описано у специфікації OLE 2. Інтерфейс користувача підтримується COleResizeBar клас, настроюваний повідомлення WM_SIZECHILDі спеціальної обробки цього повідомлення в COleIPFrameWnd.
Ви можете здійснити різних обробки цього повідомлення, ніж те, що надається в рамках. Як описано вище, в рамках залишає результати на місці зміни розміру до контейнера — сервер реагує на зміни в Коефіцієнт масштабування. Якщо контейнер реагує шляхом встановлення обох МІРОЮ КОНТЕЙНЕР і змінити розмір ПРЯМОКУТНИКА позиції під час обробки, з її COleClientItem::OnChangeItemPosition (називається з дзвінок до COleServerDoc::RequestPositionChange), а потім на місці призведе показані "менше" елемента у вікні редагування. Якщо контейнер реагує на просто визначає ПОЗИЦІЮ ПРЯМОКУТНИК під час оброблення COleClientItem::OnChangeItemPosition, Зума фактор буде змінюватися і елемент буде показано "збільшеною в або з".
Сервер можна контролювати (до деякої міри), що відбувається під час цього переговорів. Електронну таблицю, наприклад може вибрати показувати більше або менше клітинок, коли користувач змінює розмір вікна під час редагування елемента на місці. У текстових редакторів може обрати змінити "поля сторінки", щоб вони такі ж, як вікна і rewrap текст до нового значення. Сервери здійснити це змінивши природні мірою (розмір, що повернувся з COleServerItem::OnGetExtent) коли робиться зміну розміру. Це призведе до позиції ПРЯМОКУТНИК і КОНТЕЙНЕР МІРОЮ змінити на ту ж суму, в результаті чого ж Коефіцієнт масштабування, але більше або менше область перегляду. Крім того, більш-менш документа буде видно в метафайл, породжених OnDraw. У цьому випадку, змінюється сам документ, коли користувач змінює розмір елемента, замість того, щоб просто області перегляду.
Можна реалізувати настроюваний розмір і ще важелі користувальницький інтерфейс, що надається на заміщення WM_SIZECHILD повідомлення в ваш клас COleIPFrameWnd COleResizeBar . Більш докладну інформацію про особливості WM_SIZECHILDпобачити технічне Примітка 24.
Технічні примітки за номером |nbsp; Технічні примітки за категоріями