Entfernen-Symbol aus dem Windows-Titelleisten ohne Notwasserung Schaltfläche schließen oder das system-Menü?
-
08-06-2019 - |
Frage
Ich entwickle eine MFC-Anwendung, und ich habe vor kurzem auf der Suche für eine gute Methode, um das Symbol zu entfernen aus einem Windows-Titelleiste, behalten aber die Schaltfläche "schließen".Die zwei offensichtliche Kandidaten-Lösungen ausschalten des Systems im Menü Stil oder die Verwendung der tool-Fenster-Stil, aber ich würde es vorziehen, nicht zu deaktivieren, die das system-Menü oder benutzen Sie die geschrumpfte tool-Fenster-Titelleiste.Viele MFC-Anwendungen haben diese Funktion, so Frage ich mich:fehlen mir einige standard-Weg, dies zu tun?
Lösung
Sie können verwenden WM_NCRBUTTONDOWN
zu erkennen, wenn der Benutzer mit der rechten Maustaste auf Ihre Beschriftung ein und schalten Sie dann das system-Menü.
Andere Tipps
Set WS_EX_DLGMODALFRAME
erweiterte Stil.
Sie könnte verwenden Sie ein vollständig transparentes Symbol.
was ist getting rid of die system Menü, und dann setzen es wieder an einem anderen Ort yourseld (sagen, dass neben dem schließen button etc.)?
Ohne das Symbol, die einzige Methode, die ich mir vorstellen könnte, für die Benutzer Zugriff auf das system-Menü per Rechtsklick auf die Titelleiste.
Wenn es das ist, was Sie im Sinn hatte, Sie könnte handle, WM_RBUTTONDOWN, die auf Ihrem Hauptrahmen und dann berechnen, wenn die mit der rechten Maustaste wurde auf die Titelleiste.
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);
}
Ein Beispiel-code in Delphi entfernt Symbol:
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 funktioniert bei MFC.Im Grunde, Sie müssen nur WM_SETICON zu NULL in der richtigen Stelle.