7

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

4

6 回答 6

4

设置WS_EX_DLGMODALFRAME扩展样式。

于 2009-05-07T13:43:34.090 回答
2

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

于 2008-08-14T01:28:13.567 回答
2

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

于 2011-06-05T21:04:39.117 回答
0

摆脱系统菜单然后将其放回您自己的另一个地方(比如关闭按钮旁边等)怎么样?

于 2008-08-13T17:12:52.490 回答
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);
}
于 2008-08-14T00:49:13.007 回答
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 在正确的位置。

于 2017-04-11T17:22:24.877 回答