2008-08-13 16 views
6

Estoy desarrollando una aplicación MFC y recientemente he estado buscando un buen método para eliminar el icono de una barra de título de Windows, pero conservo el botón Cerrar. Las dos soluciones candidatas obvias son desactivar el estilo de menú del sistema o usar el estilo de ventana de la herramienta, pero preferiría no deshabilitar el menú del sistema o usar la barra de título de la ventana de la herramienta reducida. Muchas aplicaciones MFC tienen esta funcionalidad, por lo que me pregunto: ¿me falta alguna forma estándar de hacer esto?¿Quitar el icono de las barras de título de Windows sin abandonar el botón de cerrar o el menú del sistema?

Respuesta

2

Puede utilizar WM_NCRBUTTONDOWN para detectar si el usuario ha hecho clic-derecho en el título y luego abrir el menú del sistema.

0

¿qué hay de deshacerse del menú del sistema y luego ponerlo en otro lugar (por ejemplo, al lado del botón cerrar, etc.)?

0

Sin el ícono, el único método que pude imaginar para que los usuarios accedan al menú del sistema es haciendo clic con el botón 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); 
} 
4

Conjunto WS_EX_DLGMODALFRAME estilo extendido.

+0

Esto debería haber sido la respuesta. – c00000fd

2

Puede usar un ícono completamente transparente.

0

Un código de ejemplo 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 debe trabajar para MFC. Básicamente, solo necesita WM_SETICON para NULL en el lugar correcto.

Cuestiones relacionadas