2016-06-02 5 views
0

У меня есть приложение, которое динамически генерирует диалоги. Я использовал его для создания Visual Studio 6.0. Переключилось на VS2013 некоторое время назад и внесло необходимые корректировки, чтобы заставить его строить. Никогда не выпускал приложение до недавнего времени. Затем пользователь заметил проблему заполнения границ Windows 7 Aero (упоминается в другом сообщении здесь), где мои диалоги заканчивались меньше, чем было запрошено, т. Е. Дополнение к пробегу Aero было взято из моего запрашиваемого размера окна, а не добавлено к нему, поэтому мои элементы управления не имеют должным образом центрированы в окне по запросу. Я установил накладку на моем рабочем столе до 1, поэтому я никогда не замечал эту проблему.Проблема с добавлением границы диалога в Visual Studio 2013 происходит только в режиме освобождения

Действительно странно, что это не Случается, когда я создаю приложение для отладки. Если я буду запускать отладочные версии и выпускать бок о бок, вы можете видеть, что диалоги отличаются по размеру от толщины границы. Я предполагаю, что версии debug vs release связанной системной библиотеки имеют разные реализации такого поведения.

В моей логике построения этих диалогов я выясняю, насколько большой должна быть область клиента, а затем добавьте метрики кадров перед созданием окна. Это неверно, т. Е. Существует ли более «правильный» способ сделать это, что будет работать во всех версиях Windows и со всеми компиляторами.

+0

Я только что нашел GetSystemMetrics (SM_CXPADDEDBORDER) и попытался добавить 2 * в мой размер запрашиваемого окна. Это в основном устраняет проблему, но не полностью. Версия выпуска по-прежнему получает немного меньшее окно, чем версия отладки. Как ни странно, я ожидал, что окна отладочной версии просто увеличатся на ту же сумму, но они, похоже, не выглядели. Оказывается, GetSystemMetrics (SM_CXPADDEDBORDER) возвращает 8 (значение заполнения, которое я установил в Aero для проверки этого) в версии для версии приложения, но возвращает 0 в отладочной версии. Это орехи или что? – littlenoodles

+0

Вот еще одна странная вещь. Мое приложение использует MDI, и я создаю только реальные всплывающие диалоговые окна, если окна MDI максимизированы. Если не максимизировать, я просто создаю всплывающие окна как дети MDI. В отладочной версии, когда дочерние всплывающие окна MDI не изменяются по размеру, я вообще не получаю дополнение границ. Но в версии релиза я получаю дополнение границ для нередуцируемых MDI-файлов. Является ли это просто ошибкой VS2013 - будет ли это исправлять в 2015 году? – littlenoodles

ответ

0

Хорошо, отчасти есть ответ. В версиях выпуска и отладки сообщаются совершенно разные значения для различных связанных с границей показателей системы.

отладки: SM_CXPADDEDBORDER = 0, SM_CXBORDER = 1, SM_CXSIZEFRAME = 12, SM_CXFIXEDFRAME = 3

выпуска: SM_CXPADDEDBORDER = 8, SM_CXBORDER = 1, SM_CXSIZEFRAME = 4, SM_CXFIXEDFRAME = 3

Так, как только я добавлю все это в мой размер требуемого окна, обе версии, похоже, работают, хотя они дают разные результаты. Не изменяемые по размеру окна в отладочной версии не получают дополняемых границ, а изменяемые по размеру получат большую границу, но это «размерный кадр», а не «отступы», вызывающие его.

Интересно, что когда я смотрю на мои свойства проекта, в командной строке компоновщика в конфигурации отладки есть /SUBSYSTEM:WINDOWS",5.01 ", а в конфигурации релиза он имеет только/SUBSYSTEM: WINDOWS. Я не вижу, что 5.01 в фактическом файле myapp.vcxproj, поэтому я думаю, что VS 2013 вставляет «, 5.01» динамически, чтобы конфигурация отладки специально приводила к некоторому режиму совместимости. Я попытался указать его в разделе «система» компоновщика, но мои изменения не отображались в командной строке. Кто-нибудь знает, возможно ли (или желательно) установить это вручную?

 Смежные вопросы

  • Нет связанных вопросов^_^