【发布时间】:2011-04-22 06:57:17
【问题描述】:
我有一个基于选项卡的 windows 应用程序,我正在自己开发。
我想为标签控件的背景添加一个微妙的渐变。我该怎么做呢?对我来说最好的方法是什么?
我认为实现一个占用选项卡控件空间的自定义控件是可行的,但是我将如何使用 GDI 绘制渐变?
提前致谢。
【问题讨论】:
我有一个基于选项卡的 windows 应用程序,我正在自己开发。
我想为标签控件的背景添加一个微妙的渐变。我该怎么做呢?对我来说最好的方法是什么?
我认为实现一个占用选项卡控件空间的自定义控件是可行的,但是我将如何使用 GDI 绘制渐变?
提前致谢。
【问题讨论】:
要使用 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虽然,非常广泛的答案。而且我不知道子分类:)
您可以使用 GDI+ LinearGradientBrush:
http://msdn.microsoft.com/en-us/library/ms533914(VS.85).aspx
GDI+ 在 WinXP 和更高版本的 Windows 中可用,也可以安装在以前的 Windows 版本上。 GDI+ SDK 是 Windows SDK 的一部分。
【讨论】:
在旧的 GDI 中,GradientFill 函数负责渐变。
【讨论】: