Ownerdraw按钮的悬停效果

时间:2019-04-04 13:53:01

标签: c++ winapi

我设置了ownerdraw按钮。 我使用Rectangle并使用消息WM_DRAWITEM使其成功。 并在该按钮中成功判断ON / OFF。 但我想将悬浮效果添加为css的:hover。 我想花几秒钟将颜色变深。 很难。 我搜寻了几天,但找不到解决方案。 这是我的第一个问题。 对不起,英语不好。

我试图抓住鼠标(x,y)。 但是我不能。

case WM_MOUSEMOVE:
x = LOWORD(lp); 
y = HIWORD(lp); 


if(buttonlefttop<= x <= buttonlefttop + buttonwidth && buttontoptop<= y 
<= buttontoptop + buttonheight){
            std::cout<<"[INFO] "<<"ON\n";
}else{
            std::cout<<"[INFO] "<<"OFF\n";
}

案例WM_DRAWITEM:             hdc =(((LPDRAWITEMSTRUCT)(lp))-> hDC;

        if (((LPDRAWITEMSTRUCT)(lp))->itemState & ODS_SELECTED) {
            hpen = CreatePen(PS_SOLID, 5, RGB(80, 91, 109));
            hbr = CreateSolidBrush(RGB(80, 91, 109));

            SelectObject(hdc, hpen);
            SelectObject(hdc, hbr);

            std::cout<<"[INFO] ON\n";
        }else {
            hpen = CreatePen(PS_SOLID, 5, RGB(73, 147, 120));
            hbr = CreateSolidBrush(RGB(73, 147, 120));

            SelectObject(hdc, hpen);
            SelectObject(hdc, hbr);

            std::cout<<"[INFO] OFF\n";
        }
        Rectangle(hdc , 0 , 0 ,
         buttonwidth,buttonheight
        );
        DeleteObject(SelectObject(hdc , GetStockObject(WHITE_BRUSH)));
        return TRUE;

我无法添加hovereffect。

1 个答案:

答案 0 :(得分:2)

您可以使用Buffered Animation API,此功能自Windows Vista开始可用。这是标准Win32控件在内部用来绘制动画淡入淡出效果的API。

API负责:

  • 为淡入淡出动画的第一张图像创建位图
  • 为淡入淡出动画的最后一个图像创建位图
  • 创建计时器以定期调用WM_PAINT
  • 生成动画的中间图像

基本上,您只需要渲染动画的第一张和最后一张图像,API就会自动渲染中间的步骤。

网络上有许多使用此API的示例。我上面链接的API页面上已经有一个。有一个tutorial on CodeGuru,它有更好的解释。