Supprimer l'icône des barres de titre Windows sans abandonner le bouton de fermeture ou le menu système ?

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

Question

Je développe une application MFC et j'ai récemment recherché une bonne méthode pour supprimer l'icône d'une barre de titre Windows, tout en conservant le bouton de fermeture.Les deux solutions candidates évidentes consistent à désactiver le style du menu système ou à utiliser le style de la fenêtre outil, mais je préférerais ne pas désactiver le menu système ou utiliser la barre de titre réduite de la fenêtre outil.De nombreuses applications MFC ont cette fonctionnalité, donc je me demande :est-ce que je manque une manière standard de procéder ?

Était-ce utile?

La solution

Vous pouvez utiliser WM_NCRBUTTONDOWN pour détecter si l'utilisateur a cliqué avec le bouton droit sur votre légende, puis afficher le menu système.

Autres conseils

Ensemble WS_EX_DLGMODALFRAME style étendu.

Vous pouvez utiliser une icône entièrement transparente.

que diriez-vous de vous débarrasser du menu système, puis de le remettre vous-même à un autre endroit (disons à côté du bouton de fermeture, etc.) ?

Sans l'icône, la seule méthode que je pourrais imaginer pour que les utilisateurs accèdent au menu système consiste à cliquer avec le bouton droit sur la barre de titre.

Si c'est ce que vous aviez en tête, vous pouvez gérer WM_RBUTTONDOWN sur votre cadre principal, puis calculer si le clic droit était sur la barre de titre.

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

Un exemple de code dans Delphi qui supprime l'icône :

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;

Un code similaire devrait fonctionner pour MFC.Fondamentalement, il vous suffit de mettre WM_SETICON sur NULL au bon endroit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top