您的位置:首页 > 其它

win32自绘按钮,使用GDI+(二)

2015-12-13 16:12 176 查看
一、解决上一篇的两个问题。

1、按钮背景透明

方法是,在绘制按钮之前,向按钮的父窗口发生WM_CTLCOLORBTN消息。该消息返回一个画刷句柄,系统使用该画刷句柄画出按钮的背景。所以我们在处理这个消息的时候,为系统返回一个空的画刷句柄就可以了。

直接在回调函数中添加代码

case WM_CTLCOLORBTN:
{
HBRUSH hBrush;
//hBrush = CreateSolidBrush(RGB(255, 0, 0));
hBrush=(HBRUSH)GetStockObject(NULL_BRUSH);
return (long)hBrush;
}


去掉FillRec函数,仍然可以实现下图效果:



2、设置系统菜单栏为渐变色

响应WM_NCPAINT。该消息在窗口框架被绘制时被送去窗口。

这个还没尝试,我还是先一条路走到黑,继续用去掉标题栏,重绘这个思路。

WM_NCPAINT参考https://msdn.microsoft.com/ZH-CN/library/windows/desktop/dd145212(v=vs.85).aspx

二、可以在按钮上贴图,网上有直接将bitmap上面的某一种颜色设置成透明的,但我试过一个程式,貌似透明的色彩会有偏差,这里把这个问题留在这里。这里用到的简单的办法是用GDI+直接加载用ps处理过的透明png图片(GDI的api函数LoadImage不能加载png图片也是郁闷,而ps刚好又不能保存为.bmp背景透明),方法直接加载就可以了

Graphics graphics( pdis->hDC);
Image image(L"bitmap.png", FALSE);
graphics.DrawImage(&image, 0,0);


效果如下



三、接下来还有一个问题,就是怎样实现鼠标点击按钮和移动到按钮上,按钮具有某种特效,比如,背景色改变之类的。最后找到的方法是处理WM_MOUSEMOVE,WM_MOUSEHOVER和WM_MOUSELEAVE消息,为此似乎要为按钮窗口定义窗口过程。So, try to do it
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: