c++ java - Entfernen des Symbols aus den Windows-Titelleisten ohne Schließen der Schaltfläche oder des Systemmenüs?




gui swing (6)

Sie können WM_NCRBUTTONDOWN , um zu erkennen, ob der Benutzer mit der rechten Maustaste auf Ihre Beschriftung geklickt hat und dann das Systemmenü aufgerufen hat.

Ich entwickle eine MFC-Anwendung und suchte kürzlich nach einer guten Methode, um das Symbol aus einer Windows-Titelleiste zu entfernen, aber behalte die Schließen-Schaltfläche bei. Die zwei naheliegenden Kandidatenlösungen sind das Ausschalten des Systemmenüstils oder das Verwenden des Werkzeugfensterstils, aber ich würde es vorziehen, das Systemmenü nicht zu deaktivieren oder die Titelleiste des geschrumpften Werkzeugfensters zu verwenden. Viele MFC-Anwendungen verfügen über diese Funktionalität, daher frage ich mich: Fehlt mir eine Standardmethode dafür?


Wie wäre es, das System-Menü loszuwerden und es dann wieder an einen anderen Ort zu bringen (sagen Sie neben dem Schließen-Button usw.)?


Ein Beispielcode in Delphi, der 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 funktionieren. Grundsätzlich müssen Sie nur WM_SETICON zu NULL an der richtigen Stelle.


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


Ohne das Symbol kann ich mir nur vorstellen, dass Benutzer mit einem Rechtsklick auf die Titelleiste auf das Systemmenü zugreifen können.

Wenn Sie das vorhaben, könnten Sie WM_RBUTTONDOWN auf Ihrem Hauptframe bearbeiten und dann berechnen, ob der Rechtsklick auf der Titelleiste erfolgt ist.

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);
}

Für C ++ ist Boost.Random wahrscheinlich das, wonach Sie suchen. Es unterstützt MT (neben vielen anderen Algorithmen) und kann Entropie über die Klasse nondet_random sammeln. Hör zu! :-)





c++ windows user-interface mfc