Кнопка в строке меню

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by VictorTiamat, 14 Jul 2008.

  1. VictorTiamat

    VictorTiamat New Member

    Joined:
    14 Jul 2008
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Привет всем.

    Такой вот глупый вопрос. Могу ли я разместить кнопку на строке меню, скажем в правом краю меню и если можно это сделать, то как?
    Я вот не уверен что это реально.

    Спасибо.
     
  2. YoYo Factory

    YoYo Factory Elder - Старейшина

    Joined:
    24 Mar 2008
    Messages:
    108
    Likes Received:
    79
    Reputations:
    -5
    Вопрос совсем не глупый, все реально! ;)
    Code:
    <input name="filex1" size="30"><input value="Поиск" type="submit">
    Вот к примеру...
    юзай тег <input>
     
    #2 YoYo Factory, 14 Jul 2008
    Last edited: 15 Jul 2008
    2 people like this.
  3. VictorTiamat

    VictorTiamat New Member

    Joined:
    14 Jul 2008
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Это канечно хорошо. Я юзаю тот тег и кнопку поиск уже целый день и по многим форумам. Но если на форумах кроме ответа "Юзай поиск" ничего сказать не могут. Ну.... видать такой это форум. Очень жаль что тут зарегался. Удачи всем.
     
  4. YoYo Factory

    YoYo Factory Elder - Старейшина

    Joined:
    24 Mar 2008
    Messages:
    108
    Likes Received:
    79
    Reputations:
    -5
    ТС имел ввиду к примеру как в гугле! :)
    просто не там создал темку ( С/С++, C#, Delphi, .NET, Asm ) :)
     
  5. VictorTiamat

    VictorTiamat New Member

    Joined:
    14 Jul 2008
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    MFC dialog based application. Мне нужно убрать полосу тайтла окна и собмтвенно кнопки минимайз, максимайз и клозе и реализовать эти кнопки на уровне меню.
     
  6. VictorTiamat

    VictorTiamat New Member

    Joined:
    14 Jul 2008
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Ну если Mfc ни есть С++ то..... Видимо точно в гугль.
     
  7. VictorTiamat

    VictorTiamat New Member

    Joined:
    14 Jul 2008
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Какими бы нибыли познания, но я написал тему в правильную категорию. Познаний достаточно в С++, но вот с таким решением пока не сталкивался. Есть только вариант дочернего диалога с кнопками. Но оно не красиво смотрится.
     
  8. SlyBit

    SlyBit Elder - Старейшина

    Joined:
    4 Jul 2008
    Messages:
    49
    Likes Received:
    8
    Reputations:
    0
    VictorTiamat

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

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

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

    Code:
    #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. Собственно в ней мы и будем обрабатывать клики на системное меню.

    Code:
    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;
    }