从Windows标题栏删除图标,而不closuresbutton或系统菜单?

我正在开发一个MFC应用程序,我最近一直在寻找一个很好的方法来从Windows标题栏中删除图标,但保留closuresbutton。 两个明显的候选解决scheme是closures系统菜单样式或使用工具窗口样式,但我不希望禁用系统菜单或使用缩小的工具窗口标题栏。 许多MFC应用程序具有此function,所以我想知道:我是否缺less一些标准的方法来做到这一点?

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

设置WS_EX_DLGMODALFRAME扩展样式。

你可以使用一个完全透明的图标。

如何摆脱系统菜单,然后把它放回另一个地方yourseld(说关闭按钮旁边等)?

如果没有图标,我可以想象用户访问系统菜单的唯一方法是通过右键单击标题栏。

如果这是你的想法,你可以在你的主框架上处理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); } 

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。