Removendo o ícone das barras de título do Windows sem abandonar o botão Fechar ou o menu do sistema?

StackOverflow https://stackoverflow.com/questions/10059

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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top