【问题标题】:C++ WinAPI old-styled windowC++ WinAPI 老式窗口
【发布时间】:2013-10-31 16:53:36
【问题描述】:

我想在 C++ 中创建一个这样的窗口:

http://winprog.org/tutorial/images/simple_window.gif

问题是,当我在 Windows 7 中创建窗口时,它获得了 Windows 7 的样式,我想让它看起来很旧。我该怎么做?我搜索了这个,但我只能找到想要让按钮更现代的人。

【问题讨论】:

  • 为什么不想尊重用户选择的主题?
  • 我喜欢它们,仅供我自己使用
  • 那么为什么不把你的主题改成经典主题呢?

标签: c++ winapi styles window


【解决方案1】:

您可以使用Uxtheme.h 中的SetWindowTheme 函数

  1. Properties->Linker->Input->Additional Dependencies 中添加对uxtheme.lib 的依赖
  2. 包括<Uxtheme.h>
  3. 创建窗口后调用SetWindowTheme(hwnd, L" ", L" ");

下面是一个示例(shell 取自 winprog.org 示例)

#include <windows.h>
#include <Uxtheme.h>

const char g_szClassName[] = "myWindowClass";

// Step 4: the Window Procedure
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_CLOSE:
            DestroyWindow(hwnd);
        break;
        case WM_DESTROY:
            PostQuitMessage(0);
        break;
        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASSEX wc;
    HWND hwnd;
    MSG Msg;

    //Step 1: Registering the Window Class
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = 0;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = g_szClassName;
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    if(!RegisterClassEx(&wc))
    {
        MessageBox(NULL, "Window Registration Failed!", "Error!",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    // Step 2: Creating the Window
    hwnd = CreateWindowEx(
        WS_EX_CLIENTEDGE,
        g_szClassName,
        "The title of my window",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
        NULL, NULL, hInstance, NULL);

    if(hwnd == NULL)
    {
        MessageBox(NULL, "Window Creation Failed!", "Error!",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    SetWindowTheme(hwnd, L" ", L" "); // ADD THIS
    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    // Step 3: The Message Loop
    while(GetMessage(&Msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return Msg.wParam;
}

参考资料:

http://msdn.microsoft.com/en-us/library/windows/desktop/bb759827%28v=vs.85%29.aspx http://msdn.microsoft.com/en-us/library/windows/desktop/bb773175%28v=vs.85%29.aspx

评论:

包含依赖的图片:

【讨论】:

  • 感谢您的回复!但是它说即使我链接了库 libuxtheme.a 并包含了 uxtheme.h 库,也没有声明 SetWindowTheme(),我做错了什么?顺便说一句,我正在使用 Dev-C++
  • @user2686435 你真的包含了“libuxtheme.h”吗?那不是一个合适的标题或库。它应该是“uxtheme.lib”作为依赖项,“Uxtheme.h”作为要包含的标头。
  • 对不起,再看一遍评论,我编辑了。我的意思是我链接了 libuxtheme.a 并包含了 uxtheme.h
  • @user2686435 编辑后的答案包括一张图片,说明它的价值。
  • @user2686435 不确定 Dev-C++ 以及它处理依赖项的方式。这是使用 Visual Studio。
【解决方案2】:

Windows 中的窗口 UI 样式是全局的,除非您自己为窗口设置外观,否则您必须这样做才能获得所需的效果。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多