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

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

Вопрос

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

Это было полезно?

Решение

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

Другие советы

Набор WS_EX_DLGMODALFRAME расширенный стиль.

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

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

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

Если вы это имели в виду, вы могли бы обработать 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);
}

Пример кода в 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 в нужном месте.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top