Windows 7 Aero - Application Caption bug
От: wraith1985 Беларусь  
Дата: 30.04.11 12:31
Оценка:
Доброго времени суток!

При разработки приложения столкнулся со следующей проблемой в Windows 7 (Aero).
Проблема, как видно из темы это стиль Aero и заголовок приложения, а именно...
Если приложение стартует изначально в оконном режиме, то всё отлично — никаких вопросов.



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

— никакого Aero =(

Но это еще не всё) Если приложение изначально стартует в полноэкранном режиме, а потом переключаемся в оконный,
то всё вроди бы в поряде, за исключением отсутствующей иконки =(



Может кто-нибудь сталкивался с подобной проблемой?
Поделитесь мыслями по этому поводу.
Заранее спасибо!

З.Ы. На разную ширину приложения на картинках не обращайте внимание — с фотошопом лень было возиться.
Re: Windows 7 Aero - Application Caption bug
От: о_О
Дата: 30.04.11 14:14
Оценка:
Здравствуйте, wraith1985, Вы писали:

W>Как только юзер переключается в полноэкранный режим и обратно в оконный,

W>с заголовком приложения происходит следующее
в программе или поиграть садится? если в программе, то как реализован полноэкранный режим?
Re[2]: Windows 7 Aero - Application Caption bug
От: wraith1985 Беларусь  
Дата: 30.04.11 14:52
Оценка:
Здравствуйте, о_О, Вы писали:

о_О>Здравствуйте, wraith1985, Вы писали:


W>>Как только юзер переключается в полноэкранный режим и обратно в оконный,

W>>с заголовком приложения происходит следующее
о_О>в программе или поиграть садится? если в программе, то как реализован полноэкранный режим?

Всё происходит в программе.
В реализации, по моему, ничего особенного.


void Application::Initiate()
{
    ...
    m_styleW = WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_VISIBLE;
    m_styleFS = WS_POPUP|WS_VISIBLE;
    ...
}

void Application::AdjustWindow()
{
    RECT *rc;
    LONG style;

    if (bWindowed)
    {
        rc = &m_rectW;
        style = m_styleW;
    }
    else
    {
        rc = &m_rectFS;
        style = styleFS;
    }

    SetWindowLong(hwnd, GWL_STYLE, style);

    style = GetWindowLong(hwnd, GWL_EXSTYLE);
    if (bWindowed)
    {
        SetWindowLong(hwnd, GWL_EXSTYLE, style & (~WS_EX_TOPMOST));
        SetWindowPos(hwnd, HWND_NOTOPMOST, rc->left, rc->top, rc->right-rc->left, rc->bottom-rc->top, SWP_FRAMECHANGED);
    }
    else
    {
        SetWindowLong(hwnd, GWL_EXSTYLE, style | WS_EX_TOPMOST);
        SetWindowPos(hwnd, HWND_TOPMOST, rc->left, rc->top, rc->right-rc->left, rc->bottom-rc->top, SWP_FRAMECHANGED);
    }
}
Re[3]: Windows 7 Aero - Application Caption bug
От: о_О
Дата: 30.04.11 15:04
Оценка:
Здравствуйте, wraith1985, Вы писали:

W>В реализации, по моему, ничего особенного

по твоему =)

W>
W>void Application::Initiate()
W>{
W>    ...
W>    m_styleW = WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_VISIBLE;
W>    m_styleFS = WS_POPUP|WS_VISIBLE;
W>    ...
W>}

а зачем WS_POPUP?

W>void Application::AdjustWindow()
W>{
W>    RECT *rc;
W>    LONG style;

W>    if (bWindowed)
W>    {
W>        rc = &m_rectW;
W>        style = m_styleW;
W>    }
W>    else
W>    {
W>        rc = &m_rectFS;
W>        style = styleFS;
W>    }

W>    SetWindowLong(hwnd, GWL_STYLE, style);

W>    style = GetWindowLong(hwnd, GWL_EXSTYLE);
W>    if (bWindowed)
W>    {
W>        SetWindowLong(hwnd, GWL_EXSTYLE, style & (~WS_EX_TOPMOST));
W>        SetWindowPos(hwnd, HWND_NOTOPMOST, rc->left, rc->top, rc->right-rc->left, rc->bottom-rc->top, SWP_FRAMECHANGED);
W>    }
W>    else
W>    {
W>        SetWindowLong(hwnd, GWL_EXSTYLE, style | WS_EX_TOPMOST);
W>        SetWindowPos(hwnd, HWND_TOPMOST, rc->left, rc->top, rc->right-rc->left, rc->bottom-rc->top, SWP_FRAMECHANGED);
W>    }
W>}
W>

а зачем SetWindowPos(hwnd, HWND_TOPMOST когда есть ITaskbarList2::MarkFullscreenWindow?
Re[3]: Windows 7 Aero - Application Caption bug
От: о_О
Дата: 30.04.11 15:33
Оценка:
Здравствуйте, wraith1985, Вы писали:

а параметры класса какие? а нестандартные контролы на форме есть?
Re[4]: Windows 7 Aero - Application Caption bug
От: wraith1985 Беларусь  
Дата: 30.04.11 15:52
Оценка:
Здравствуйте, о_О, Вы писали:

о_О>Здравствуйте, wraith1985, Вы писали:


о_О>а параметры класса какие? а нестандартные контролы на форме есть?


Никаких нестандартных контролов нет, там вообще контролов нет — это каркас игрового приложения.
А параметры какого класса имеете в виду?

о_О>а зачем SetWindowPos(hwnd, HWND_TOPMOST когда есть ITaskbarList2::MarkFullscreenWindow?


Не подскажите как с данным интерфейсом работать? =)
Re[5]: Windows 7 Aero - Application Caption bug
От: о_О
Дата: 30.04.11 16:21
Оценка:
Здравствуйте, wraith1985, Вы писали:

W>Не подскажите как с данным интерфейсом работать? =)

конечно подскажем
Re[3]: Windows 7 Aero - Application Caption bug
От: о_О
Дата: 30.04.11 16:26
Оценка:
Здравствуйте, wraith1985, Вы писали:

эта хрень после установки HWND_TOPMOST. забавно
Re[6]: Windows 7 Aero - Application Caption bug
От: wraith1985 Беларусь  
Дата: 30.04.11 16:28
Оценка:
Здравствуйте, о_О, Вы писали:

о_О>Здравствуйте, wraith1985, Вы писали:


W>>Не подскажите как с данным интерфейсом работать? =)

о_О>конечно подскажем

Клёва! Это я и сам нашел!
Вопрос в том, как получить инстанс данного интерфейса?
Re[4]: Windows 7 Aero - Application Caption bug
От: о_О
Дата: 30.04.11 16:30
Оценка:
Здравствуйте, о_О, Вы писали:

о_О>после установки HWND_TOPMOST

SWP_FRAMECHANGED. fixed
Re[7]: Windows 7 Aero - Application Caption bug
От: о_О
Дата: 30.04.11 16:30
Оценка:
Здравствуйте, wraith1985, Вы писали:

W>Вопрос в том, как получить инстанс данного интерфейса?



CoCreateInstance(CLSID_TaskbarList, 0, CLSCTX_INPROC_SERVER, __uuidof(ITaskbarList2), (void**)&ITB);
Re[3]: Windows 7 Aero - Application Caption bug
От: kero Россия  
Дата: 30.04.11 16:58
Оценка:
Здравствуйте, wraith1985, Вы писали:

W>В реализации, по моему, ничего особенного.

...
W> SetWindowPos(hwnd, HWND_NOTOPMOST, rc->left, rc->top, rc->right-rc->left, rc->bottom-rc->top, SWP_FRAMECHANGED);

Как раз в релизации-то и дело, в SetWindowPos.
Если бы сделали, например, через ShowWindow SW_MAXIMIZE/SW_RESTORE — казуса с оконными метриками не было бы.
Суть в том, что Aero — это очень шаткий костыль, и вышибить его ничего не стоит.
Почитайте-ка недавний топик со сходным названием http://rsdn.ru/forum/winapi/4244908.flat.aspx
Автор: kero
Дата: 22.04.11
.
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[4]: Windows 7 Aero - Application Caption bug
От: о_О
Дата: 30.04.11 18:05
Оценка:
Здравствуйте, kero, Вы писали:

K>Здравствуйте, wraith1985, Вы писали:


W>>В реализации, по моему, ничего особенного.

K>...
W>> SetWindowPos(hwnd, HWND_NOTOPMOST, rc->left, rc->top, rc->right-rc->left, rc->bottom-rc->top, SWP_FRAMECHANGED);

K>Как раз в релизации-то и дело, в SetWindowPos.

K>Если бы сделали, например, через ShowWindow SW_MAXIMIZE/SW_RESTORE — казуса с оконными метриками не было бы.
K>Суть в том, что Aero — это очень шаткий костыль, и вышибить его ничего не стоит.
K>Почитайте-ка недавний топик со сходным названием http://rsdn.ru/forum/winapi/4244908.flat.aspx
Автор: kero
Дата: 22.04.11
.


я повторил ситуацию. забавное порно после второго SetWindowPos(hWnd, HWND_TOP, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOSIZE | SWP_NOMOVE);
Re[5]: Windows 7 Aero - Application Caption bug
От: о_О
Дата: 30.04.11 18:14
Оценка:
Здравствуйте, о_О, Вы писали:

о_О>я повторил ситуацию. забавное порно после второго SetWindowPos(hWnd, HWND_TOP, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOSIZE | SWP_NOMOVE);


поспешил. если всё сделать по уму, то всё ок. так что автор явно перемудрил
Re[4]: Windows 7 Aero - Application Caption bug
От: wraith1985 Беларусь  
Дата: 04.06.11 13:31
Оценка:
Здравствуйте, о_О, Вы писали:

о_О>Здравствуйте, wraith1985, Вы писали:


W>>В реализации, по моему, ничего особенного

о_О>по твоему =)

W>>
W>>void Application::Initiate()
W>>{
W>>    ...
W>>    m_styleW = WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_VISIBLE;
W>>    m_styleFS = WS_POPUP|WS_VISIBLE;
W>>    ...
W>>}
о_О>

о_О>а зачем WS_POPUP?

о_О>
W>>void Application::AdjustWindow()
W>>{
W>>    RECT *rc;
W>>    LONG style;

W>>    if (bWindowed)
W>>    {
W>>        rc = &m_rectW;
W>>        style = m_styleW;
W>>    }
W>>    else
W>>    {
W>>        rc = &m_rectFS;
W>>        style = styleFS;
W>>    }

W>>    SetWindowLong(hwnd, GWL_STYLE, style);

W>>    style = GetWindowLong(hwnd, GWL_EXSTYLE);
W>>    if (bWindowed)
W>>    {
W>>        SetWindowLong(hwnd, GWL_EXSTYLE, style & (~WS_EX_TOPMOST));
W>>        SetWindowPos(hwnd, HWND_NOTOPMOST, rc->left, rc->top, rc->right-rc->left, rc->bottom-rc->top, SWP_FRAMECHANGED);
W>>    }
W>>    else
W>>    {
W>>        SetWindowLong(hwnd, GWL_EXSTYLE, style | WS_EX_TOPMOST);
W>>        SetWindowPos(hwnd, HWND_TOPMOST, rc->left, rc->top, rc->right-rc->left, rc->bottom-rc->top, SWP_FRAMECHANGED);
W>>    }
W>>}
W>>

о_О>а зачем SetWindowPos(hwnd, HWND_TOPMOST когда есть ITaskbarList2::MarkFullscreenWindow?

Получается, что вызов ITaskbarList2::MarkFullscreenWindow равнозначен нажатию на кнопку Maximize.
Это не тот fullscreen, который мне необходим.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.