2011-01-31 2 views
5

По умолчанию форма с BorderStyle = bsSizeable имеет системное меню (слева) и кнопку закрытия («X» справа). Я хочу избавиться от системного меню и сохранить кнопку закрытия.Форма Delphi без системного меню, но с закрывающей кнопкой

Свойство BorderIcons позволяет мне удалить системное меню (через biSystemmenu), но теперь кнопка закрытия тоже исчезла.

Есть ли способ сделать это?

Использование Delphi XE

PS: это должно быть возможным, насколько Windows, обеспокоен: окно в IE8 «Параметры InPrivate Filtering» внушительна, имеет кнопку закрытия и не имеет системного меню.

+6

странно, для меня по умолчанию для 'BorderStyle = bsDialog' делает ** ** не имеет системного меню, независимо от того, что указанном в «BorderIcons». 'biSystemMenu' должен быть там для красного X, чтобы показать. –

+0

Вы правы, bsDialog работает так, как я хочу. Blush ;-) Я обновил вопрос: я хочу, чтобы он работал и для bsSizeable. – Giel

+0

Windows Media Center –

ответ

0

Я не думаю, что есть способ сделать это, не прибегая к пользовательскому оформлению вашей неклиентской области, что очень сложно, когда речь идет о стекле.

Рассмотрите этот метод.

procedure TMyForm.DeleteSystemMenu; 
var 
    SystemMenu: HMenu; 
begin 
    SystemMenu := GetSystemMenu(Handle, False); 
    DeleteMenu(SystemMenu, SC_CLOSE, MF_BYCOMMAND); 
end; 

Да преуспевает в избавлении от близкого пункта из меню системы, но это также приводит кнопка закрытия отключенный. Таким образом, казалось бы, вы не можете иметь одного без другого.

+2

Это похоже на * противоположное * того, что требуется. Очевидно, что он сохраняет системное меню (поскольку вы его изменяете), но он отключает кнопку. –

+0

То же самое для 'DeleteMenu (SystemMenu, SC_SIZE, MF_BYCOMMAND);' Удаляет элемент меню «Размер», и, как следствие, вы не можете изменять размер формы. –

+0

@Rob Прочтите мой ответ еще раз. То, что я делаю, состоит в том, что если вы избавитесь от частей системного меню, то соответствующие функции на панели заголовка также будут отключены. На самом деле, вы комментируете Q, похоже, делает аналогичную точку. –

0

BorderStyle := bsSizeToolWin делает то, что вы хотите, с немного иным видом кнопки X.

+0

-1. Это слишком отличается, и это нежелательное различие не требуется. –

0

Под «системным меню» вы имеете в виду значок слева от строки заголовка? Или всплывающее меню вызывается через правый клик?

Если это значок, который вы хотите удалить - используйте этот код:

const 
    WM_ResetIcon = WM_APP - 1; 

type 
    TForm1 = class(TForm) 
    procedure FormShow(Sender: TObject); 
    protected 
    procedure WMResetIcon(var Message: TMessage); message WM_ResetIcon; 
    end; 

implementation 

procedure TForm1.FormShow(Sender: TObject); 
begin 
    PostMessage(Handle, WM_ResetIcon, 0, 0); 
end; 

procedure TForm1.WMResetIcon(var Message: TMessage); 
const 
    ICON_SMALL = 0; 
    ICON_BIG = 1; 
begin 
    DestroyIcon(SendMessage(Handle, WM_SETICON, ICON_BIG, 0)); 
    DestroyIcon(SendMessage(Handle, WM_SETICON, ICON_SMALL, 0)); 
end;