关于c ++:要从Windows标题栏中删除图标而不放弃关闭按钮或系统菜单?

关于c ++:要从Windows标题栏中删除图标而不放弃关闭按钮或系统菜单?

Removing icon from Windows title bars without ditching close button or system menu?

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


设置WS_EX_DLGMODALFRAME扩展样式。


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


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


Delphi中的示例代码删除了图标:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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。


如果没有该图标,我想不到的用户访问系统菜单的唯一方法是右键单击标题栏。

如果您正是如此,则可以在主机上处理WM_RBUTTONDOWN,然后计算是否在标题栏上单击鼠标右键。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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);
}

删除系统菜单,然后再将其放回您的位置(例如关闭按钮等旁边),该怎么办?


推荐阅读