2008-08-13 4 views
6

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

ответ

2

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

0

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

0

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

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

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

+0

Это должен был быть ответ. – c00000fd 2016-02-06 07:49:15

2

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

0

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