Wednesday, October 13, 2010

GradientFill

GradientFill

  函数功能:该函数填充矩形和三角形结构。
  函数原型:BOOL GradientFill(HDC hdc, CONST PTRIVERTEX pVertex, DWORD dwNumVertex, CONST PVOID pMesh, DWORD dwNumMesh, DWORD dwMode);
  参数:
  hdc:指向目标设备环境的句柄。
  pVertex:指向TRIVERTEX结构数组的指针,该数组中的每项定义了三角形顶点。
  dwNumVertex:顶点数目。
  pMesh:三角形模式下的GRADIENT_TRIANGLE结构数组,或矩形模式下的GRADIENT_RECT结构数组。
  dwNumMesh:参数pMesh中的成员数目(这些成员是三角形或矩形)。
  dwMode:指定倾斜填充模式。该参数可以包含下列值,这些值的含义为:
  GRADIENT_FILL_RECT_H:在该模式下,两个端点表示一个矩形。该矩形被定义成左右边界具有固定颜色(由TRIVERTEX结构指定)。GDI从上至下插入颜色,并填充内部区域。
  GRADIENT_FILL_RECT_V:在该模式下,两个端点表示一个矩形。该矩形定义其顶部和底部边界的颜色为固定值(通过TRIVERTEX结构指定),GDI从顶至底部边界插入颜色,并填充内部区域。
  GRADIENT_FILL_TRIANGLE:在该模式下,TRIVERTEX结构数组以及描述单个三角形的数组索引序列被传给GDI。GDI在三角形顶点之间进行线性插值,并填充内部区域。在24和32位/像素模式下,绘图是直接进行。在16、8、4和1位/像素模式中进行抖动处理。
  返回值:如果函数执行成功,那么返回值为TRUE;如果函数执行失败,则返回值为FALSE。
  Windows NT:若想获得更多错误信息,请调用GetLastError函数。
  备注:若想在矩形区域中加入一些平滑的阴影(底纹),请用三角形的三个顶点调用GradientFill函数。CDI将进行线性插值,并填充矩形区域。在绘制矩形时可能使用两种阴影模式在水平模式中,矩形从左至右开始变暗,在垂直模式中则是从上至下进行。
  GradientFill函数使用网眼法(mesh method)来表示要绘制对象的端点。所有传给GradientFill的顶点都存储在pVertex数组中。参数pMesh指定了这些顶点如何连接形成一个对象。当填充矩形时,pMesh指向一个GRADIENT_RECT结构数组。每一个GRADIENT_RECT结构指定了pVertex数组中两个顶点的索引值,这两个顶点形成一个矩形的左上角和右下角坐标。
  在填充三角形情况下,pMesh指向的是GRADIENT_TRIANGLE结构数组。每一个GRADIENT_TRIANGLE结构指定了pVertex数组中的3个顶点,这三个顶点形成一个三角形。
  为了简化硬件加速,无需要求该例程在三角形内部具有像素完善特性。
  若想了解更多信息,参考平滑成影、绘制带阴影的三解和矩形等方面的内容。
  速查:Windows NT:5.0及以上版本;Windows:98及以上版本;Windows CE 5.0以上:支持;头文件:wingdi.h;库文件:作为一个资源包含在msimg32.dll中。

GRADIENT_RECT

  typedef struct _GRADIENT_RECT {
  ULONG UpperLeft;
  ULONG LowerRight;
  }GRADIENT_RECT, *PGRADIENT_RECT;
  每一个GRADIENT_RECT结构指定了pVertex数组中两个顶点的索引值,这两个顶点形成一个矩形的左上角和右下角坐标。
效果图
查看更多精彩图片

例子:
VC6.0创建一个基于对话框的程序test。
1.在主对话框类CTestDlg中声明使用#pragma comment(lib, "msimg32")
2.重载CTestDlg::OnPaint()

void CTestDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
//CDialog::OnPaint();
CPaintDC dc(this); // device context for painting

//图1
TRIVERTEX vert[2] ;
GRADIENT_RECT gRect;
vert [0] .x = 10;
vert [0] .y = 10;
vert [0] .Red = 0xad00;
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 = 0x9c00;
vert [1] .Alpha = 0x0000;

gRect.UpperLeft = 0;
gRect.LowerRight = 1;
GradientFill(dc.m_hDC,vert,2,&gRect,1,GRADIENT_FILL_RECT_H);

//图2
TRIVERTEX vert2[2] ;
GRADIENT_RECT gRect2;
vert2 [0] .x = 10;
vert2 [0] .y = 50;
vert2 [0] .Red = 0x0000;
vert2 [0] .Green = 0xad00;
vert2 [0] .Blue = 0x0000;
vert2 [0] .Alpha = 0x0000;

vert2 [1] .x = 100;
vert2 [1] .y = 72;
vert2 [1] .Red = 0x9c00;
vert2 [1] .Green = 0x0000;
vert2 [1] .Blue = 0x0000;
vert2 [1] .Alpha = 0x0000;

gRect2.UpperLeft = 0;
gRect2.LowerRight = 1;
GradientFill(dc.m_hDC,vert2,2,&gRect2,1,GRADIENT_FILL_RECT_V);

//图3
TRIVERTEX vert3 [4] ;
GRADIENT_TRIANGLE gTri3[2];
vert3 [0] .x = 10;
vert3 [0] .y = 90;
vert3 [0] .Red = 0x0000;
vert3 [0] .Green = 0x0000;
vert3 [0] .Blue = 0x0000;
vert3 [0] .Alpha = 0x0000;

vert3 [1] .x = 100;
vert3 [1] .y = 90;
vert3 [1] .Red = 0x0000;
vert3 [1] .Green = 0x0000;
vert3 [1] .Blue = 0xff00;
vert3 [1] .Alpha = 0x0000;

vert3 [2] .x = 100;
vert3 [2] .y = 122;
vert3 [2] .Red = 0x0000;
vert3 [2] .Green = 0x0000;
vert3 [2] .Blue = 0xff00;
vert3 [2] .Alpha = 0x0000;

vert3 [3] .x = 10;
vert3 [3] .y = 122;
vert3 [3] .Red = 0xff00;
vert3 [3] .Green = 0xff00;
vert3 [3] .Blue = 0xff00;
vert3 [3] .Alpha = 0x0000;

gTri3[0].Vertex1 = 0;
gTri3[0].Vertex2 = 1;
gTri3[0].Vertex3 = 2;

gTri3[1].Vertex1 = 0;
gTri3[1].Vertex2 = 2;
gTri3[1].Vertex3 = 3;
GradientFill(dc.m_hDC,vert3,4,&gTri3,2,GRADIENT_FILL_TRIANGLE);
}
}

No comments:

Post a Comment