MFC对话框窗口使用GDI+给按钮贴图

        最近要做一个有透明效果的按钮出来,先是大致学了PS教程,制作一个PNG格式的背景透明的按钮,如图1所示。然后使用GDI+进行贴图,最后要达到图2所示效果。开发环境是VS2010,MFC。


图1 PS制作的PNG格式按钮


图2 效果图

    1、背景填充,可以使用图片或者纯色来填充,我使用的是纯黑色;

    2、设置按钮属性为自绘,然后在dlg对象里添加OnDrawItem消息响应,在这个函数里使用GDI+实现贴图;

    本来以为按照上面的步骤就可以达到效果了,但事实是如图3所示。


图3 奇怪的效果

    图3中看着好像是按钮贴图的透明背景不透明了,显示成了灰白色。然后就开始调查这个问题。一开始以为是图片出问题了,因为自己PS刚开始学,以为制作的PNG图片背景不够透明,但是实际上制作的时候已经选择了透明背景了,所以排除了图片的问题,所以应该还是背景和贴图的问题。然后开始试验调试。

    1、第一种是将背景填充色去掉,然后按钮是正常的,如图4所示,没有白边。


图4 去掉背景填充色

    2、按钮不贴图,背景还是填充颜色,当然按钮还是自绘属性。效果如图5所示。


图5 只填充背景色

       观察图片5,发现没有给按钮贴图的时候按钮是这样显示的,将图5和图3进行比较,发现贴图的白边实际上是按钮的背景色,并不是贴图的透明背景显示出来了。背景填充的时候,只是填充了对话框的客户区,并不会绘制按钮,也就是说按钮把背景那一块区域给盖上了。所以应该先将按钮背景和对话框背景一样进行填充之后,再进行贴图。

       3、背景填充颜色,在OnDrawItem进行按钮背景自绘,然后再贴图,果然达到了如图2所示的效果图。

       但是问题又来了,因为现在背景填充纯色, 所以相对简单,如果背景是一张图片呢,就要将按钮对应的区域的背景图截取下来,然后绘制按钮背景,感觉太麻烦了。但是也是一种办法。

       后来又想,既然是按钮将背景挡上了,那让按钮透明不就可以将背景颜色露出来了么。

       4、背景颜色填充,在dlg对话框里添加了OnCtlColor消息响应,将按钮背景色去掉,再贴图。


if (pWnd->GetDlgCtrlID() == IDC_BTN_PNGBUTTON)
{
pDC->SetBkMode(TRANSPARENT); 
return HBRUSH(GetStockObject(NULL_BRUSH));
}

     编译运行,达到了效果。    



展开阅读全文

没有更多推荐了,返回首页