22. Каким образом создать форму, которую можно таскать за поле?
Как сделать форму (окно), которое перетаскивается не за заголовок ( Сaption ), а за все поле ?
Нужно обрабатывать сообщение WM_NCHITTEST :
type
TForm1 = class(TForm)
...
private
procedureWMNCHitTest( varM: TWMNCHitTest); messageWM_NCHITTEST;
end;
procedureTForm1.WMNCHitTest( varM: TWMNCHitTest);
begin
inherited; { вызов унаследованного обработчика }
ifM.Result = htClient then { Мышь сидит на окне? }
M.Result := htCaption; { Если да - то пусть Windows думает, что }
{ мышь на caption bar }
end;
Примечание:окно можно сделать вообще без Сaption .
23. Как программно спрятать или показать заголовок у формы?
Как программно спрятать или показать заголовок ( Caption ) у формы?
Вы можете попробовать следующее:
procedureTForm1.HideTitlebar;
var
Save: Longint;
begin
ifBorderStyle=bsNone thenExit;
Save := GetWindowLong(Handle, GWL_STYLE);
if(Save andWS_CAPTION) = WS_CAPTION then
begin
caseBorderStyle of
bsSingle, bsSizeable:
SetWindowLong(Handle, GWL_STYLE, Save and( notWS_CAPTION) orWS_BORDER);
bsDialog:
SetWindowLong(Handle, GWL_STYLE, Save and( notWS_CAPTION) orDS_MODALFRAME orWS_DLGFRAME);
end;
Height := Height-GetSystemMetrics(SM_CYCAPTION);
Refresh;
end;
end;
procedureTForm1.ShowTitlebar;
var
Save: Longint;
begin
ifBorderStyle = bsNone thenExit;
Save := GetWindowLong(Handle, GWL_STYLE);
if(Save andWS_CAPTION) <> WS_CAPTION then
begin
caseBorderStyle of
bsSingle, bsSizeable:
SetWindowLong(Handle, GWL_STYLE, Save orWS_CAPTION orWS_BORDER);
bsDialog:
SetWindowLong(Handle, GWL_STYLE, Save orWS_CAPTION orDS_MODALFRAME orWS_DLGFRAME);
end;
Height := Height + GetSystemMetrics(SM_CYCAPTION);
Refresh;
end;
end;
24. Как сделать приложение модальным?
Мне нужно сделать приложение модальным, для того чтобы обезопасить систему и в то же время позволить работать с программой.
Ok, пара предложений на эту тему:
1. Создайте форму, занимающую весь экран (maximized) без системных кнопок (Maximize, Minimize, System)
2. В обработчике FormDeactivate для формы вызовите метод SetFocus — это предотвратит Ctrl+Esc:
Form1.SetFocus;
3. В обработчике события FormActivate , нужно присвоить метод Deactivate для приложения:
Application.OnDeactivate := FormDeactivate;
4. Создайте всплывающее меню TPopupMenu с единственным пунктом. В свойствах данного компонента нужно установить Visible=False . Создайте процедуру для этого пункта меню, и в теле поставьте две фигурные скобки {} (для того, чтобы Delphi не удалил эту процедуру)
5. Присвойте созданное Popup-меню форме (св-во PopupMenu )
6. Задайте горячую клавишу (shortcut) для Popup-меню в методе FormActivate как показано ниже:
NullItem1.ShortCut := ShortCut(VK_Tab, [ssAlt]);
( NullItem1 нужно заменить на название созданного вами объекта — пункта меню)
Шаги 4-6 предотвращают переход на приложение по Alt-Tab.
25. Как изменить шрифт у Application.Title (заголовка приложения)?
Никак. Это ограничение Windows — вы не можете изменить шрифт ни у одного заголовка ни у приложения, ни у окна. Для окна можно предложить следующее — создать свое окно без заголовка ( Caption ) и рамки, которое будет само выводить нужную надпись нужным шрифтом и одновременно будет способно изменять свои размеры.
26. Каким образом (желательно не специфичным для Delphi) узнать, открыто меню или нет?
Вот так:
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
Item01: TMenuItem;
Item11: TMenuItem;
Item21: TMenuItem;
private
{ Private declarations }
public
procedureWMMenuSelect( varM: TWMMenuSelect); messageWM_MENUSELECT;
Читать дальше