¿Eliminar el ícono de las barras de título de Windows sin deshacerse del botón de cerrar o del menú del sistema?
-
08-06-2019 - |
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?
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.