Kata kunci : dialog, dialog, dapat diputar ulang
1. Masalah diangkat
Masalahnya berasal dari Stanley_xu, berharap hanya mendapatkan tombol tutup (itu juga bisa membantu), tidak ada ikon untuk program di kiri atas dan kotak dialog dapat mengubah ukuran jendela.
Properti Borderstyle dan Bordericons ditetapkan untuk TForm dalam VCL untuk menyederhanakan pengaturan gaya jendela (jika tidak, fungsi API seperti SetWindowlong dan GetWindowlong harus dipanggil). Definisi dan deskripsi Tformborderstyle dan Tbordericon adalah sebagai berikut:
Makna nilai
BSDIALOG TIDAK DAPAT DILAKUKAN;
Bssingle tidak dapat diubahnya;
BSNONENOTRISZable;
Bssizable Standard Recizable Border
Bstoolwindow seperti bssingle tetapi dengan keterangan yang lebih kecil
bssizetoolwin seperti bssizable dengan keterangan yang lebih kecil
ketik tbordericon = (bisystemmenu, biminimize, bimaximize, bihelp);
Tbordericons = set tbordericon;
Makna nilai
Bisystemmenu Formulir ini memiliki menu kontrol (juga dikenal sebagai menu sistem).
Biminimize Form memiliki tombol minimalkan
Bimaximize Formulir memiliki tombol Maximize
Jalankan jika Borderstyle adalah bsdialog atau biminimize dan bimaximize dikecualikan, tanda tanya muncul di bilah judul formulir dan ketika diklik, kursor berubah menjadi crhelp; jika tidak, tidak ada tanda tanya muncul.
Jelas, Borderstyle dan Bordericons hanya dapat memenuhi kebutuhan umum, dan tidak mungkin untuk menerapkan kotak dialog yang dapat memodifikasi ukuran.
Secara umum, jika saya ingin mendapatkan jendela yang tidak bisa dimaksimalkan tetapi dapat mengubah ukurannya, saya mengatur Borderstyle menjadi bssizeable, menghapus biminimize dan bimaximize bordericons, dan hasilnya seperti ini: jendela dapat dimodifikasi, tetapi ada ikon di sudut kiri atas,:
Kotak Dialog Gambar 1 Dengan Ikon
Perhatikan bahwa ada ikon di sudut kiri atas.
Tujuan kami adalah dua efek di bawah ini.
Gambar 2 Buka Kotak Dialog File
Gambar 3 Jelajahi Kotak Dialog Folder
2. Setengah masalah diselesaikan
Saya mencari MSDN dan menemukan sebuah artikel yang mengajarkan Anda cara merancang halaman properti yang dapat mengubah ukuran (dalam MFC, CPropertysheet muncul sebagai subpage cpropertypage, yang mewarisi cdialog dan biasanya tidak dapat memodifikasi ukuran) "cara merancang properti MFC yang dapat diubah kembali dengan cdialog dan biasanya memodifikasi ukurannya)" cara merancang properti MFC yang dapat diputar ulang yang disesalkan MFC Lembar, metode yang diperkenalkan dalam artikel ini adalah untuk memodifikasi gaya jendela sebelum halaman properti dibuat, dan kemudian memproses pesan WM_SIZE secara manual.
int callback cmypropertysheet :: xmnpropsheetcallback (hwnd hwnd, pesan uint, lparam lparam)
{
extern int callback afxpropsheetcallback (hwnd, pesan uint, lparam lparam);
// xmn: hubungi callback MFC
int nres = afxpropsheetcallback (hwnd, pesan, lparam);
Switch (pesan)
{
case pscb_precreate:
// atur gaya jendela kita sendiri
((Lpdlgtemplate) lparam)-> style | = (ds_3dlook | ds_setfont
WS_THICKFRAME |
merusak;
}
mengembalikan nres;
}
Saya sudah mencoba menggunakan metode yang sama ke dalam bentuk VCL. Atur Borderstyle ke BSDialog saat merancang, dan kemudian membebani metode createParams. Tetapi hasilnya adalah bahwa kotak dialog memang menjadi perbatasan yang tebal (karena memiliki gaya WS_ThickFrame), mouse dapat secara otomatis berubah setelah bergerak ke setiap perbatasan, dan tidak ada ikon di sudut kiri atas, tetapi jendela tidak dapat mengubah ukurannya (Proses pemrosesan pesan WM_SIZE yang ditambahkan tidak dipicu). Apa masalahnya?
Gambar 4 Kotak dialog yang belum sepenuhnya memuaskan
3. Selesaikan masalahnya
Saya memeriksa kode sumber form.pas dan menemukan masalahnya. Ada proses embedding modifysystemMenu dalam proses pemrosesan pesan WM_NCCreate dari TcustomForm, yang digunakan untuk memodifikasi menu sistem formulir. Perhatikan bahwa teks merah di bawah ini mengatakan "Buat menu sistem terlihat seperti kotak dialog". Beberapa kalimat kode berikutnya menghapus item menu sistem ke titik di mana hanya "bergerak" dan "tutup".
Prosedur tcustomform.wmncCreate (pesan var: twmnccreate);
Prosedur Modifysystemmenu;
var
Sysmenu: Hmenu;
Mulai
...
{Ubah menu sistem agar lebih terlihat seperti itu untuk}
Symenu: = getSystemMenu (pegangan, false);
jika fborderstyle = bsdialog maka
Mulai
{Buat menu sistem terlihat seperti dialog yang hanya memiliki
Pindah dan Tutup}
Deletemenu (Symenu, SC_TASKLIST, MF_BYCOMMAND);
Deletemenu (Sysmenu, 7, MF_BYPOSISI);
Deletemenu (Sysmenu, 5, MF_BYPOSISI);
Deletemenu (Symenu, sc_maximize, mf_bycommand);
Deletemenu (Symenu, sc_minimize, mf_bycommand);
Deletemenu (Symenu, SC_SIZE, MF_BYCOMMAND);
Deletemenu (Symenu, SC_RESTORE, MF_BYCOMMAND);
akhir yang lain
...
akhir;
Mulai
diwariskan;
Setmenu (fmenu);
Jika tidak (csdesigning di ComponentState) maka modifysystemmenu;
akhir;
Oleh karena itu, masalahnya adalah karena "sc_size" dihapus, gaya jendela memiliki kelainan bentuk: ada ws_thickframe (ukuran jendela dapat dimodifikasi), tetapi tidak menanggapi pesan WM_SIZE (sc_size dihapus).
Solusinya sangat sederhana: Menerapkan proses pemrosesan pesan WM_NCCreate Anda sendiri dan memodifikasi menu sistem secara manual.
Prosedur tzocdlgresizable.wmncCreate (pesan var: twmnccreate);
// Kode -kode berikut disalin dari form.pas Line 4047, Delphi 7 SP1.
Prosedur Modifysystemmenu;
var
Sysmenu: Hmenu;
Mulai
Symenu: = getSystemMenu (pegangan, false);
{Buat menu sistem terlihat seperti dialog yang hanya memiliki
Pindah, Ukuran dan Tutup Perintah}
Deletemenu (Symenu, SC_TASKLIST, MF_BYCOMMAND);
Deletemenu (Sysmenu, 7, MF_BYPOSISI);
// Jangan lepaskan pemisah sebelum tutup perintah.
// Deletemenu (Symenu, 5, MF_BYPOSISI);
Deletemenu (Symenu, sc_maximize, mf_bycommand);
Deletemenu (Symenu, sc_minimize, mf_bycommand);
{Jangan lepaskan perintah ukuran, jika tidak kita akan kehilangan
kemampuan mengubah ukuran dialog.
// deletemenu (sysmenu, sc_size, mf_bycommand);
Deletemenu (Symenu, SC_RESTORE, MF_BYCOMMAND);
akhir;
Mulai
{Lewati handler wm_nccreate dari tcustomform, yang menghapus
Perintah ukuran dari menu sistem.}
warisan defaulthandler (pesan);
// Berurusan dengan menu sistem dengan cara kita sendiri.
Modifysystemmenu;
akhir;
4. Kelas Tzocdlgresizable
Solusi terakhir yang saya renungkan sebagai kelas yang diwarisi dari TFOR. Tzocdlgregrizable.
BTW: Saya juga menambahkan atribut sizeGrip ke tzocdlgressizable.
Gambar 5 Kotak Dialog dengan Sizegrip Tanpa Ikon
Unduh (EXE dan Kode Sumber)
http://www.zocsoft.com/temp/resizable_dialog.rar
5. Bahan referensi:
MSDN: Cara Merancang Lembar Properti MFC yang Dapat Diubah Ulang
Alamat kutipan: "Menerapkan kotak dialog yang dapat mengubah ukuran di Delphi"