C++ 修改GradientFill API的RGB参数以避免代码修改 导言和有关资料:

C++ 修改GradientFill API的RGB参数以避免代码修改 导言和有关资料:,c++,winapi,gradient,gdi,C++,Winapi,Gradient,Gdi,我正在使用GradientFillAPI绘制2个渐变三角形 以下是我编写的助手函数: void GradientTriangle( HDC MemDC, LONG x1, LONG y1, LONG x2, LONG y2, LONG x3, LONG y3, COLORREF top, COLORREF bottom ) { TRIVERTEX vertex[3]; vertex[0].x = x1; vertex[0]

我正在使用
GradientFill
API绘制2个渐变三角形

以下是我编写的助手函数:

void GradientTriangle( HDC MemDC, 
    LONG x1, LONG y1, 
    LONG x2, LONG y2, 
    LONG x3, LONG y3, 
    COLORREF top, COLORREF bottom )
{
    TRIVERTEX vertex[3];

    vertex[0].x     = x1;
    vertex[0].y     = y1;
    vertex[0].Red   = GetRValue(bottom) << 8;
    vertex[0].Green = GetGValue(bottom) << 8;
    vertex[0].Blue  = GetBValue(bottom) << 8;
    vertex[0].Alpha = 0x0000;

    vertex[1].x     = x3;
    vertex[1].y     = y3; 
    vertex[1].Red   = GetRValue(bottom) << 8;
    vertex[1].Green = GetGValue(bottom) << 8;
    vertex[1].Blue  = GetBValue(bottom) << 8;
    vertex[1].Alpha = 0x0000;

    vertex[2].x     = x2;
    vertex[2].y     = y2;
    vertex[2].Red   = GetRValue(top) << 8;
    vertex[2].Green = GetGValue(top) << 8;
    vertex[2].Blue  = GetBValue(top) << 8;
    vertex[2].Alpha = 0x0000;

    // Create a GRADIENT_TRIANGLE structure that
    // references the TRIVERTEX vertices.

    GRADIENT_TRIANGLE gTriangle;

    gTriangle.Vertex1 = 0;
    gTriangle.Vertex2 = 1;
    gTriangle.Vertex3 = 2;

    // Draw a shaded triangle.

    GradientFill( MemDC, vertex, 3, &gTriangle, 1, GRADIENT_FILL_TRIANGLE);
}
当程序启动时,您应获得以下信息:

将窗口向左移动很远(使其部分“离开屏幕”变为不可见),然后将其向后移动,您应该会看到:

我为解决这个问题所做的努力: 按照答案中的说明,我能够通过切换传递给helper函数的坐标顺序来解决工件的问题

不过,底部三角形的颜色已更改,我需要帮助修改
RGB
参数以使其正确

以下是我的解决方法:

// I have modified parametters for bottom triangle 
GradientTriangle( (HDC)wParam, 
    r.left, r.top,
    r.right, r.bottom - r.top,  //  switched places
    r.left, r.bottom - r.top,   //  of these two coordinates
    RGB( 0x0, 0x0, 0xFF ), RGB( 0xFF, 0xFF, 0x0 ) );  // but color has changed
正如我所说,这些人工制品消失了,但产生的颜色发生了变化:

问题: 如何修改传递给助手函数的
RGB
参数,以便获得正确的渐变颜色

多谢各位


致以最诚挚的问候。

制作四个类型为
COLORREF
结构的全局变量

您可以随意命名它们,但在您的情况下,合适的名称可以是“top1”、“bottom1”、“top2”和“bottom2”

在第一次调用
GradientTriangle
函数时,将topbottom最后两个参数分别设置为top1bottom1全局变量的值,在第二次调用
GradientTriangle
函数时,将topbottom最后两个参数分别设置为top2bottom2全局变量的值,而不是您设置的常量值:

RGB(0x0,0x0,0xFF)、RGB(0xFF,0xFF,0x0)、RGB(0xFF,0x0,0x0)和RGB(0x0,0xFF,0x0)

您应该分别通过我上面提到的每个值来设置每个全局变量,例如,如下代码示例所示:

// Global Variables:
COLORREF top1 = RGB( 0x0, 0x0, 0xFF )
COLORREF bottom1 = RGB( 0xFF, 0xFF, 0x0 )
COLORREF top2 = RGB( 0xFF, 0x0, 0x0 )
COLORREF bottom2 = RGB( 0x0, 0xFF, 0x0 )

// bottom triangle --> need help with this one!!
GradientTriangle( (HDC)wParam, 
    r.left, r.top, 
    r.left, r.bottom - r.top,
    r.right, r.bottom - r.top,
    top1, bottom1 ); //not RGB( 0x0, 0x0, 0xFF ), RGB( 0xFF, 0xFF, 0x0 ), unlike in the code you posted

// top triangle --> this one is fine !
GradientTriangle( (HDC)wParam, 
    r.right, r.bottom - r.top,
    r.right, r.top,
    r.left, r.top,  
    top2, bottom2 ); //not RGB( 0xFF, 0x0, 0x0 ), RGB( 0x0, 0xFF, 0x0 ), unlike in the code you posted
}
return 1L;
如何修改传递给助手函数的RGB参数,以便 获得合适的渐变颜色

您不修改RGB参数,而是修改四个全局变量,即top1、bottom1、top2和bottom2

修改后,如果在客户端窗口中未看到更改,则调用
无效设置
重画窗口
更新窗口
函数

毕竟,您会注意到渐变三角形的颜色会在客户端窗口中发生变化

我认为这一切都应该回答你的问题

我希望它能帮助你


祝我的想法好运

在您的问题:部分中,我知道您希望删除图形瑕疵,但在问题:部分中,您希望修改传递给助手函数的RGB参数,以便获得正确的渐变颜色

总之,你要求两件不同的事情,但实际上你只想实现其中一件

我只是帮了你一个你不想要的

你寻求的答案不是你问题的解决方案

我还从你的评论中了解到,你想要的是问题的解决方案,而不是问题的答案,与你的标题不同:

修改GradientFill API的RGB参数以避免代码修改

,因为我已经回答了你的问题,但你的回答是告诉我:


不幸的是,结果完全相同

你认为你问题的答案就是你问题的答案,所以你等待答案,因为在我第一次回答之前你不知道如何做你问的,但是你错了,在我看来,你问题的答案不是你问题的答案

一开始,我必须解决你的问题,而不是回答你的问题,或者至少尝试两种方法

我认为解决问题的方法是将调用移动到
WM\u move
handler,notin
WM\u SIZE
handler,因为

将窗口移到最左边时,使其部分脱离 景象

当您执行此操作时,
WM\u MOVE
正在处理,或者换句话说,您放入此处理程序的代码正在执行,not
WM\u SIZE
,因为您正在移动窗口,not调整其大小或更改其大小

您还可以尝试:
WM\u MOVING
WM\u WINDOWPOSCHANGED
WM\u WINDOWPOSCHANGING

使
计时器线程自动调用。 使用
SetTimer
CreateThread
函数初始化计时器或线程并启动其中一个。使用
Sleep
函数延迟线程


调用
KillTimer
SuspendThread
停止或完成计时器或线程。

不幸的是,结果完全相同。我在我的
WM_SIZE
处理程序中调用了
invalidate
,但这并不重要。这个问题在我在帖子中链接的问题的公认答案中得到了很好的描述。请参阅我的帖子中的“我为解决此问题所做的努力”部分,并仔细阅读我提供的链接中的公认答案。谢谢你的帮助。顺致敬意,似乎您希望为WM_ERASEBKGND返回一个非零值以忽略它,只需在WM_PAINT中首先绘制背景。感谢您的持续支持,我会的
// Global Variables:
COLORREF top1 = RGB( 0x0, 0x0, 0xFF )
COLORREF bottom1 = RGB( 0xFF, 0xFF, 0x0 )
COLORREF top2 = RGB( 0xFF, 0x0, 0x0 )
COLORREF bottom2 = RGB( 0x0, 0xFF, 0x0 )

// bottom triangle --> need help with this one!!
GradientTriangle( (HDC)wParam, 
    r.left, r.top, 
    r.left, r.bottom - r.top,
    r.right, r.bottom - r.top,
    top1, bottom1 ); //not RGB( 0x0, 0x0, 0xFF ), RGB( 0xFF, 0xFF, 0x0 ), unlike in the code you posted

// top triangle --> this one is fine !
GradientTriangle( (HDC)wParam, 
    r.right, r.bottom - r.top,
    r.right, r.top,
    r.left, r.top,  
    top2, bottom2 ); //not RGB( 0xFF, 0x0, 0x0 ), RGB( 0x0, 0xFF, 0x0 ), unlike in the code you posted
}
return 1L;