Entfernen-Symbol aus dem Windows-Titelleisten ohne Notwasserung Schaltfläche schließen oder das system-Menü?

StackOverflow https://stackoverflow.com/questions/10059

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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top