2011-01-31 95 views
5

默认情况下,具有BorderStyle = bsSizeable的窗体有一个系统菜单(左侧)和一个关闭按钮(右侧为“X”)。我想摆脱系统菜单并保持关闭按钮。不带系统菜单但带关闭按钮的Delphi窗体

BorderIcons属性允许我删除系统菜单(通过biSystemmenu),但现在关闭按钮也消失了。

有没有办法做到这一点?

用Delphi XE

PS:应该可以尽可能的Windows而言:IE8的“InPrivate筛选设置”窗口是相当大的,有一个关闭按钮,并没有系统菜单。

+6

奇怪了,对我来说,默认`边框= bsDialog`并没有** **系统菜单不管是什么在`BorderIcons`中指定。 `biSystemMenu`需要在那里才能显示红色的X. – 2011-01-31 10:59:12

+0

你说得对,bsDialog确实按我想要的方式工作。腮红;-)我已经更新了这个问题:我希望它也适用于bsSizeable。 – Giel 2011-01-31 11:13:59

+0

Windows Media Center – 2011-01-31 11:39:15

回答

0

我不认为有没有办法做到这一点,而不诉诸非客户区,这是非常困难的时候涉及玻璃。

考虑这种方法。

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

是的,它成功地摆脱了系统菜单中的关闭项目,但它也导致关闭按钮被禁用。所以看起来你没有一个没有其他的。

0

BorderStyle := bsSizeToolWin做你想要的,与X按钮的外观略有不同。

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;