2008-08-13 7 views
6

Ich entwickle eine MFC-Anwendung und ich habe kürzlich nach einer guten Methode gesucht, das Symbol aus einer Windows-Titelleiste zu entfernen, aber die Schließen-Schaltfläche beizubehalten. Die beiden naheliegenden Kandidaten sind das Deaktivieren des Systemmenüstils oder das Verwenden des Werkzeugfensterstils, aber ich würde es vorziehen, das Systemmenü nicht zu deaktivieren oder die verkleinerte Werkzeugfenstertitelleiste zu verwenden. Viele MFC-Anwendungen verfügen über diese Funktionalität. Daher frage ich mich: Fehle ich eine Standardmethode dafür?Entfernen des Symbols von Windows-Titelleisten, ohne die Taste oder das Systemmenü zu schließen?

Antwort

2

können Sie WM_NCRBUTTONDOWN verwenden, um festzustellen, ob der Benutzer auf Ihrer Beschriftung rechts geklickt hat und dann das Systemmenü aufzurufen.

0

Wie wäre es, das Systemmenü loszuwerden und es dann an einen anderen Ort zu bringen, an dem Sie sich befinden (zum Beispiel neben dem Schließen-Knopf usw.)?

0

Ohne das Symbol, die einzige Methode, die ich mir vorstellen könnte, dass Benutzer auf das Systemmenü zugreifen, ist mit der rechten Maustaste auf die Titelleiste.

Wenn Sie das vorhaben, können Sie WM_RBUTTONDOWN auf Ihrem Hauptrahmen verarbeiten und dann berechnen, ob der Rechtsklick auf der Titelleiste war.

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

Set WS_EX_DLGMODALFRAME erweiterten Stil.

+0

Dies sollte die Antwort sein. – c00000fd

2

Sie könnten ein vollständig transparentes Symbol verwenden.

0

Ein Beispielcode in Delphi, das Symbol entfernt:

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; 

Ein ähnlicher Code sollte für MFC arbeiten. Im Grunde brauchen Sie nur WM_SETICON zu NULL an der richtigen Stelle.