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
können Sie WM_NCRBUTTONDOWN
verwenden, um festzustellen, ob der Benutzer auf Ihrer Beschriftung rechts geklickt hat und dann das Systemmenü aufzurufen.
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.)?
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);
}
Set WS_EX_DLGMODALFRAME
erweiterten Stil.
Sie könnten ein vollständig transparentes Symbol verwenden.
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.
Dies sollte die Antwort sein. – c00000fd