2011-01-09 51 views
0

我期待vista/win7使用Aero风格的窗户,而XP用户使用正常的窗口风格(如何获得Windows XP stlye而不是win95风格btw?)更改基于windows的控件的视觉风格版本

的想法是这样的:

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被执行不管if语句是真的还是假的,我的猜测是现在的样子的#pragma作品。当然还有一些其他的方式来得到这个工作(类似的#ifndef的#define ... #ENDIF我猜)

干杯

+1

您正试图将编译时操作与运行时条件混合使用。 – SLaks 2011-01-09 17:21:55

+0

另外,你为什么要这样做? – SLaks 2011-01-09 17:22:17

回答

2

你是混合的运行时刻执行编译的编译时间评估码。显然这是行不通的。

它可以保持一个清单在“PutYourProgramNameHere.exe.manifest”文件的应用程序。因此,如果您需要XP和Vista/Win7的不同清单,则可以在目标计算机上安装应用程序时安装不同的清单文件。即您的安装程序会检查操作系统版本并安装匹配清单。

1

可以使用Activation Context API功能来做到这一点。要求是:

  • 使用LoadLibrary & GetProcAddress实际加载的API函数有问题,因为他们根本不存在之前NT 5.1
  • 无论是嵌入含有与资源的COMCTL 6依赖作为一种资源清单id> 16,或将其作为磁盘上的文件。

此示例代码假定清单被嵌入为RT_MANIFEST资源,其ID为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公共控件不能在进程默认清单中。