Removendo o ícone das barras de título do Windows sem abandonar o botão Fechar ou o menu do sistema?
-
08-06-2019 - |
Pergunta
Estou desenvolvendo um aplicativo MFC e recentemente procurei um bom método para remover o ícone da barra de título do Windows, mas mantendo o botão Fechar.As duas soluções candidatas óbvias são desativar o estilo do menu do sistema ou usar o estilo da janela de ferramentas, mas eu preferiria não desabilitar o menu do sistema ou usar a barra de título reduzida da janela de ferramentas.Muitos aplicativos MFC possuem essa funcionalidade, então me pergunto:estou faltando alguma maneira padrão de fazer isso?
Solução
Você pode usar WM_NCRBUTTONDOWN
para detectar se o usuário clicou com o botão direito na sua legenda e, em seguida, abrir o menu do sistema.
Outras dicas
Definir WS_EX_DLGMODALFRAME
estilo estendido.
Você poderia usar um ícone totalmente transparente.
que tal se livrar do menu do sistema e colocá-lo de volta em outro lugar (por exemplo, ao lado do botão Fechar, etc.)?
Sem o ícone, o único método que poderia imaginar para os usuários acessarem o menu do sistema é clicar com o botão direito na barra de título.
Se é isso que você tinha em mente, você poderia manipular WM_RBUTTONDOWN em seu quadro principal e então calcular se o clique com o botão direito estava na barra de título.
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);
}
Um exemplo de código em Delphi que remove o ícone:
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;
Um código semelhante deve funcionar para o MFC.Basicamente, você só precisa WM_SETICON para NULL no lugar certo.