如何在不放弃关闭按钮或系统菜单的情况下从Windows标题栏中删除图标?

7

我正在开发一个MFC应用程序,最近一直在寻找一种好的方法来从Windows标题栏中删除图标,但保留关闭按钮。两个明显的候选解决方案是关闭系统菜单样式或使用工具窗口样式,但我不想禁用系统菜单或使用缩小的工具窗口标题栏。许多MFC应用程序都具有此功能,所以我想知道:我是否错过了某种标准方法来实现这一点?

6个回答

4

设置 WS_EX_DLGMODALFRAME 扩展样式。


这应该是答案。 - c00000fd

2
您可以使用完全透明的图标。

2

您可以使用 WM_NCRBUTTONDOWN 来检测用户是否右键单击了您的标题,然后弹出系统菜单。


0
没有图标的话,我能想到的唯一方法是让用户通过右击标题栏来访问系统菜单。
如果这就是你想要的,你可以在主框架上处理WM_RBUTTONDOWN事件,然后计算右击是否发生在标题栏上。
int clickX = GET_X_LPARAM(lParam);
int clickY = GET_Y_LPARAM(lParam);

CRect frameRect;
mainFrame.GetWindowRect(&frameRect);

int titleBarHeight = GetSystemMetrics(SM_CYCAPTION);

if (clickX >= frameRect.left &&
    clickX <= frameRect.right &&
    clickY >= frameRect.top &&
    clickY <= frameRect.top + titleBarHeight)
{
   TrackPopupMenu(m_systemMenu);
}

0

如果把系统菜单移除,然后自己将其放置在其他地方(比如靠近关闭按钮),这样怎么样?


0

一个在Delphi中移除图标的示例代码:

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;

一个类似的代码应该适用于MFC。基本上,你只需要在正确的位置使用WM_SETICON设置为NULL即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接