Я разрабатываю приложение MFC, и недавно я искал хороший способ удалить значок из строки заголовка Windows, но сохранил кнопку закрытия. Два очевидных решения кандидата - это отключение стиля системного меню или использование стиля окна инструмента, но я бы предпочел не отключать системное меню или использовать строку заголовка сокращенного окна инструмента. Многие приложения MFC имеют эту функциональность, поэтому я задаюсь вопросом: не хватает ли у меня стандартного способа сделать это?Удаление значка из заголовков Windows без нажатия кнопки закрытия или системного меню?
ответ
Вы можете использовать WM_NCRBUTTONDOWN
, чтобы обнаружить, если пользователь щелкает правой кнопкой мыши на вашей подписи, а затем вызвать системное меню.
Как избавиться от системного меню, а затем вернуть его в другое место yourseld (скажем, рядом с кнопкой закрытия и т. Д.)?
Без значка единственный способ, которым я мог представить, чтобы пользователи могли получить доступ к системному меню, - это щелчок правой кнопкой мыши заголовка.
Если это вы имели в виду, вы можете обрабатывать 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);
}
WS_EX_DLGMODALFRAME
расширенный стиль.
Вы можете использовать полностью прозрачный значок.
пример кода в 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 в нужном месте.
Это должен был быть ответ. – c00000fd 2016-02-06 07:49:15