2011-05-02 4 views
3

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

Я изменил WM_NCHITTEST, чтобы ответить HTCLIENT на мой заголовок, и я могу записать сообщение WM_NCRBUTTONUP, но мне нужна помощь в демонстрации системного меню, я не могу понять, как это сделать должным образом.

До сих пор у меня есть это:

void CSkinnedDialog::OnNcRButtonUp(UINT nHitTest, CPoint point) 
{ 
    CMenu* pMenu = GetSystemMenu(FALSE); 
    if (int cmd = pMenu->TrackPopupMenu(TPM_RETURNCMD, point.x, point.y, this)) 
     SendMessage(WM_SYSCOMMAND, cmd, MAKELPARAM(point.x, point.y)); 
} 

void CSkinnedDialog::OnSysCommand(UINT nID, LPARAM lParam) 
{ 
    if ((nID & 0xFFF0) == IDM_ABOUTBOX) 
    { 
     CAboutDlg dlgAbout; 
     dlgAbout.DoModal(); 
    } 
    else 
    { 
     CDialog::OnSysCommand(nID, lParam); 
    } 
} 

LRESULT CSkinnedDialog::OnNcHitTest(CPoint point) 
{ 
    LRESULT res = CDialog::OnNcHitTest(point); 
    ScreenToClient(&point); 
    if (res == HTCLIENT && point.y < m_nFrameHeight) 
    { 
     res = HTCAPTION; 
    } 
    return res; 
} 

void CSkinnedDialog::SysMenuAddAboutEntry() 
{ 
    // Add "About..." menu item to system menu. 
    // IDM_ABOUTBOX must be in the system command range. 
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 
    ASSERT(IDM_ABOUTBOX < 0xF000); 

    CMenu* pSysMenu = GetSystemMenu(FALSE); 
    if (pSysMenu != NULL) 
    { 
    pSysMenu->AppendMenu(MF_SEPARATOR); 
    pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, "About..."); 
    } 
} 

Это показывает системное меню, но это не очень хорошо работает. Он не отвечает на все команды, которые пользователь может выбрать (например, нажатие на пункт меню «О ...» ничего не делает, и некоторые действия, которые должны быть отключены и выделены серым цветом, такие как максимизация и восстановления, не до тех пор, пока вы щелкнули по крайней мере один раз левой кнопкой на заголовке окна.

+1

Вы хотите иметь панель заголовка и системное меню. Я предлагаю вам включить стили окон, которые заставляют систему рисовать его. Зачем вам нужно изобретать колесо? –

+0

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

+0

Вы должны установить стиль WS_SYSMENU, а затем написать собственный класс рисованного меню. используйте GetSystemMenu для подкласса системного меню, а затем у вас будет сшитое системное меню! Очевидно, вы можете использовать TrackPopupMenu, чтобы отображать его там, где хотите. – user965369

ответ

-2

Но это означает, что система меню не отображается, когда пользователь щелкает по заголовку.

Это никогда не отображается ни в каком «обычном» приложении, когда пользователь нажимает на заголовок, так?

Интересно, пытаетесь ли вы решить проблему, которая не является exi ул. Почему вы даже хотите показать системное меню? Я просто покажу свое собственное меню.

+0

У обычных приложений есть меню при нажатии на заголовок. Он имеет «восстановление/перемещение/размер/закрытие». Это даже приложения с диалогово-ориентированным интерфейсом. – sashoalm

+0

@satuon: Вы говорите о ** прямо ** - щелкнув заголовок или ** слева ** - щелкнув значок системного меню на заголовочных панелях с одним (на Windows 7, многие приложения этого не делают). Вопрос остается - у вас действительно есть проблема в первую очередь? Вам действительно нужно ** системное меню ** или просто ** ** меню? –

+0

Мне нужно показать системное меню. Теперь я заметил, что он все еще показывает, если я нажимаю Alt + Space, и он работает правильно (максимизировать/восстановить выделение серым цветом, нажав на кнопку About, из-за чего откроется окно dlg), но я не уверен, как открыть это я сам. – sashoalm

Смежные вопросы