Удалить значок из строки заголовка Windows, не нажимая кнопку закрытия или системное меню?

Я разрабатываю приложение MFC, и недавно я искал хороший способ удалить значок из строки заголовка Windows, но сохранил кнопку закрытия. Двумя очевидными вариантами решения являются отключение стиля системного меню или использование стиля окна инструментов, но я бы предпочел не отключать системное меню и не использовать строку заголовка окна уменьшенных инструментов. Многие приложения MFC обладают этой функциональностью, поэтому я задаюсь вопросом: мне не хватает стандартного способа сделать это?

13.08.2008 16:42:40
6 ОТВЕТОВ
РЕШЕНИЕ

Вы можете использовать, WM_NCRBUTTONDOWNчтобы определить, щелкнул ли пользователь правой кнопкой мыши на заголовке, а затем вызвать системное меню.

2
7.02.2016 18:32:26

как насчет того, чтобы избавиться от системного меню и затем вернуть его в другое место (скажем, рядом с кнопкой закрытия и т. д.)?

0
13.08.2008 17:12:52

Без значка единственный способ, которым я мог бы представить пользователям доступ к системному меню, - щелкнуть правой кнопкой мыши заголовок.

Если это то, что вы имели в виду, вы можете обработать WM_RBUTTONDOWN в своем основном фрейме, а затем вычислить, был ли щелчок правой кнопкой мыши на заголовке.

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
7.02.2016 18:32:46

Установить WS_EX_DLGMODALFRAMEрасширенный стиль.

4
7.02.2016 18:32:17
Это должен был быть ответ.
c00000fd 6.02.2016 07:49:15

Вы можете использовать полностью прозрачный значок.

2
5.06.2011 21:04:39

Пример кода в Delphi, который удаляет значок:

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;

Подобный код должен работать для MFC. По сути, вам просто нужно WM_SETICON для NULL в нужном месте.

0
11.04.2017 17:22:24