TN029: Windows Pemisah
Catatan ini menjelaskan Kelas MFC CSplitterWnd, yang menyediakan pemisahan jendela dan mengelola pengubahan ukuran jendela panel lainnya.
Gaya Pemisah
A CSplitterWnd
mendukung dua gaya pemisahan jendela yang berbeda.
Di "pemisah statis," jendela pemisah membuat panel saat dibuat. Urutan dan jumlah panel tidak pernah berubah. Bilah pemisah digunakan untuk mengubah ukuran panel yang berbeda. Anda bisa menggunakan gaya ini untuk menampilkan kelas tampilan yang berbeda di setiap panel. Editor grafis Visual C++ dan Windows File Manager adalah contoh program yang menggunakan gaya pemisah ini. Gaya jendela pemisah ini tidak menggunakan kotak pemisah.
Di "pemisah dinamis", panel tambahan dibuat dan dihancurkan saat pengguna memisahkan dan membatalkan pemisahan tampilan baru. Pemisah ini dimulai dengan satu tampilan dan menyediakan kotak pemisah bagi pengguna untuk memulai pemisahan. Jendela pemisah secara dinamis membuat objek tampilan baru saat tampilan dipisahkan dalam satu arah. Objek tampilan baru ini mewakili panel baru. Jika tampilan dipisahkan dalam dua arah dengan menggunakan antarmuka keyboard, jendela pemisah membuat tiga objek tampilan baru untuk tiga panel baru. Saat pemisahan aktif, Windows menampilkan kotak pemisah sebagai bilah pemisah di antara panel. Windows menghancurkan objek tampilan tambahan ketika pengguna menghapus pemisahan, tetapi tampilan asli tetap ada sampai jendela pemisah itu sendiri dihancurkan. Microsoft Excel dan Microsoft Word adalah contoh aplikasi yang menggunakan gaya pemisah dinamis.
Saat Anda membuat salah satu jenis jendela pemisah, Anda harus menentukan jumlah maksimum baris dan kolom yang akan dikelola pemisah. Pemisah statis akan membuat panel untuk mengisi semua baris dan kolom. Pemisah dinamis hanya akan membuat panel pertama saat CSplitterWnd
dibuat.
Jumlah maksimum panel yang bisa Anda tentukan untuk pemisah statis adalah 16 baris dengan 16 kolom. Konfigurasi yang direkomendasikan adalah:
1 baris x 2 kolom : biasanya dengan panel dissimilar
2 baris x 1 kolom : biasanya dengan panel yang berbeda
2 baris x 2 kolom : biasanya dengan panel serupa
Jumlah maksimum panel yang bisa Anda tentukan untuk pemisah dinamis adalah 2 baris dengan 2 kolom. Konfigurasi yang direkomendasikan adalah:
1 baris x 2 kolom : untuk data kolom
2 baris x 1 kolom : untuk tekstual atau data lainnya
2 baris x 2 kolom : untuk data berorientasi kisi atau tabel
Contoh Pemisah
Banyak program sampel MFC menggunakan jendela pemisah secara langsung atau tidak langsung. Sampel Umum MFC VIEWEX mengilustrasikan beberapa penggunaan pemisah statis, termasuk cara menempatkan pemisah dalam pemisah.
Anda juga dapat menggunakan ClassWizard untuk membuat kelas jendela bingkai anak antarmuka beberapa dokumen (MDI) baru yang berisi jendela pemisah. Untuk informasi selengkapnya tentang jendela pemisah, lihat Beberapa Tipe Dokumen, Tampilan, dan Jendela Bingkai.
Terminologi yang Digunakan oleh Implementasi
Berikut adalah daftar istilah yang khusus untuk jendela pemisah:
CSplitterWnd
: Jendela yang menyediakan kontrol pemisahan panel dan bilah gulir yang dibagikan di antara semua panel pada baris atau kolom. Anda menentukan baris dan kolom dengan angka berbasis nol (panel pertama adalah baris = 0 dan kolom = 0).
Panel: Jendela khusus aplikasi yang CSplitterWnd
dikelola. Panel biasanya merupakan objek yang berasal dari Kelas CView, tetapi dapat berupa objek CWnd apa pun yang memiliki ID jendela anak yang sesuai.
Untuk menggunakan CWnd
objek -turunan, teruskan RUNTIME_CLASS objek ke CreateView
fungsi seperti yang Anda lakukan jika Anda menggunakan CView
kelas -turunan. Kelas Anda harus menggunakan DECLARE_DYNCREATE dan IMPLEMENT_DYNCREATE karena kerangka kerja menggunakan pembuatan dinamis saat runtime. Meskipun ada banyak kode dalam CSplitterWnd
yang khusus untuk CView
kelas , CObject::IsKindOf selalu digunakan sebelum tindakan tersebut dilakukan.
Bilah Pemisah: Kontrol yang ditempatkan di antara baris dan kolom panel. Ini dapat digunakan untuk menyesuaikan ukuran baris atau kolom panel.
Kotak Pemisah: Kontrol dalam dinamis CSplitterWnd
yang bisa Anda gunakan untuk membuat baris atau kolom panel baru. Ini terletak di bagian atas bilah gulir vertikal atau di sebelah kiri bilah gulir horizontal.
Persimpangan Pemisah: Persimpangan bilah pemisah vertikal dan bilah pemisah horizontal. Anda dapat menyeretnya untuk menyesuaikan ukuran baris dan kolom panel secara bersamaan.
Bilah Gulir Bersama
Kelas ini CSplitterWnd
juga mendukung bilah gulir bersama. Kontrol bilah gulir ini adalah turunan dari CSplitterWnd
dan dibagikan dengan panel yang berbeda di pemisah.
Misalnya, di jendela kolom 1 baris x 2, Anda dapat menentukan WS_VSCROLL saat membuat CSplitterWnd
. Windows membuat kontrol bilah gulir khusus yang dibagikan di antara dua panel.
[ ][ ][^]
[pane00][pane01][|]
[ ][ ][v]
Saat pengguna memindahkan bilah gulir, WM_VSCROLL pesan akan dikirim ke kedua tampilan. Saat salah satu tampilan mengatur posisi bilah gulir, bilah gulir bersama akan diatur.
Perhatikan bahwa bilah gulir bersama paling berguna dengan objek tampilan serupa. Jika Anda mencampur tampilan dari berbagai jenis dalam pemisah, maka Anda mungkin harus menulis kode khusus untuk mengoordinasikan posisi gulirnya. Setiap CView
kelas turunan yang menggunakan CWnd
API bilah gulir akan mendelegasikan ke bilah gulir bersama jika ada. Implementasi CScrollView
adalah salah satu contoh CView
kelas yang mendukung bilah gulir bersama. Kelas yang tidak berasal dari CView
kelas , yang mengandalkan bilah gulir non-kontrol, atau kelas yang menggunakan implementasi Windows standar (misalnya, CEditView
) tidak akan berfungsi dengan fitur bilah gulir bersama dari CSplitterWnd
.
Ukuran Minimum
Untuk setiap baris ada tinggi baris minimum, dan untuk setiap kolom ada lebar kolom minimum. Minimum ini menjamin bahwa panel tidak terlalu kecil untuk ditampilkan secara rinci.
Untuk jendela pemisah statis, tinggi baris minimum awal dan lebar kolom adalah 0. Untuk jendela pemisah dinamis, tinggi baris minimum awal dan lebar kolom diatur oleh parameter sizeMin fungsi CSplitterWnd::Create
.
Anda dapat mengubah ukuran minimum ini dengan menggunakan fungsi CSplitterWnd::SetRowInfo dan CSplitterWnd::SetColumnInfo .
Ukuran Aktual vs. Ideal
Tata letak panel di jendela pemisah bergantung pada ukuran bingkai yang berisinya. Saat pengguna mengubah ukuran bingkai yang berisi, CSplitterWnd
reposisi dan mengubah ukuran panel sehingga sesuai sebaik mungkin.
Pengguna dapat mengatur tinggi baris dan ukuran lebar kolom secara manual, atau program dapat mengatur ukuran ideal dengan menggunakan CSplitterWnd
kelas . Ukuran aktual bisa lebih kecil atau lebih besar dari yang ideal. Windows akan menyesuaikan ukuran aktual jika tidak ada cukup ruang untuk menampilkan ukuran ideal atau jika ada terlalu banyak ruang kosong di sebelah kanan atau bawah jendela pemisah.
Kontrol Kustom
Anda dapat mengambil alih banyak fungsi untuk menyediakan perilaku yang disesuaikan dan antarmuka yang disesuaikan. Anda dapat mengambil alih set pertama ini untuk menyediakan citra alternatif untuk berbagai komponen grafis jendela pemisah.
virtual void OnDrawSpltter(CDC* pDC, ESplitType nType, const CRect& rect);
virtual void OnInvertTracker(const CRect& rect);
Anda memanggil fungsi ini untuk membuat kontrol bilah gulir bersama. Anda dapat mengambil alihnya untuk membuat kontrol tambahan di samping bilah gulir.
virtual BOOL CreateScrollBarCtrl(DWORD dwStyle, UINT nID);
Fungsi-fungsi ini mengimplementasikan logika jendela pemisah dinamis. Anda dapat mengambil alih ini untuk memberikan logika pemisah yang lebih canggih.
virtual void DeleteView(int row, int col);
virtual BOOL SplitRow(int cyBefore);
virtual BOOL SplitColumn(int cxBefore);
virtual void DeleteRow(int rowDelete);
virtual void DeleteColumn(int colDelete);
Fungsionalitas CView
Kelas CView
menggunakan perintah tingkat tinggi berikut untuk mendelegasikan ke CSplitterWnd
implementasi. Karena perintah ini virtual, implementasi standar CView
tidak akan mengharuskan seluruh CSplitterWnd
implementasi untuk ditautkan. Untuk aplikasi yang menggunakan CView
tetapi tidak CSplitterWnd
, CSplitterWnd
implementasi tidak akan ditautkan dengan aplikasi.
virtual BOOL CanActivateNext(BOOL bPrev = FALSE);
Memeriksa apakah ID_NEXT_PANE atau ID_PREV_PANE saat ini dimungkinkan.
virtual void ActivateNext(BOOL bPrev = FALSE);
Menjalankan perintah "Panel Berikutnya" atau "Panel Sebelumnya".
virtual BOOL DoKeyboardSplit();
Menjalankan perintah pemisahan keyboard, biasanya "Pemisahan Jendela".
Baca juga
Catatan Teknis menurut Angka
Catatan Teknis menurut Kategori