2011-01-09 2 views
0

Я ищу, чтобы иметь vista/win7 использовать окна в стиле Aero, в то время как пользователи XP используют обычный стиль окна (как получить Windows XP stlye, а не win95 style btw?)Изменение визуального стиля элементов управления на основе окон версии

идея что-то вроде этого:

OSVERSIONINFOEX osvi; 
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); 
GetVersionEx((OSVERSIONINFO*)&osvi); 
if (osvi.dwMajorVersion > 5) { 
       #pragma comment(linker,"/manifestdependency:\"type='win32' "\ 
       "name='Microsoft.Windows.Common-Controls' "\ 
       "version='6.0.0.0' "\ 
       "processorArchitecture='x86' "\ 
       "publicKeyToken='6595b64144ccf1df' "\ 
       "language='*' "\ 
       "\"") 
} 

Теперь #pragma запускается на выполнение независимо от того, если Условный оператор является истинным или ложным, который я предполагаю, именно так, как #pragma работы. Безусловно, есть другой способ, чтобы заставить это работать (что-то вроде #ifndef #define ... #endif я думаю)

Приветствие

+1

Вы пытаетесь смешивать действия во время компиляции с условиями выполнения. – SLaks

+0

Кроме того, почему вы хотите это сделать? – SLaks

+0

Я хотел, чтобы он был совместим с xp, а также win7/vista, теперь я вижу, почему мне нужны разные исполняемые файлы. Cheers – KaiserJohaan

ответ

2

Вы смешиваете время компиляции оценки прагмы с выполнением вводного времени код. Очевидно, это не сработает.

Можно сохранить манифест для приложения в файле «PutYourProgramNameHere.exe.manifest». Поэтому, если вам нужны разные манифесты для XP и Vista/Win7, вы можете установить различные файлы манифеста при установке приложения на целевой компьютер. То есть ваш установщик проверяет версию ОС и устанавливает соответствующий манифест.

+0

Я вижу, это очищает вещи. благодаря – KaiserJohaan

1

Для этого вы можете использовать функции Activation Context API. Требования:

  • Использование LoadLibrary & GetProcAddress фактически загрузить функции API в вопросе, поскольку они не существуют до NT 5.1
  • Либо встроить манифест, содержащий зависимость comctl 6 в качестве ресурса с ресурсом id> 16 или иметь его как файл на диске.

В этом примере кода предполагается, что манифест внедрен как ресурс RT_MANIFEST с идентификатором 17. TestOSVersion() - это ваша функция, чтобы решить, хотите ли вы обрезанное окно.

ACTCTX actx = {0}; 
actx.cbSize = sizeof(ACTCTX); 
actx.dwFlags = ACTCTX_FLAG_RESOURCE_NAME_VALID | ACTCTX_FLAG_HMODULE_VALID; 
actx.lpResourceName = MAKEINTRESOURCE(17); 
actx.hModule = GetModuleHandle(NULL); // assumes the manifest is exe embedded. 

HANDLE hactx = INVALID_HANDLE_VALUE; 

if(TestOsVersion()) 
    hactx = CreateActCtx(&actx); 
ULONG_PTR actxCookie = NULL; 
if (hactx != INVALID_HANDLE_VALUE) 
    ActivateActCtx(hactx,&actxCookie); 

// Now, with the activation context active, create the dialog box 
// or window or whatever. 
HWND hwndDialog = CreateDialogBoxParam(...); 

// and pop the context. It doesn't matter if the dialog still exists, the 
// ctl6 dll is now loaded and serving requests. 
if (hactx != INVALID_HANDLE_VALUE) 
    DeactivateActCtx(0,actxCookie); 

Очевидно, что для того, чтобы это работало, общий контроль v6 не может быть в манифесте процессы по умолчанию.

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