Показать сообщение отдельно

  #8  
Старый 15.07.2008, 23:36
SlyBit
Познающий
Регистрация: 04.07.2008
Сообщений: 56
Провел на форуме:
390892

Репутация: 60
По умолчанию

VictorTiamat

Если я конечно правильно понял, то тебе нужно модифицировать системное меню окна.

1. Добавляем новый элемент меню

Хэдл меню получаешь функцией GetSystemMenu, вставляешь новые элементы InsertMenu.

Код:
#define SC_TEST WM_USER+1
HWND hWindow;
HMENU hMenu;
    
// hWindow - хэдл твоего (можно и чужого) окна
hMenu = GetSystemMenu(hWindow, 0);

// Вставляем разделитель в конец меню
InsertMenu(hMenu, -1, MF_BYPOSITION |MF_SEPARATOR, 0, 0);

// Вставляем новый элемент
InsertMenu(hMenu, -1, MF_BYPOSITION | MF_STRING, SC_TEST, "Test");
Также можно удалить ненужные элементы системного меню RemoveMenu или изменить существующие SetMenuItemInfo (читай MSDN).

2. Обрабатываем нажатия на меню

Для каждого окна есть свой зарегистрированный класс (RegisterClassEx). Элемент lpfnWndProc структуры WNDCLASSEX задает функцию, обрабатывающую оконные сообщения. В Visual Studio 2005 в шаблонном win32 приложении это будет функция WndProc. Собственно в ней мы и будем обрабатывать клики на системное меню.

Код:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;

    switch (message)
    {
        case WM_SYSCOMMAND:
            wmId    = LOWORD(wParam);
            wmEvent = HIWORD(wParam);
            
            switch(wmId)
            {
                case SC_CLOSE: // Закрыть
                    // Тут наша обработка события
                    MessageBoxA(0, "SC_CLOSE", 0, 0);
                    // return 1, чтобы прекратить обработку события, т.е. не закрывать
                    return 0;
                case SC_MAXIMIZE: // Развернуть
                    return 0; 
                case SC_MINIMIZE: // Свернуть
                    return 0; 
                case SC_MOVE: // Переместить
                    return 0; 
                case SC_SIZE: // Размер
                    return 0; 
                case SC_TEST: // Test
                    return 0; 
            }
        case WM_COMMAND:
             // ...CUT...
    }
    return 0;
}
 
Ответить с цитированием