Eliminarea pictogramei din barele de titlu ale Windows fără a deschide butonul închis sau meniul de sistem?

Dezvolt o aplicație MFC și am căutat recent o metodă bună de a elimina pictograma dintr-o bară de titlu Windows, dar păstrează butonul de închidere. Cele două soluții candidate evidente opresc stilul meniului de sistem sau stilul ferestrei instrumentului, dar aș prefera să nu dezactivez meniul de sistem sau să folosesc bara de titlu a ferestrei sculptate. Multe aplicații MFC au această funcționalitate, așa că mă întreb: lipsesc niște metode standard de a face asta?

0
fr hi bn

6 răspunsuri

ce zici de a scăpa de meniul sistemului și apoi de al pune înapoi într-un alt loc al tău (spun lângă butonul de închidere etc.)?

0
adăugat

Fără pictograma, singura metodă pe care am putut să o imaginez pentru utilizatori de a accesa meniul sistemului este prin clic dreapta pe bara de titlu.

Dacă asta v-ați gândit, ați putea să vă ocupați de WM_RBUTTONDOWN pe cadrul dvs. principal și apoi să calculați dacă click-dreapta a fost pe bara de titlu.

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);
}
0
adăugat

Puteți utiliza codul WM_NCRBUTTONDOWN pentru a detecta dacă utilizatorul a făcut clic dreapta pe captura dvs. și apoi a afișat meniul de sistem.

0
adăugat

Ați putea folosi o pictogramă complet transparentă.

0
adăugat

Un exemplu de cod în Delphi care elimină pictograma:

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 cod similar ar trebui să funcționeze pentru MFC. Practic, trebuie doar să WM_SETICON la NULL în locul potrivit.

0
adăugat

Setați stilul extins WS_EX_DLGMODALFRAME .

0
adăugat
Ar fi trebuit să fie răspunsul.
adăugat autor c00000fd, sursa