Ключевые слова : диалоговое окно, диалоговое окно, сметочный
1. Проблема поднята
Проблема поступает от stanley_xu, надеясь получить только кнопку «Закрыть» (она также может помочь), нет значка для программы слева в верхней части, и диалоговое окно может изменить размер окна.
Свойства BordersTyle и Bordericons установлены для TFORM в VCL, чтобы упростить настройку стилей окна (в противном случае должны быть вызваны функции API, такие как SetWindowlong и GetWindowlong). Определение и описание tformborderstyle и tbordericon заключаются в следующем:
Значение значения
Bsdialog не изменяется;
BSSINGLE не изменяется;
bsnonenotresizble;
BSSize STANDARD RESISABLE BODER
BSOULWINDOW, как BSSINGLE, но с меньшей подписью
Bssizetoolwin, как Bssize с меньшей подписью
Тип tbordericon = (bisystemmenu, biminimize, bimaximize, bihelp);
Tbordericons = набор Tbordericon;
Значение значения
Bisystemmenu Форма имеет меню управления (также известное как системное меню).
Biminimize в форме имеет кнопку минимизации
Бимаксимизация формы имеет кнопку максимизации
Bihelp Если Borderstyle - это BSDialog или Biminimize, и бимаксимизация исключена, в панели заголовка возникает знак вопроса, и при щелчке курсор изменяется в Crhelp;
Очевидно, что Borderstyle и Bordericons могут удовлетворить только общие потребности, и невозможно реализовать диалоговые окны, которые могут изменять размеры.
Вообще говоря, если я хочу получить окно, которое не может быть максимизировано, но могу изменить размер, я установил BordersTyle на BSSize, удалите биминимизацию и бимаксимизируйте Bordericons, и результат такой: окно может быть изменено, но есть икона в левом верхнем углу,:
Диалоговое окно рисунка 1 со значком
Обратите внимание, что в верхнем левом углу есть значок.
Наша цель - два эффекта ниже.
Рисунок 2 Открыть диалоговое окно файла
Рисунок 3 Диалоговое окно «Просмотр папки»
2. Половина проблемы решается
Я искал MSDN и нашел статью, которая учит вас, как разрабатывать страницы свойств, которые могут изменить размер (в MFC, CPropertySheet появляется в виде подпадения Cpropertypage, которая наследует от Cdialog и обычно не может изменить размер) »« Как спроектировать свойство. Лист, метод, представленный в статье, предназначен для изменения стиля окна до создания страницы свойства, а затем вручную обработать сообщение WM_SIZE.
int обратный вызов cmypropertysheet :: xmnpropsheetcallback (hwnd hwnd, uint message, lparam lparam)
{
extern int обратный вызов afxpropsheetCallback (hwnd, Uint Message, LParam LParam);
// xmn: позвонить в обратный вызов MFC
int nres = afxpropSheetCallback (hwnd, сообщение, lparam);
переключить (сообщение)
{
case pscb_precreate:
// Установить наши собственные стили окна
((Lpdlgtemplate) lparam)-> style | = (ds_3dlook | ds_setfont
|.
перерыв;
}
вернуть NRES;
}
Я пытался использовать тот же метод в форму VCL. Установите BordersTyle в BSDialog при проектировании, а затем перегружайте метод CreateParams. Но в результате диалоговое окно становится толстой границей (потому что у него есть стиль ws_thickframe), мышь может автоматически изменяться после перемещения к каждой границе, и в верхнем левом углу нет значка, но окно не может изменить свой размер (Добавленный процесс обработки сообщений WM_SIZE не запускается). В чем проблема?
Диалоговое окно рисунка 4, которое еще не совсем удовлетворительно
3. Решить проблему
Я проверил исходный код форм. PAS и нашел проблему. В процессе обработки сообщений WM_NCCreate существует процесс встраивания модифицированного встроения WM_NCCreate, который используется для модификации меню системы формы. Обратите внимание, что в красном тексте ниже говорится: «Сделайте меню системы выглядеть как диалоговое окно». Следующие несколько предложений кода удалили элементы меню системы до такой степени, что только «двигаться» и «закрыть».
Процедура tcustomform.wmnccreate (var Сообщение: twmnccreate);
Процедура модифицируется;
вар
Sysmenu: Hmenu;
Начинать
...
{Модифицировать меню системы, чтобы больше похоже на то, чтобы оно не подходило}
Sysmenu: = getSystemmenu (ручка, false);
Если fborderstyle = bsdialog, тогда
Начинать
{Сделайте меню системы похожим на диалог, который имеет только
Двигаться и закрыть}
Deletemenu (sysmenu, sc_tasklist, mf_bycommand);
Deletemenu (Sysmenu, 7, mf_byposition);
Deletemenu (Sysmenu, 5, mf_byposition);
Deletemenu (sysmenu, sc_maximize, mf_bycommand);
Deletemenu (sysmenu, sc_minimize, mf_bycommand);
Deletemenu (sysmenu, sc_size, mf_bycommand);
Deletemenu (Sysmenu, Sc_Restore, MF_Bycommand);
конец еще
...
конец;
Начинать
унаследован;
SetMenu (fmenu);
Если нет (csdesigning in componentstate), то Modifysystemmenu;
конец;
Следовательно, проблема в том, что, поскольку «sc_size» удаляется, стиль окна имеет деформацию: есть ws_thickframe (размер окна может быть изменен), но он не отвечает на сообщение WM_SIZE (sc_size удален).
Решение очень простое: реализуйте свой собственный процесс обработки сообщений WM_NCCreate и вручную изменить меню системы.
Процедура tzocdlgresizble.wmnccreate (var Сообщение: twmnccreate);
// Следующие коды копируются из Form.PAS Line 4047, Delphi 7 SP1.
Процедура модифицируется;
вар
Sysmenu: Hmenu;
Начинать
Sysmenu: = getSystemmenu (ручка, false);
{Сделайте меню системы похожим на диалог, который имеет только
Перемещать, размер и закрыть команды}
Deletemenu (sysmenu, sc_tasklist, mf_bycommand);
Deletemenu (Sysmenu, 7, mf_byposition);
// Не удаляйте отдельный команду перед закрытием.
// deletemenu (sysmenu, 5, mf_byposition);
Deletemenu (sysmenu, sc_maximize, mf_bycommand);
Deletemenu (sysmenu, sc_minimize, mf_bycommand);
{Не удаляйте команду Size, иначе мы потеряем
Возможность изменения размера диалога.
// deletemenu (sysmenu, sc_size, mf_bycommand);
Deletemenu (Sysmenu, Sc_Restore, MF_Bycommand);
конец;
Начинать
{Skip Tcustomform's WM_NCCreate Handler, который удаляет
Команда размера из меню системы.}
унаследованный Defaulthandler (сообщение);
// Работа с меню системы по -своему.
Modifysystemmenu;
конец;
4. Tzocdlgresizble Class
Окончательное решение, которое я инкапсулирует как класс, унаследованное от Tform. Tzocdlgresizble.
Кстати: я также добавил атрибут SizeGrip в Tzocdlgresize.
Диалоговое окно Рисунок 5 с SizeGrip без значка
Скачать (Exe и исходный код)
http://www.zocsoft.com/temp/resizable_dialog.rar
5. Справочные материалы:
MSDN: как разработать лист свойств MFC -изменений MFC
Цитата адрес: «Реализация диалогового окна, которое может изменить размер в Delphi»