我正在开发一个MFC应用程序,我最近一直在寻找一种从Windows标题栏中删除图标的好方法,但保留关闭按钮。两个明显的候选解决方案是关闭系统菜单样式或使用工具窗口样式,但我不想禁用系统菜单或使用缩小的工具窗口标题栏。许多MFC应用程序都具有此功能,所以我想知道:我是否缺少一些标准的方法来执行此操作?
答案 0 :(得分:4)
设置WS_EX_DLGMODALFRAME
扩展样式。
答案 1 :(得分:2)
您可以使用WM_NCRBUTTONDOWN
检测用户是否右键点击了标题,然后调出系统菜单。
答案 2 :(得分:2)
您可以使用完全透明的图标。
答案 3 :(得分:0)
如何摆脱系统菜单,然后将其放回到另一个地方(比如关闭按钮旁等)?
答案 4 :(得分: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);
}
答案 5 :(得分: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。