¿Eliminar el ícono de las barras de título de Windows sin deshacerse del botón de cerrar o del menú del sistema?

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

Pregunta

Estoy desarrollando una aplicación MFC y recientemente estuve buscando un buen método para eliminar el ícono de la barra de título de Windows, pero conservar el botón de cerrar.Las dos soluciones candidatas obvias son desactivar el estilo del menú del sistema o usar el estilo de la ventana de herramientas, pero preferiría no desactivar el menú del sistema ni usar la barra de título de la ventana de herramientas reducida.Muchas aplicaciones MFC tienen esta funcionalidad, entonces me pregunto:¿Me estoy perdiendo alguna forma estándar de hacer esto?

¿Fue útil?

Solución

Puedes usar WM_NCRBUTTONDOWN para detectar si el usuario ha hecho clic derecho en su título y luego abrir el menú del sistema.

Otros consejos

Colocar WS_EX_DLGMODALFRAME estilo extendido.

Podrías usar un ícono completamente transparente.

¿Qué tal si nos deshacemos del menú del sistema y luego lo volvemos a colocar en otro lugar (por ejemplo, al lado del botón de cerrar, etc.)?

Sin el ícono, el único método que puedo imaginar para que los usuarios accedan al menú del sistema es haciendo clic derecho en la barra de título.

Si eso es lo que tenía en mente, podría manejar WM_RBUTTONDOWN en su marco principal y luego calcular si el clic derecho estaba en la 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);
}

Un código de muestra en Delphi que elimina el icono:

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;

Un código similar debería funcionar para MFC.Básicamente, solo necesitas WM_SETICON a NULL en el lugar correcto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top