怎样按照一定角度来画渐变颜色?

StarLee 2005-08-16 02:21:32
对话框的背景是3种颜色的渐变效果,横着或者竖着比较容易实现。
可是我现在做的要求根据一个可变的角度画出渐变颜色,试了很多种方法都不行,希望高手前来帮忙!最好是有代码可以看。
只要解决,分不是问题。
谢谢了,先!
...全文
658 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
fisker0303 2005-09-01
  • 打赏
  • 举报
回复
关注...
zxy_net 2005-09-01
  • 打赏
  • 举报
回复
先水平或者垂直的画效果,然后顺针或者逆针旋转一定角度就可以了,简单吧
xili 2005-09-01
  • 打赏
  • 举报
回复
看来只有我来答了,既然你横的,竖的都实现了,问题就很简单了.

用SetWorldTransform()将你的当前 空间旋转, 然后画个横的就好.
然后将坐标空间转换回去. 接着做其他事.

它的参数设置,就是计算机图形学第一章的基本内容了.
huxzjqhh 2005-09-01
  • 打赏
  • 举报
回复
mark
i_Love_MM 2005-08-31
  • 打赏
  • 举报
回复
这个问题最简单的解决方法94使用GDIPlus,偶也一直在这么用。使用LineGradientBrush,构建梯度渐变的起始色和角度的一个刷子,然后用刷子填充这个矩形就OK了,比较方便,具体的可以参考MFC文档。如:
GDIPlus::LineGradientBrush ABrush(ARect, argbStartColor, argbEndColor, fGradientAngle);
GDIPlus::Graphics Canvas(pDC->GetSafeHdc());
Canvas.FillRectangle(&ABrush, ARect);
给个提示:GDIPlus使用必须初始化,用完要Shutdown。
寻开心 2005-08-31
  • 打赏
  • 举报
回复
给我你的email地址
StarLee 2005-08-31
  • 打赏
  • 举报
回复
楼上的,我从来没有搞过这方面的开发,所以请赎小弟愚昧,我还是不太明白你的方法。
能不能给我写段例子?
谢谢了,先!
寻开心 2005-08-30
  • 打赏
  • 举报
回复
三色变换,三色是A,B,C
那么实际上是三个区域,A->B B->C C->A

用户指定了一个角度,实际上就是定义了一个方向
把多边形在这个方向上进行投影,得到这个方向上的一个线段H
把这个线段均匀划分成三段,每段分别对应到A->B B->C C->A的变换区域

再构造一个垂直用户指定角度的方向,把多边形也在这个垂直方向上投影
得到另外一个线段V

这两个方向上的投影可以形成一个平行四边形(实际上就是一个矩形),把多边形包裹在内部
在H方向上颜色是渐变的,在V方向上颜色是相同的
把H方向划分成一系列的小单元,做平行V方向的线段,那么把包围矩形划分成了多个小矩形
每个矩形单元用一个颜色填充就是了
StarLee 2005-08-30
  • 打赏
  • 举报
回复
楼上的,能不能说的详细一点儿呀?
我没有搞过这方面的开发!
谢谢了,先!
寻开心 2005-08-29
  • 打赏
  • 举报
回复
先定义两个方向,一个是颜色渐变的方向,一个是它的垂直方向
然后明确在垂直方向上颜色是如何变化的,相同吗?

首先构造一个函数,实现在渐变方向上的颜色变化的函数:
color = GetColorByPos(l)
参数l是在渐变方向上,距离起点的距离

有了这个渐变函数,剩下的问题就是一个解决旋转变换的问题了
根据用户指定的角度,把水平线,旋转一下
在新的位置获取上面的每个点距离原点的位置,调用color=GetColorByPos(l)获得其本色
然后构造和这个点垂直的直线,这个直线上用color填充(或者用一个平行四边形来填充)即可
StarLee 2005-08-22
  • 打赏
  • 举报
回复
高手多多帮忙呀!
StarLee 2005-08-18
  • 打赏
  • 举报
回复
vcmute(横秋):
非常感谢你的回答,可是我对图形这方面了解太少了,你的代码我看不太明白,你能不能说详细点儿?
谢谢!
hejiwangbaggio 2005-08-18
  • 打赏
  • 举报
回复
使用GDI+比较简单!
如果使用GDI的话,这个算法要自己定义!
你要的是不是就是从中心到圆或扇形的外缘渐变啊?
vcmute 2005-08-18
  • 打赏
  • 举报
回复
如果没定义GradientFill,可从msimg32.dll导出
typedef BOOL (WINAPI *pGradientFill)(HDC,PTRIVERTEX,ULONG,PVOID,ULONG,ULONG);
pGradientFill GradientFill;
HINSTANCE handle;

handle = LoadLibrary( "msimg32.dll" );
GradientFill = (pGradientFill) GetProcAddress( handle, "GradientFill" );
用完后记得
FreeLibrary( handle );
不知道是不是这个效果?
vcmute 2005-08-18
  • 打赏
  • 举报
回复
#define FILL_VERT(n, _y, _x) vert [n] .Alpha = 0x0000;\
vert[n].x = _x;\
vert[n].y = _y;\
vert[n].Red = cs[n].R<<8;\
vert[n].Green = cs[n].G<<8;\
vert[n].Blue = cs[n].B<<8;

enum {TOP_LEFT,TOP_RIGHT,BOTTOM_LEFT,BOTTOM_RIGHT};
CRect rect(0,0,200,100);
_COLORREF cs[]={{255,0,0}, {0,255,0}, {0,0,255}, {0,0,0}, {255,255,255}};
TRIVERTEX vert [4] ;
GRADIENT_TRIANGLE gTri[2]={{BOTTOM_LEFT,TOP_RIGHT,BOTTOM_RIGHT},{TOP_LEFT,BOTTOM_LEFT,TOP_RIGHT}};
FILL_VERT(TOP_LEFT,rect.top,rect.left);
FILL_VERT(TOP_RIGHT,rect.top,rect.right);
FILL_VERT(BOTTOM_LEFT,rect.bottom,rect.left);
FILL_VERT(BOTTOM_RIGHT,rect.bottom,rect.right);
GradientFill( hdc, vert, 4, >ri, 2, GRADIENT_FILL_TRIANGLE );
vcmute 2005-08-18
  • 打赏
  • 举报
回复
GradientFill
The GradientFill function fills rectangle and triangle structures.

BOOL GradientFill(
HDC hdc, // handle to DC
PTRIVERTEX pVertex, // array of vertices
ULONG dwNumVertex, // number of vertices
PVOID pMesh, // array of gradients
ULONG dwNumMesh, // size of gradient array
ULONG dwMode // gradient fill mode
);
StarLee 2005-08-18
  • 打赏
  • 举报
回复
没人会吗?
大侠们,帮忙呀!
StarLee 2005-08-18
  • 打赏
  • 举报
回复
vcmute(横秋):
你能不能说得详细点儿呀?我在这方面是个菜鸟!谢谢!

也许这样更清楚一点儿:

1111111111111#############
111111111111#############$
11111111111#############$$
1111111111#############$$$
111111111#############$$$$
11111111#############$$$$$
1111111#############$$$$$$
111111#############$$$$$$$
11111#############$$$$$$$$
1111#############$$$$$$$$$
111#############$$$$$$$$$$
11#############$$$$$$$$$$$
1#############$$$$$$$$$$$$
#############$$$$$$$$$$$$$

矩形区域不一定是正方形。
倾斜的角度是可变的,由用户输入。
0度的话就是水平的3种颜色渐变。
90度的话就是垂直的3种颜色渐变。

水平和垂直都已经搞定,倾斜实在是搞不定,请高手们多多帮忙!
谢谢了,先!

vcmute 2005-08-18
  • 打赏
  • 举报
回复
先涂上三色,然后用抖动算法做渐变
StarLee 2005-08-18
  • 打赏
  • 举报
回复
vcmute(横秋):
你的代码我搞定了,效果非常漂亮,可是那不是我要的效果。
还是谢谢你!

我要的效果是类似下面的样子(一种数字表示一种颜色,每种颜色之间要有渐变效果):

1111122222
1111222223
1112222233
1122222333
1222223333
2222233333

而且角度是可以变的,有可能是下面这个样子:

1111122222
1112222233
1222223333
2222333333
2233333333
3333333333

大家多多帮忙!
谢谢了,先!

加载更多回复(7)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧