论坛上有朋友问,不说废话了,大过年的,时间比较宝贵:)
原贴:http://social.microsoft.com/Forums/zh-CN/visualcpluszhchs/thread/98240e0a-7899-4184-96c9-2ac1bac221d3
建立一个Win32空项目,加入一个CPP文件main.cpp代码如下。
#include <windows.h>
#define CLASS_NAME TEXT("Vonger")
LRESULT _stdcall TestProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_CREATE:
{
::CreateWindow(TEXT("BUTTON"), TEXT("Hello"), WS_CHILD|WS_VISIBLE, 10, 10, 60, 30, hWnd, 0, 0, 0);
}
break;
case WM_LBUTTONDOWN:
::SendMessage(hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0);
break;
case WM_DESTROY:
::PostQuitMessage(1);
break;
}
return ::DefWindowProc(hWnd, uMsg, wParam, lParam);
}
int _stdcall WinMain(HINSTANCE, HINSTANCE, LPSTR, BOOL)
{
WNDCLASS wc = {0};
wc.lpszClassName = CLASS_NAME;
wc.lpfnWndProc = TestProc;
wc.hbrBackground = (HBRUSH)::GetStockObject(BLACK_BRUSH);
wc.hCursor = ::LoadCursor(NULL, IDC_ARROW);
::RegisterClass(&wc);
HWND hWnd = ::CreateWindow(CLASS_NAME, CLASS_NAME, WS_POPUP|WS_VISIBLE,
100, 100, 100, 100, 0, 0, 0, 0);
if(hWnd == NULL)
return 1;
MSG msg = {0};
while(::GetMessage(&msg, 0, 0, 0))
::DispatchMessage(&msg);
return 0;
}
这是一个基本的Win32程序。就是在一个窗口上显示一个没有任何功能的按钮。
可以直接编译,发现该按钮是一个很反古的按钮~呵呵,没有新的基因(因为API的按钮都是默认画出来的,为了向下兼容,所以是这种反古画法)
现在,我来变魔术了~嘿嘿~
选择添加资源->Import...->把如下内容的一个文件给加进去->把这个资源段起名为RT_MANIFEST(随便起)->编译...见证奇迹:)
这个文件你想起什么名起什么名,一般是 项目名称.manifest
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*' />
</dependentAssembly>
</dependency>
</assembly>
注意,这是VS2005的VC8.0的manifest可能和2008的VC9.0略有不同~
现在简单的讲解一下原理:这是XP以后Windows支持的新特性,由于界面变得好看了,所以需要一个文件来协调与Win98时代的代码兼容性,manifest由此而生。这个文件是XP以后的程序必备的,可以内嵌或者直接加到EXE的外面。具体可以参考MSDN中详细介绍manifest文件的部分,可以通过在msdn的英文界面中搜索manifest即可找到相关信息。