Win32开发First of All:如何在Win32程序中使用XP风格(vista)的按钮?

来源:互联网 发布:软件结构图 工具 编辑:程序博客网 时间:2024/05/16 16:39

论坛上有朋友问,不说废话了,大过年的,时间比较宝贵:)

原贴: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即可找到相关信息。