Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > рамка и меню как в iTunes


Автор: X-3R1 7.5.2010, 13:44
Каким образом можно реализовать рамку как в iTunes (не стандартная Windows), вынесение меню в заголовок, а также работа с самим заголовком (изменение цвета, и кнопки "не совсем родные"). GUI реализую при помощи Qt4, но есть подозрения, что подобные вещи делаются на уровне WinAPI. 

Если же делаю через Qt4, убиранием бордера и созданием собственного, то пропадает взаимодействие с оконным менеджером (такое как разворачивание на полный экран (без перекрытия панели с "Пуск"), изменение размеров и т.п.).  В iTunes -- эти все действия присутствуют, что и наводит мысли на работу с окном (собственный стиль бордера окна) на уровне ОС.

http://ipicture.ru/


Автор: GremlinProg 7.5.2010, 14:57
Цитата(X-3R1 @  7.5.2010,  15:44 Найти цитируемый пост)
В iTunes -- эти все действия присутствуют, что и наводит мысли на работу с окном (собственный стиль бордера окна) на уровне ОС.

здесь простое перекрытое окно со стилями:
WS_OVERLAPPED | WS_SYSMENU | WS_THICKFRAME | WS_VISIBLE | WS_MINIMIZEBOX | WS_MAXIMIZEBOX

iTunes удаляет обязательный заголовок окна путем перехватывания WM_NCCALCSIZE,
выглядит это примерно так:
Код

    switch( uMsg ){
        ...
        case WM_NCCALCSIZE:{
            LPRECT lpRc;
            //
            lpRc        = ((LPNCCALCSIZE_PARAMS)lParam)->rgrc;
            lpRc->top    -= ::GetSystemMetrics(SM_CYCAPTION);
            break;
        }
        ...
    }
return::DefWindowProc( hwnd, uMsg, wParam, lParam );

а все остальные компоненты реализует обычными кнопками (BUTTON)

Добавлено через 6 минут и 11 секунд
т.е. это можно делать хоть в QT, хоть в Delphi

Автор: GremlinProg 7.5.2010, 15:12
таскать окно за такой заголовок тоже довольно просто:
Код

    switch( uMsg ){
    ...
        case WM_NCHITTEST:{
            RECT rw;
            INT x, y, h;
            //
            x    = (SHORT)LOWORD(lParam);
            y    = (SHORT)HIWORD(lParam);
            h    = ::GetSystemMetrics(SM_CYCAPTION);
            ::GetWindowRect( hwnd, &rw );
            if( (x > rw.left + 2) && (x < rw.right - 2) ){
                if( (y > rw.top + 2) && (y < rw.top + h) ){
                    return HTCAPTION;
                }
            }
            break;
        }
    ...
    }
return ::DefWindowProc( hwnd, uMsg, wParam, lParam );


Автор: X-3R1 7.5.2010, 15:57
спасибо, буду разбираться.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)