Вывод сборки C ++ для VS 2008?

Почему, когда я наблюдаю вывод сборки из проекта VC ++ в VS, я вижу:

1> Компиляция ...
1> a.cpp
1> b.cpp
1> c.cpp
1> d.cpp
1> e.cpp
[И т.д ...]
1> Генерация кода ...
1> x.cpp
1> y.cpp
[etc ...]

Вывод выглядит так, как будто несколько блоков компиляции обрабатываются до генерации кода. Это действительно происходит? Я пытаюсь сократить время сборки, и, используя предварительно скомпилированные заголовки, я получил отличные ускорения для каждого файла .cpp, но во время сообщения «Генерация кода ...» происходит относительно длительная пауза. У меня не включены ни «Оптимизация всей программы», ни «Генерация временного кода ссылки». Если это так, то почему? Почему VC ++ не компилирует каждый «.cpp» по отдельности (что включает этап генерации кода)? Если это не просто иллюзия выходных данных, возможно, здесь происходит оптимизация кросс-компиляции? Кажется, что нет никаких опций компилятора для управления этим поведением (я знаю о WPO и LTCG, как упомянуто выше).

РЕДАКТИРОВАТЬ:
Журнал компоновки просто показывает файлы «.obj» в выходном каталоге, по одному на строку. Нет никаких указаний на этапы «Компиляция ...» и «Генерация кода ...».

РЕДАКТИРОВАТЬ:
Я подтвердил, что это поведение не имеет ничего общего с «максимальным числом параллельных сборок проекта» настройка в Инструменты -> Параметры -> Проекты и решения -> Построить и запустить . Он также не связан с настройкой MSBuild для выходной детализации сборки . Действительно, если я отменю сборку до шага «Генерация кода ...», ни один из файлов «.obj» не будет существовать для самого последнего набора «скомпилированных» файлов. Это означает, что компилятор действительно обрабатывает несколько блоков перевода вместе. {base.OnStartup (e); var ...

Я пишу приложение WPF для WinXP, и я переопределил тему по умолчанию темой vista следующим образом:

protected override void OnStartup(StartupEventArgs e)
{
  base.OnStartup(e);

  var themerd = new ResourceDictionary();
  themerd.Source = new Uri(@"PresentationFramework.Aero;V3.0.0.0;31bf3856ad364e35;component\themes/aero.normalcolor.xaml", UriKind.Relative);

  Resources.MergedDictionaries.Add(themerd);
}

И она в основном работает нормально. Когда я использую элемент управления, например кнопку:

<Button />

Стиль выглядит нормально, но если я использую кнопку с другим стилем, подобным этому:

<Button>
  <Button.Style>
    <Style TargetType="Button">
      <Setter Property="Width" Value="80" />
    </Style>
  </Button.Style>
</Button>

Стиль будет переопределять указанный стиль темы стандартным стилем WinXP, а не опираться на вершина этого. Это чрезвычайно ограничивает меня. Есть ли способ избежать этой проблемы?

11
задан Cœur 16 January 2017 в 16:26
поделиться

1 ответ

Почему это происходит

Значение по умолчанию BasedOn = для стиля создается с использованием только словаря ресурсов текущей темы. Техника, которую вы показываете для переопределения темы, на самом деле не меняет используемый словарь темы: он просто добавляет ресурсы из словаря ресурсов темы в словарь ресурсов приложения. Поскольку текущая тема не изменилась, значение по умолчанию BasedOn также не изменилось.

Как решить

Вариант 1. Локально переопределить тему путем перехвата вызовов uxtheme.dll! GetCurrentThemeName на уровне Win32. Это довольно сложно, но работает для всех ваших стилей без изменений вашего XAML.

Вариант 2: Установите BasedOn с помощью настраиваемого MarkupExtension. Это будет выглядеть так:

<Style TargetType="Button" BasedOn="{DefaultAeroStyle Button}"> ...

Ваше настраиваемое расширение MarkupExtension загрузит словарь темы Aero при первом использовании и сохранит его в статическом поле. Его конструктор примет тип, а его ProvideValue будет искать тип в словаре, чтобы найти стиль.

Вариант 3. Установите «На основе» как промежуточный именованный стиль. Это будет выглядеть так:

<Application ...>
  <Application.Resources>
    <ResourceDictionary>
      <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="... theme path ..." />
      </ResourceDictionary.MergedDictionaries>

      <Style x:Key="ThemeButtonStyle" TargetType="Button" BasedOn="{StaticResource {x:Type Button}}" />
      <Style x:Key="ThemeListBoxStyle" TargetType="ListBox" BasedOn="{StaticResource {x:Type ListBox}}" />
      ...
    </ResourceDictionary>
  </Application.Resources>
</Application>

Теперь в словаре нижнего уровня вы можете сказать:

<Style TargetType="Button" BasedOn="{StaticResource ThemeButtonStyle}" />

Вариант 4: Установить BasedOn, используя статическое свойство и расширение разметки x: Static

10
ответ дан 3 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: