Непонятный глюк с окнами MDI.
Путь воспроизведения:
1. Создать приложение MDI
2. Открыть окно в приложении, максимизировать его. Кнопки окна MDI [_][O][X] — на месте.
3. Открыть еще одно окно(поскольку уже открытое окно максимизировано, то и новое тоже будет максимизировано). По факту открытия окна нужно модифицировать меню (только не слиянием с меню окна MDI) — добавить удалить пункт меню, не обязательно верхнего уровня. Кнопки окна MDI [_][O][X] — исчезли.
Если теперь изменить размер главного окна — кнопки нарисуются.
Что я только не делал. Помогает, например, скрыть-показать строку меню или минимизировать окно MDI/максимизировать его — но дико мерцает же.
Меню — MenuStrip. Зависимости от того само, по себе это меню или лежит в ToolStripPanel, никакой. Проявляется и там и там — просто по факту модифиации меню.
В силу определенных причин, уйти от модификации меню при открытии окна — не могу.
Как бороться? Полгода этот глюк мусолю — избавится не могу.
Предвосхищаю вопросы:
1. используется .net 3.5sp1, на 2.0 — проблемы те-же
2. Krypton Toolkit. Но и без него — всё точно так же.
Здравствуйте, neo-xil, Вы писали:
NX>Как бороться? Полгода этот глюк мусолю — избавится не могу.
NX>Предвосхищаю вопросы: NX>1. используется .net 3.5sp1, на 2.0 — проблемы те-же NX>2. Krypton Toolkit. Но и без него — всё точно так же.
Не смог воспроизвести в минимальном примере проблему. В минимальном примере работает, а в моем приложении — нет.
Загадка
Здравствуйте, neo-xil, Вы писали:
NX>Не смог воспроизвести в минимальном примере проблему. В минимальном примере работает, а в моем приложении — нет. NX>Загадка
NX>>Как бороться? Полгода этот глюк мусолю — избавится не могу.
Полгода это как-то многовато Как насчет того, чтобы отрезать в вашем коде все что связано с отображением этих кнопок или даже вообще кастомизацией окон в приложении — сделать как раз минимальный пример. Убедиться, что с кнопками все хорошо. Потом постепенно добавлять ваш код и смотреть, когда все станет плохо. Довольно стандартный способ диагности — собственно он и называется "хакинг"
Re[3]: [IMGs-61kb] Кнопки [_][O][X] окна в MDI
От:
Аноним
Дата:
27.01.10 13:23
Оценка:
Здравствуйте, Кэр, Вы писали:
Кэр>Здравствуйте, neo-xil, Вы писали:
NX>>Не смог воспроизвести в минимальном примере проблему. В минимальном примере работает, а в моем приложении — нет. NX>>Загадка
NX>>>Как бороться? Полгода этот глюк мусолю — избавится не могу.
Кэр>Полгода это как-то многовато Как насчет того, чтобы отрезать в вашем коде все что связано с отображением этих кнопок или даже вообще кастомизацией окон в приложении — сделать как раз минимальный пример. Убедиться, что с кнопками все хорошо. Потом постепенно добавлять ваш код и смотреть, когда все станет плохо. Довольно стандартный способ диагности — собственно он и называется "хакинг"
Нестандартное отображение добавил я относительно недавно. Как раз думал, что если нестандартно кнопки эти отрисовывает, то и мои нормально перерисует. Ан нет.
Вкратце, структура воздействия на меню такова: при открытии нового окна меняется "состав действующих объектов". И по этому составу меняется и состав меню согласно ассоциированных этим объектам "действий". Алгоритм там рекурсивный, для понимания тяжелый (т.к. ряд "действий" еще и порождающие — т.е. генерируют вложенные "действия"). И всё работало.
Но вот только разработку я тогда вел на классической теме виндовс, а потом решил посмотреть на "красоты" приложения на клиентских машинах. И вот с того момента — полгода прошло. И воспроизвести случай — сложно.
Но проблему я уже обошел — окно при распахивании просто изменяет размер до размеров MDIClient.ClientSize
Вот это и называется "костылинг".
Я сделал просто — создал новый code_file.cs, в котором создал 2 класса наследника (как показано по приведенной мне ссылке). Этого оказалось достаточно, во всех используемых компонентах krypton.toolkit даже не пришлось замещать метод OnSizeChanged(), а только в двух:
namespace Calc2
{
public class KryptonFormDelay : KryptonForm
{
protected override void OnSizeChanged(EventArgs e)
{
if (Handle != null)
BeginInvoke((MethodInvoker)delegate
{ base.OnSizeChanged(e); });
}
}
public class KryptonSplitContainerDelay : KryptonSplitContainer
{
protected override void OnSizeChanged(EventArgs e)
{
if (Handle != null)
BeginInvoke((MethodInvoker)delegate
{ base.OnSizeChanged(e); });
}
}
}
И проблема исчезла, правда стало заметно притормаживать (сильнее чем раньше), зато нормально щас перерисовывается, без глюков, а также максимизируется/минимизируется.
Кстати, как я понял, это только на Win7 64 такая проблема. У меня именно такая система.
Забыл сказать, конечно же, еще пришлось везде в дизайнере и в коде изменить имя компонентов на этих имя унаследованных от них компонентов с замещенным методом.
Здравствуйте, neo-xil, Вы писали:
NX>Добрый день.
NX>Непонятный глюк с окнами MDI. NX>Путь воспроизведения: NX>1. Создать приложение MDI NX>2. Открыть окно в приложении, максимизировать его. Кнопки окна MDI [_][O][X] — на месте.
NX>3. Открыть еще одно окно(поскольку уже открытое окно максимизировано, то и новое тоже будет максимизировано). По факту открытия окна нужно модифицировать меню (только не слиянием с меню окна MDI) — добавить удалить пункт меню, не обязательно верхнего уровня. Кнопки окна MDI [_][O][X] — исчезли.
Делаем примерно те же действия, кнопки не исчезают.
Думаю, как и советовали, нужно резать исходное приложение. То бишь убирать все лишнее до минимума.