Bagikan melalui


TN040: Pengubahan Ukuran dan Pembesaran Ukuran dan Pembesaran Di Tempat MFC/OLE

Catatan

Catatan teknis berikut belum diperbarui sejak pertama kali disertakan dalam dokumentasi online. Akibatnya, beberapa prosedur dan topik mungkin kedaluarsa atau salah. Untuk informasi terbaru, disarankan agar Anda mencari topik yang menarik dalam indeks dokumentasi online.

Catatan ini akan membahas masalah yang berkaitan dengan pengeditan di tempat dan bagaimana server harus menyelesaikan pembesaran tampilan dan pengubahan ukuran di tempat yang benar. Dengan aktivasi di tempat, konsep WYSIWYG diambil satu langkah lebih jauh dalam kontainer dan server yang bekerja sama satu sama lain, dan khususnya menafsirkan spesifikasi OLE dengan cara yang sama.

Karena interaksi yang erat antara kontainer dan server yang mendukung aktivasi di tempat ada sejumlah harapan dari pengguna akhir yang harus dipertahankan:

  • Tampilan presentasi (metafile yang digambar dalam COleServerItem::OnDraw penimpaan) akan terlihat sama persis seperti saat digambar untuk pengeditan (kecuali bahwa alat pengeditan tidak terlihat).

  • Ketika kontainer zoom, jendela server juga harus!

  • Kontainer dan server harus menampilkan objek untuk pengeditan menggunakan metrik yang sama. Ini berarti menggunakan mode pemetaan berdasarkan jumlah piksel logis per inci — bukan piksel fisik per inci, saat merender pada perangkat tampilan.

Catatan

Karena aktivasi di tempat hanya berlaku untuk item yang disematkan (tidak ditautkan), pembesaran hanya berlaku untuk objek yang disematkan. Anda akan melihat API di keduanya COleServerDoc dan COleServerItem yang digunakan untuk memperbesar tampilan. Alasan untuk dikotomi ini adalah bahwa hanya fungsi yang valid untuk item yang ditautkan dan disematkan COleServerItem (ini memungkinkan Anda memiliki implementasi umum) dan fungsi yang hanya valid untuk objek tertanam yang terletak di COleServerDoc kelas (dari perspektif server, itu adalah dokumen yang disematkan).

Sebagian besar beban ditempatkan pada pelaksana server, karena server harus mengetahui faktor zoom kontainer dan memodifikasi antarmuka pengeditannya sebagaimana mestinya. Tetapi bagaimana server menentukan faktor zoom yang digunakan kontainer

Dukungan MFC untuk Memperbesar

Faktor zoom saat ini dapat ditentukan dengan memanggil COleServerDoc::GetZoomFactor. Memanggil ini ketika dokumen tidak aktif di tempat akan selalu menghasilkan faktor zoom 100% (atau rasio 1:1). Memanggilnya saat aktif di tempat dapat mengembalikan sesuatu selain 100%.

Untuk contoh memperbesar tampilan dengan benar, lihat sampel MFC OLE HIERSVR. Memperbesar HIERSVR rumit karena menampilkan teks, dan teks, secara umum, tidak menskalakan secara linier (petunjuk, konvensi tipografi, lebar desain, dan tinggi semuanya mempersulit masalah). Namun, HIERSVR adalah referensi yang wajar untuk menerapkan zoom dengan benar, dan begitu juga MFC Tutorial SCRIBBLE (langkah 7).

COleServerDoc::GetZoomFactormenentukan faktor zoom berdasarkan sejumlah metrik berbeda yang tersedia baik dari kontainer atau dari implementasi kelas dan COleServerDoc AndaCOleServerItem. Singkatnya, faktor zoom saat ini ditentukan oleh rumus berikut:

Position Rectangle (PR) / Container Extent (CE)

POSITION RECTANGLE ditentukan oleh kontainer. Ini dikembalikan ke server selama aktivasi di tempat ketika COleClientItem::OnGetItemPosition dipanggil dan diperbarui ketika kontainer memanggil server COleServerDoc::OnSetItemRects (dengan panggilan ke COleClientItem::SetItemRects).

TINGKAT KONTAINER sedikit lebih kompleks untuk dihitung. Jika kontainer telah memanggil COleServerItem::OnSetExtent (dengan panggilan ke COleClientItem::SetExtent), maka CONTAINER EXTENT adalah nilai ini dikonversi ke piksel berdasarkan jumlah piksel per inci logis. Jika kontainer belum memanggil SetExtent (yang biasanya terjadi), maka CONTAINER EXTENT adalah ukuran yang dikembalikan dari COleServerItem::OnGetExtent. Jadi, jika kontainer belum disebut SetExtent, kerangka kerja mengasumsikan bahwa jika itu dilakukan, kontainer akan memanggilnya dengan 100% dari tingkat alami (nilai yang dikembalikan dari COleServerItem::GetExtent). Dinyatakan dengan cara lain, kerangka kerja mengasumsikan bahwa kontainer menampilkan 100% (tidak lebih, tidak kurang) dari item.

Penting untuk dicatat bahwa meskipun COleServerItem::OnSetExtent dan COleServerItem::OnGetExtent memiliki nama yang sama, mereka tidak memanipulasi atribut item yang sama. OnSetExtent dipanggil untuk memberi tahu server berapa banyak objek yang terlihat dalam kontainer (terlepas dari faktor zoom) dan OnGetExtent dipanggil oleh kontainer untuk menentukan ukuran objek yang ideal.

Dengan melihat setiap API yang terlibat, Anda bisa mendapatkan gambar yang lebih jelas:

COleServerItem::OnGetExtent

Fungsi ini harus mengembalikan "ukuran alami" dalam unit HIMETRIC item. Cara terbaik untuk memikirkan "ukuran alami" adalah dengan mendefinisikannya sebagai ukuran yang mungkin muncul ketika dicetak. Ukuran yang dikembalikan di sini konstan untuk konten item tertentu (seperti metafile, yang konstan untuk item tertentu). Ukuran ini tidak berubah ketika pembesaran diterapkan ke item. Biasanya tidak berubah ketika kontainer memberikan item lebih atau kurang ruang dengan memanggil OnSetExtent. Contoh perubahan mungkin dari editor teks sederhana tanpa kemampuan "margin" yang membungkus teks berdasarkan tingkat terakhir yang dikirim oleh kontainer. Jika server berubah, server mungkin harus mengatur bit OLEMISC_RECOMPOSEONRESIZE di registri sistem (lihat dokumentasi OLE SDK untuk informasi selengkapnya tentang opsi ini).

COleServerItem::OnSetExtent

Fungsi ini dipanggil ketika kontainer menunjukkan "kurang lebih" objek. Sebagian besar kontainer tidak akan memanggil ini sama sekali. Implementasi default menyimpan nilai terakhir yang diterima dari kontainer di 'm_sizeExtent', yang digunakan saat COleServerDoc::GetZoomFactor menghitung nilai CONTAINER EXTENT yang dijelaskan di atas.

COleServerDoc::OnSetItemRects

Fungsi ini hanya dipanggil ketika dokumen aktif di tempat. Ini dipanggil ketika kontainer memperbarui posisi item atau kliping yang diterapkan ke item. PERSEGI POSISI, seperti yang dibahas di atas, menyediakan pembilang untuk perhitungan faktor zoom. Server dapat meminta agar posisi item diubah dengan memanggil COleServerDoc::RequestPositionChange. Kontainer mungkin atau mungkin tidak merespons permintaan ini dengan memanggil OnSetItemRects (dengan panggilan ke COleServerItem::SetItemRects).

COleServerDoc::OnDraw

Penting untuk disadari bahwa metafile yang dibuat dengan mengambil COleServerItem::OnDraw alih menghasilkan metafile yang sama persis, terlepas dari faktor zoom saat ini. Kontainer akan menskalakan metafile sesuai kebutuhan. Ini adalah perbedaan penting antara tampilan OnDraw dan item OnDrawserver . Tampilan menangani pembesaran tampilan, item hanya membuat metafile yang dapat diperbesar dan membiarkannya hingga kontainer untuk melakukan pembesaran tampilan yang sesuai.

Cara terbaik untuk memastikan bahwa server Anda bersifat benar adalah dengan menggunakan implementasi COleServerDoc::GetZoomFactor jika dokumen Anda aktif di tempat.

Dukungan MFC untuk Mengubah Ukuran Di Tempat

MFC sepenuhnya mengimplementasikan antarmuka pengubahan ukuran di tempat seperti yang dijelaskan dalam spesifikasi OLE 2. Antarmuka pengguna didukung oleh COleResizeBar kelas, pesan kustom WM_SIZECHILD, dan penanganan khusus pesan ini di COleIPFrameWnd.

Anda mungkin ingin menerapkan penanganan pesan ini yang berbeda dari apa yang disediakan oleh kerangka kerja. Seperti yang dijelaskan di atas, kerangka kerja meninggalkan hasil pengubahan ukuran di tempat hingga kontainer — server merespons perubahan faktor zoom. Jika kontainer bereaksi dengan mengatur CONTAINER EXTENT dan POSITION RECTANGLE selama pemrosesannya COleClientItem::OnChangeItemPosition (dipanggil sebagai akibat dari panggilan ke COleServerDoc::RequestPositionChange) maka pengubahan ukuran di tempat akan menghasilkan menampilkan "kurang lebih" item di jendela pengeditan. Jika kontainer bereaksi hanya dengan mengatur POSITION RECTANGLE selama pemrosesan COleClientItem::OnChangeItemPosition, faktor zoom akan berubah dan item akan ditampilkan "diperbesar atau diperkecil."

Server dapat mengontrol (hingga beberapa derajat) apa yang terjadi selama negosiasi ini. Spreadsheet, misalnya mungkin memilih untuk menampilkan lebih banyak atau lebih sedikit sel saat pengguna mengubah ukuran jendela saat mengedit item di tempat. Pemroses kata mungkin memilih untuk mengubah "margin halaman" sehingga sama dengan jendela dan me-rewrap teks ke margin baru. Server menerapkan ini dengan mengubah tingkat alami (ukuran yang dikembalikan dari COleServerItem::OnGetExtent) ketika pengubahan ukuran dilakukan. Ini akan menyebabkan POSITION RECTANGLE dan CONTAINER EXTENT berubah dengan jumlah yang sama, menghasilkan faktor zoom yang sama, tetapi area tampilan yang lebih besar atau lebih kecil. Selain itu, lebih atau kurang dari dokumen akan terlihat dalam metafile yang dihasilkan oleh OnDraw. Dalam hal ini, dokumen itu sendiri berubah ketika pengguna mengubah ukuran item, bukan hanya area tampilan.

Anda dapat menerapkan perubahan ukuran kustom dan masih memanfaatkan antarmuka pengguna yang disediakan dengan COleResizeBar menimpa pesan WM_SIZECHILD di kelas Anda COleIPFrameWnd . Untuk informasi selengkapnya tentang WM_SIZECHILD spesifik, lihat Catatan Teknis 24.

Baca juga

Catatan Teknis menurut Angka
Catatan Teknis menurut Kategori