Kontrol Font
Untuk menyederhanakan integrasi dan konfigurasi dukungan font dalam aplikasi yang memerlukan kemampuan pemrosesan kata dan pengeditan teks, kerangka kerja Windows Ribbon menyediakan Kontrol Font khusus yang mengekspos berbagai properti font seperti nama typeface, gaya, ukuran titik, dan efek.
- Pendahuluan
- Pengalaman yang Konsisten
- Integrasi dan Konfigurasi yang Mudah
- Perataan dengan Struktur Teks GDI Umum
- Menambahkan FontControl
- Tentukan Penangan Perintah FontControl
- Topik terkait
Pengantar
Kontrol Font adalah kontrol komposit yang terdiri dari tombol, tombol alih, kotak daftar drop-down, dan kotak kombo, yang semuanya digunakan untuk menentukan properti font atau opsi pemformatan tertentu.
Cuplikan layar berikut ini memperlihatkan Kontrol Font Pita di WordPad untuk Windows 7.
Pengalaman yang Konsisten
Sebagai kontrol Pita bawaan, Kontrol Font meningkatkan manajemen font, fungsionalitas pemilihan, dan pemformatan secara keseluruhan, dan memberikan pengalaman pengguna yang kaya dan konsisten di semua aplikasi Pita.
Pengalaman yang konsisten ini mencakup
Pemformatan standar dan pilihan font di seluruh aplikasi Pita.
Representasi font standar di seluruh aplikasi Pita.
Otomatis, di Windows 7, aktivasi font yang didasarkan pada pengaturan Perlihatkan atau Sembunyikan untuk setiap font di panel kontrol Font . Kontrol Font hanya menampilkan font yang diatur ke Perlihatkan.
Catatan
Di Windows Vista, panel kontrol Font tidak menawarkan fungsionalitas Perlihatkan atau Sembunyikan , sehingga semua font diaktifkan.
Manajemen font yang tersedia langsung dari kontrol.
Cuplikan layar berikut menunjukkan bahwa panel kontrol Font dapat diakses langsung dari Kontrol Font.
Dukungan untuk pratinjau otomatis.
Paparan font yang paling relevan bagi pengguna, seperti
- Daftar font yang dilokalkan untuk pengguna internasional.
- Daftar font berdasarkan perangkat input.
Catatan
Dukungan untuk fungsionalitas ini tidak tersedia pada platform apa pun yang lebih lama dari Windows 7.
Integrasi dan Konfigurasi yang Mudah
Dengan menyediakan fungsionalitas standar, dapat digunakan kembali, dan mudah dikonsumsi, Kontrol Font Pita meringankan beban mengintegrasikan dukungan font ke dalam aplikasi.
Detail pemilihan dan pemformatan font dibungkus dalam satu elemen logika mandiri yang
- Menghilangkan manajemen kompleks interdependensi kontrol yang khas dari implementasi kontrol font.
- Memerlukan satu handler Perintah untuk semua fungsionalitas yang diekspos oleh sub-kontrol Kontrol Font.
Handler Perintah tunggal ini memungkinkan Kontrol Font untuk mengelola fungsionalitas berbagai sub-kontrol secara internal; sub-kontrol tidak pernah berinteraksi langsung dengan aplikasi, terlepas dari fungsinya.
Fitur lain dari Kontrol Font termasuk
Otomatis, generasi sadar DPI dari representasi bitmap WYSIWYG (apa yang Anda lihat adalah apa yang Anda dapatkan) untuk setiap font di menu keluarga Font .
Bitmap dan tipsalat keluarga font yang dilokalkan.
Enumerasi, pengelompokan, dan metadata font untuk mengelola dan menyajikan font.
Catatan
Dukungan untuk fungsionalitas ini tidak tersedia pada platform apa pun yang lebih lama dari Windows 7 .
Pemilih warna Teks dan warna sorotan teks berwarna turun bawah yang mencerminkan perilaku Pemilih Warna Turun Bawah Pita.
Dukungan pratinjau otomatis oleh semua subkontrol berbasis galeri Kontrol Font: Keluarga font, Ukuran font, Warna teks, dan Warna sorotan teks.
Perataan dengan Struktur Teks GDI Umum
Komponen tumpukan teks Windows Graphics Device Interface (GDI) digunakan untuk mengekspos fungsionalitas pemilihan font dan pemformatan melalui Kontrol Font Pita. Berbagai fitur font yang didukung oleh Struktur LOGFONT, Struktur CHOOSEFONT, dan Struktur CHARFORMAT2 diekspos melalui sub-kontrol yang disertakan dalam Kontrol Font.
Subkontrol yang ditampilkan dalam Kontrol Font bergantung pada templat FontType yang dideklarasikan dalam markup Pita. Templat FontType (dibahas secara lebih rinci di bagian berikut) dirancang untuk menyelaraskan dengan struktur teks Windows Graphics Device Interface (GDI) umum.
Menambahkan FontControl
Bagian ini menguraikan langkah-langkah dasar untuk menambahkan Kontrol Font ke aplikasi Pita.
Mendeklarasikan FontControl dalam Markup
Seperti kontrol Pita lainnya, Kontrol Font dinyatakan dalam markup dengan elemen FontControl dan terkait dengan deklarasi Perintah melalui ID Perintah. Ketika aplikasi dikompilasi, ID Perintah digunakan untuk mengikat Perintah ke handler Perintah di aplikasi host.
Catatan
Jika tidak ada ID Perintah yang dideklarasikan dengan FontControl dalam markup, maka satu akan dihasilkan oleh kerangka kerja.
Karena sub-kontrol Kontrol Font tidak diekspos secara langsung, kustomisasi Kontrol Font dibatasi hingga tiga templat tata letak FontType yang ditentukan oleh kerangka kerja.
Kustomisasi lebih lanjut dari Kontrol Font dapat dicapai dengan menggabungkan templat tata letak dengan atribut FontControl seperti IsHighlightButtonVisible, IsStrikethroughButtonVisible, dan IsUnderlineButtonVisible.
Catatan
Fungsionalitas font di luar yang diekspos oleh templat dan atribut Kontrol Font standar memerlukan implementasi kontrol font kustom yang berada di luar lingkup artikel ini.
Tabel berikut ini mencantumkan templat Kontrol Font dan tipe kontrol edit yang diratakan dengan setiap templat.
Templat | Dukungan |
---|---|
FontOnly | Struktur LOGFONT |
FontWithColor | STRUKTUR CHOOSEFONT |
RichFont | Struktur CHARFORMAT2 |
Tabel berikut ini mencantumkan kontrol yang terkait dengan setiap templat dan mengidentifikasi kontrol yang opsional untuk templat terkait.
Kontrol
Templat
RichFont
FontWithColor
FontOnly
Default
Opsional
Default
Opsional
Default
Opsional
Kotak kombo ukuran font
Ya
Tidak
Ya
Tidak
Ya
Tidak
Kotak kombo keluarga font
Ya
Tidak
Ya
Tidak
Ya
Tidak
Tombol perkembang font
Ya
Ya
Ya
Ya
-
-
Tombol susutkan font
Ya
Ya
Ya
Ya
-
-
Tombol Tebal
Ya
Tidak
Ya
Tidak
Ya
Tidak
Tombol miring
Ya
Tidak
Ya
Tidak
Ya
Tidak
Tombol garis bawah
Ya
Tidak
Ya
Ya
Ya
Ya
Tombol Coret
Ya
Tidak
Ya
Ya
Ya
Ya
Tombol subskrip
Ya
Tidak
-
-
-
-
Tombol superskrip
Ya
Tidak
-
-
-
-
Tombol warna sorotan teks
Ya
Tidak
Ya
Ya
-
-
Tombol warna teks
Ya
Tidak
Ya
Tidak
-
-
Saat perilaku tata letak Kontrol Font dideklarasikan, kerangka kerja Pita menyediakan templat tata letak SizeDefinition opsional, OneFontControl
, yang menentukan dua konfigurasi sub-kontrol berdasarkan ukuran Pita dan ruang yang tersedia untuk Kontrol Font. Untuk informasi selengkapnya, lihat Menyesuaikan Pita Melalui Definisi Ukuran dan Kebijakan Penskalaan.
Menambahkan FontControl ke Pita
Contoh kode berikut menunjukkan persyaratan markup dasar untuk menambahkan Kontrol Font ke Pita:
Bagian kode ini memperlihatkan markup deklarasi Perintah FontControl , termasuk Perintah Tab dan Grup yang diperlukan untuk menampilkan kontrol di Pita.
<Command Name="cmdTab1"
Comment="These comments are optional and are inserted into the header file."
Symbol="cmdTab1" Id="10000" >
<Command.LabelTitle>Tab 1</Command.LabelTitle>
</Command>
<Command Name="cmdGroup1" Comment="Group #1" Symbol="cmdGroup1" Id="20000">
<!-- This image is used when the group scales to a pop-up. -->
<Command.SmallImages>
<Image>res/Button_Image.bmp</Image>
</Command.SmallImages>
</Command>
<Command Name="cmdFontControl" Symbol="cmdFontControl" Comment="FontControl" Id="25001" Keytip="F" />
Bagian kode ini menunjukkan markup yang diperlukan untuk mendeklarasikan dan mengaitkan FontControl dengan Perintah melalui ID Perintah. Contoh khusus ini mencakup deklarasi Tab dan Grup , dengan preferensi penskalaan.
<Ribbon.Tabs>
<Tab CommandName="cmdTab1">
<Tab.ScalingPolicy>
<ScalingPolicy>
<ScalingPolicy.IdealSizes>
<Scale Group="cmdGroup1" Size="Large" />
</ScalingPolicy.IdealSizes>
<!-- Describe how the FontControl group scales. -->
<Scale Group="cmdGroup1" Size="Medium" />
<Scale Group="cmdGroup1" Size="Popup" />
</ScalingPolicy>
<Group CommandName="cmdGroup1" SizeDefinition="OneFontControl">
<FontControl CommandName="cmdFontControl" FontType="RichFont" />
</Group>
</Tab>
</Ribbon.Tabs>
Menambahkan FontControl ke ContextPopup
Menambahkan Kontrol Font ke Popup Konteks memerlukan prosedur yang mirip dengan menambahkan Kontrol Font ke Pita. Namun, Kontrol Font di MiniToolbar dibatasi untuk kumpulan sub-kontrol default yang umum untuk semua templat Kontrol Font: Keluarga font, Ukuran font, Tebal, dan Miring.
Contoh kode berikut menunjukkan persyaratan markup dasar untuk menambahkan Kontrol Font ke Popup Konteks:
Bagian kode ini memperlihatkan markup deklarasi Perintah FontControl yang diperlukan untuk menampilkan FontControl di ContextPopup.
<Command Name="cmdFontControl" Symbol="cmdFontControl" Comment="FontControl" Id="25001" />
Bagian kode ini menunjukkan markup yang diperlukan untuk mendeklarasikan dan mengaitkan FontControl dengan Perintah melalui ID Perintah.
<ContextPopup.MiniToolbars>
<MiniToolBar Name="MiniToolbar1">
<MenuCategory Class="StandardItems">
<FontControl CommandName="cmdFontControl" />
</MenuCategory>
</MiniToolBar>
</ContextPopup.MiniToolbars>
Tipsalat kunci
Setiap sub-kontrol dalam Kontrol Font Pita dapat diakses melalui pintasan keyboard, atau tip tombol. Tips kunci ini telah ditentukan sebelumnya dan ditetapkan ke setiap sub-kontrol oleh kerangka kerja.
Jika nilai atribut Keytip ditetapkan ke elemen FontControl dalam markup, nilai ini ditambahkan sebagai awalan ke keytip yang ditentukan kerangka kerja.
Catatan
Aplikasi harus menerapkan aturan karakter tunggal untuk awalan ini.
Tabel berikut mencantumkan tip kunci yang ditentukan oleh kerangka kerja.
Sub-kontrol | Tipsalat kunci |
---|---|
Keluarga font | F |
Gaya font | T |
Ukuran font | S |
Menumbuhkan font | G |
Menyusutkan font | K |
Tebal | B |
Miring | I |
Menggarisbawahi | U |
Coretan | X |
Superscript | Catatan Y atau Z : Jika atribut Keytip tidak dinyatakan dalam markup, tip kunci defaultnya adalah Y; jika tidak, keytip defaultnya adalah Keytip + Z. |
Subskrip | A |
Warna font | C |
Sorotan font | H |
Awalan yang direkomendasikan untuk Pita EN-US Antarmuka Pengguna Multibahasa (MUI) adalah 'F', seperti yang diperlihatkan dalam contoh berikut.
<Command Name="cmdFontControl" Symbol="cmdFontControl" Comment="FontControl" Id="25001" Keytip="F" />
Cuplikan layar berikut mengilustrasikan tips tombol Kontrol Font seperti yang didefinisikan dalam contoh sebelumnya.
File Sumber Daya Pita
Saat file markup dikompilasi, file sumber daya yang berisi semua referensi sumber daya untuk aplikasi Pita dibuat.
Contoh file sumber daya sederhana:
// ******************************************************************************
// * This is an automatically generated file containing the ribbon resource for *
// * your application. *
// ******************************************************************************
#include ".\ids.h"
STRINGTABLE
BEGIN
cmdTab1_LabelTitle_RESID L"Tab 1"
/* LabelTitle cmdTab1_LabelTitle_RESID: These comments are optional and are
inserted into the header file. */
END
cmdGroup1_SmallImages_RESID BITMAP "res\\Button_Image.bmp"
/* SmallImages cmdGroup1_SmallImages_RESID: Group #1 */
STRINGTABLE
BEGIN
cmdFontControl_Keytip_RESID L"F" /* Keytip cmdFontControl_Keytip_RESID: FontControl */
END
FCSAMPLE_RIBBON UIFILE "Debug\\FCSample.bml"
Properti Kontrol Font
Kerangka kerja Pita menentukan kumpulan kunci properti untuk Kontrol Font dan subkontrol konstituennya.
Biasanya, properti Kontrol Font diperbarui di UI pita dengan membatalkan Perintah yang terkait dengan kontrol melalui panggilan ke metode IUIFramework::InvalidateUICommand . Peristiwa pembatalan ditangani, dan pembaruan properti ditentukan, oleh metode panggilan balik IUICommandHandler::UpdateProperty .
Metode panggilan balik IUICommandHandler::UpdateProperty tidak dijalankan, dan aplikasi meminta nilai properti yang diperbarui, hingga properti diperlukan oleh kerangka kerja. Misalnya, saat tab diaktifkan dan kontrol terungkap di UI pita, atau saat tipsalat ditampilkan.
Catatan
Dalam beberapa kasus, properti dapat diambil melalui metode IUIFramework::GetUICommandProperty dan diatur dengan metode IUIFramework::SetUICommandProperty .
Tabel berikut ini mencantumkan kunci properti yang terkait dengan Kontrol Font.
Kunci Properti | Catatan |
---|---|
UI_PKEY_FontProperties | Mengekspos, secara agregat sebagai objek IPropertyStore , semua properti sub-kontrol Kontrol Font. Kerangka kerja mengkueri properti ini ketika UI_INVALIDATIONS_VALUE diteruskan sebagai nilai bendera dalam panggilan ke IUIFramework::InvalidateUICommand. |
UI_PKEY_FontProperties_ChangedProperties | Mengekspos, secara agregat sebagai objek IUISimplePropertySet , hanya properti sub-kontrol Kontrol Font yang telah berubah. |
UI_PKEY_Keytip | Hanya dapat diperbarui melalui pembatalan. |
UI_PKEY_Enabled | Mendukung IUIFramework::GetUICommandProperty dan IUIFramework::SetUICommandProperty. |
Selain properti yang didukung oleh Kontrol Font itu sendiri, kerangka kerja Pita juga menentukan kunci properti untuk setiap sub-kontrol Kontrol Font. Kunci properti ini dan nilainya diekspos oleh kerangka kerja melalui implementasi antarmuka IPropertyStore yang menentukan metode untuk mengelola koleksi, juga disebut tas properti, pasangan nama dan nilai.
Aplikasi ini menerjemahkan struktur font ke properti yang dapat diakses melalui metode antarmuka IPropertyStore . Model ini menekankan perbedaan antara Komponen tumpukan teks Kontrol Font dan Antarmuka Perangkat Grafis (GDI) Windows (Struktur LOGFONT, Struktur CHOOSEFONT, dan Struktur CHARFORMAT2) yang didukung oleh kerangka kerja.
Tabel berikut mencantumkan kontrol individual dan kunci properti terkait.
Kontrol | Kunci Properti | Catatan |
---|---|---|
Ukuran font | UI_PKEY_FontProperties_Size | Saat eksekusi teks berukuran heterogen disorot, kerangka kerja Pita mengatur kontrol ukuran Font menjadi kosong dan nilai UI_PKEY_FontProperties_Size ke 0. Saat tombol Perbesar font atau Susutkan font diklik, semua teks yang disorot diubah ukurannya tetapi perbedaan relatif dalam ukuran teks dipertahankan. |
Keluarga font | UI_PKEY_FontProperties_Family | Nama keluarga font GDI bervariasi menurut lokal sistem. Dengan demikian, jika nilai UI_PKEY_FontProperties_Family dipertahankan di seluruh sesi aplikasi, nilai tersebut harus diambil pada setiap sesi baru. |
Menumbuhkan font | UI_PKEY_FontProperties_Size | Lihat Ukuran font. |
Menyusutkan font | UI_PKEY_FontProperties_Size | Lihat Ukuran font. |
Tebal | UI_PKEY_FontProperties_Bold | |
Miring | UI_PKEY_FontProperties_Italic | |
Menggarisbawahi | UI_PKEY_FontProperties_Underline | |
Coretan | UI_PKEY_FontProperties_Strikethrough | |
Subskrip | UI_PKEY_FontProperties_VerticalPositioning | Jika tombol Subskrip diatur, maka Superskrip juga tidak dapat diatur. |
Superscript | UI_PKEY_FontProperties_VerticalPositioning | Jika tombol Superskrip diatur, maka Subskrip juga tidak dapat diatur. |
Warna sorotan teks | UI_PKEY_FontProperties_BackgroundColor, UI_PKEY_FontProperties_BackgroundColorType | Menyediakan fungsionalitas yang sama dengan HighlightColors templat elemen DropDownColorPicker .Kami sangat menyarankan agar hanya nilai warna sorotan Teks awal yang ditetapkan oleh aplikasi. Nilai terakhir yang dipilih harus dipertahankan dan tidak diatur saat kursor diposisikan ulang dalam dokumen. Ini memungkinkan akses cepat ke pilihan terakhir pengguna, dan pemilih warna tidak harus dibuka kembali. Swatch warna tidak dapat disesuaikan. |
Warna teks | UI_PKEY_FontProperties_ForegroundColor, UI_PKEY_FontProperties_ForegroundColorType | Menyediakan fungsionalitas yang sama dengan StandardColors templat elemen DropDownColorPicker .Kami sangat menyarankan agar hanya nilai warna Teks awal yang ditetapkan oleh aplikasi. Nilai terakhir yang dipilih harus dipertahankan dan tidak diatur saat kursor diposisikan ulang dalam dokumen. Ini memungkinkan akses cepat ke pilihan terakhir pengguna, dan pemilih warna tidak harus dibuka kembali. Swatch warna tidak dapat disesuaikan. |
Tentukan Penangan Perintah FontControl
Bagian ini menjelaskan langkah-langkah yang diperlukan untuk mengikat Kontrol Font ke penangan Perintah.
Peringatan
Setiap upaya untuk memilih swatch warna dari pemilih warna Kontrol Font dapat mengakibatkan pelanggaran akses jika tidak ada penangan Perintah yang terkait dengan kontrol.
Contoh kode berikut menunjukkan cara mengikat Perintah yang dideklarasikan dalam markup ke handler Perintah.
//
// FUNCTION: OnCreateUICommand(UINT, UI_COMMANDTYPE, IUICommandHandler)
//
// PURPOSE: Called by the Ribbon framework for each command specified in markup, to allow
// the host application to bind a command handler to that command.
//
STDMETHODIMP CApplication::OnCreateUICommand(
UINT nCmdID,
__in UI_COMMANDTYPE typeID,
__deref_out IUICommandHandler** ppCommandHandler)
{
UNREFERENCED_PARAMETER(typeID);
UNREFERENCED_PARAMETER(nCmdID);
if (NULL == m_pCommandHandler)
{
HRESULT hr = CCommandHandler::CreateInstance(&m_pCommandHandler);
if (FAILED(hr))
{
return hr;
}
}
return m_pCommandHandler->QueryInterface(IID_PPV_ARGS(ppCommandHandler));
}
Contoh kode berikut menggambarkan cara mengimplementasikan metode IUICommandHandler::Execute untuk Kontrol Font.
//
// FUNCTION: Execute()
//
// PURPOSE: Called by the Ribbon framework when a command is executed
// by the user. For example, when a button is pressed.
//
STDMETHODIMP CCommandHandler::Execute(
UINT nCmdID,
UI_EXECUTIONVERB verb,
__in_opt const PROPERTYKEY* key,
__in_opt const PROPVARIANT* ppropvarValue,
__in_opt IUISimplePropertySet* pCommandExecutionProperties)
{
UNREFERENCED_PARAMETER(nCmdID);
HRESULT hr = E_NOTIMPL;
if ((key) && (*key == UI_PKEY_FontProperties))
{
// Font properties have changed.
switch (verb)
{
case UI_EXECUTIONVERB_EXECUTE:
{
hr = E_POINTER;
if (pCommandExecutionProperties != NULL)
{
// Get the changed properties.
PROPVARIANT varChanges;
hr = pCommandExecutionProperties->GetValue(UI_PKEY_FontProperties_ChangedProperties, &varChanges);
if (SUCCEEDED(hr))
{
IPropertyStore *pChanges;
hr = UIPropertyToInterface(UI_PKEY_FontProperties, varChanges, &pChanges);
if (SUCCEEDED(hr))
{
// Using the changed properties, set the new font on the selection on RichEdit control.
g_pFCSampleAppManager->SetValues(pChanges);
pChanges->Release();
}
PropVariantClear(&varChanges);
}
}
break;
}
case UI_EXECUTIONVERB_PREVIEW:
{
hr = E_POINTER;
if (pCommandExecutionProperties != NULL)
{
// Get the changed properties for the preview event.
PROPVARIANT varChanges;
hr = pCommandExecutionProperties->GetValue(UI_PKEY_FontProperties_ChangedProperties, &varChanges);
if (SUCCEEDED(hr))
{
IPropertyStore *pChanges;
hr = UIPropertyToInterface(UI_PKEY_FontProperties, varChanges, &pChanges);
if (SUCCEEDED(hr))
{
// Set the previewed values on the RichEdit control.
g_pFCSampleAppManager->SetPreviewValues(pChanges);
pChanges->Release();
}
PropVariantClear(&varChanges);
}
}
break;
}
case UI_EXECUTIONVERB_CANCELPREVIEW:
{
hr = E_POINTER;
if (ppropvarValue != NULL)
{
// Cancel the preview.
IPropertyStore *pValues;
hr = UIPropertyToInterface(UI_PKEY_FontProperties, *ppropvarValue, &pValues);
if (SUCCEEDED(hr))
{
g_pFCSampleAppManager->CancelPreview(pValues);
pValues->Release();
}
}
break;
}
}
}
return hr;
}
Contoh kode berikut menggambarkan cara mengimplementasikan metode IUICommandHandler::UpdateProperty untuk Kontrol Font.
//
// FUNCTION: UpdateProperty()
//
// PURPOSE: Called by the Ribbon framework when a command property (PKEY) needs to be updated.
//
// COMMENTS:
//
// This function is used to provide new command property values, such as labels, icons, or
// tooltip information, when requested by the Ribbon framework.
//
//
STDMETHODIMP CCommandHandler::UpdateProperty(
UINT nCmdID,
__in REFPROPERTYKEY key,
__in_opt const PROPVARIANT* ppropvarCurrentValue,
__out PROPVARIANT* ppropvarNewValue)
{
UNREFERENCED_PARAMETER(nCmdID);
HRESULT hr = E_NOTIMPL;
if (key == UI_PKEY_FontProperties)
{
hr = E_POINTER;
if (ppropvarCurrentValue != NULL)
{
// Get the font values for the selected text in the font control.
IPropertyStore *pValues;
hr = UIPropertyToInterface(UI_PKEY_FontProperties, *ppropvarCurrentValue, &pValues);
if (SUCCEEDED(hr))
{
g_pFCSampleAppManager->GetValues(pValues);
// Provide the new values to the font control.
hr = UIInitPropertyFromInterface(UI_PKEY_FontProperties, pValues, ppropvarNewValue);
pValues->Release();
}
}
}
return hr;
}
Topik terkait
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk