Win32编程问题

时间:2010-10-07 10:07:22

标签: c++ winapi gdi

我有一个基于标签的Windows应用程序,我自己开发。

我想在我的标签控件的背景中添加一个微妙的渐变。我该怎么做呢?我使用的最佳方法是什么?

我认为实现占用选项卡控件空间的自定义控件会起作用,但是如何使用GDI绘制渐变呢?

先谢谢。

3 个答案:

答案 0 :(得分:4)

要使用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!
  }
}

答案 1 :(得分:1)

您可以使用GDI + LinearGradientBrush:

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

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

答案 2 :(得分:1)

在古老的GDI中,GradientFill函数执行渐变事件。