【问题标题】:Win32 programming questionWin32编程题
【发布时间】:2011-04-22 06:57:17
【问题描述】:

我有一个基于选项卡的 windows 应用程序,我正在自己开发。

我想为标签控件的背景添加一个微妙的渐变。我该怎么做呢?对我来说最好的方法是什么?

我认为实现一个占用选项卡控件空间的自定义控件是可行的,但是我将如何使用 GDI 绘制渐变?

提前致谢。

【问题讨论】:

    标签: c++ winapi gdi


    【解决方案1】:

    要使用 GDI,您需要 GradientFill 函数。您还可以使用 GDI+ 来获得渐变。这是一个简单的 GDI 示例:

    TRIVERTEX        vert[2] ;
    GRADIENT_RECT    gRect;
    vert [0] .x      = 0;
    vert [0] .y      = 0;
    vert [0] .Red    = 0x0000;
    vert [0] .Green  = 0x0000;
    vert [0] .Blue   = 0x0000;
    vert [0] .Alpha  = 0x0000;
    
    vert [1] .x      = 100;
    vert [1] .y      = 32; 
    vert [1] .Red    = 0x0000;
    vert [1] .Green  = 0x0000;
    vert [1] .Blue   = 0xff00;
    vert [1] .Alpha  = 0x0000;
    
    gRect.UpperLeft  = 0;
    gRect.LowerRight = 1;
    GradientFill(hdc,vert,2,&gRect,1,GRADIENT_FILL_RECT_H);
    

    对于选项卡控件,您可以对控件进行子类化并覆盖其非客户端和客户端绘图处理程序以呈现渐变。

    要对控件进行子类化,首先创建控件,然后替换其 WNDPROC 函数:

    OldWndProc = (WNDPROC)SetWindowLongPtr (hControl, GWLP_WNDPROC, (LONG_PTR)NewWndProc);
    

    然后,在您的新 WNDPROC 中:

    NewWndProc (usual args)
    {
      switch message
      {
      case paint:
        draw gradient
        return result
    
      default:
        return CallWindowProc (OldWndProc, ..args..); <- important!
      }
    }
    

    【讨论】:

    • 我认为您应该将return CallWindowProc 调用放在开关之外,否则编译器可能会发出警告“所有控制路径都没有返回......”。 +1虽然,非常广泛的答案。而且我不知道子分类:)
    • 您能否指出要处理的正确消息。 WM_PAINT?
    • 我试过 WM_PAINT,但我需要一些特定于客户区的东西。
    • @Alexander:客户区的绘制是由客户端处理的,所以需要在tab控件的子窗口中添加渐变代码。
    【解决方案2】:

    您可以使用 GDI+ LinearGradientBrush:

    http://msdn.microsoft.com/en-us/library/ms533914(VS.85).aspx

    GDI+ 在 WinXP 和更高版本的 Windows 中可用,也可以安装在以前的 Windows 版本上。 GDI+ SDK 是 Windows SDK 的一部分。

    【讨论】:

      【解决方案3】:

      在旧的 GDI 中,GradientFill 函数负责渐变。

      【讨论】:

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