自绘位图按钮

源文件 

    按钮是最常用的控件之一,也是界面开发中装点界面、美化界面的重要元素。实现按钮的自绘制,在按钮上贴图将是界面大大美观。
    我做的这个按钮类实现的就是自绘制的位图按钮。与MFC提供的CBitmapButton不同,这个类实现了正常的状态,鼠标经过的状态,鼠标按下的状态,和禁用的状态,也就是现在一般按钮都具有的四态。我们知道,windows下的按钮具有5态,而我没有实现的第五态选中态其实用处也不大,不会影响总体的效果。
    简单说一下我作的这个类,CWEBmpButton重载了DrawItem函数,所有绘图工作都是在这里完成的。但要注意的是,要激活DrawItem函数就必须设值按钮的BS_OWNERDRAW属性。我将BS_OWNERDRAW属性设置的语句写在了PreSubclassWindow函数中,以保证DrawItem函数的调用。这里插一句,自绘的东西做的多了我发现最好将绘制代码写在OnPaint函数中,这样对控件属性的要求弱一些。不过,DrawItem的参数lpDrawItemStruct中会有较为丰富的控件信息,这只要解析出来即可,而在OnPaint中获取这些信息要多费一些代码,所以两种方式各有利弊,如何取舍还要视情况而定。
    知道了在哪里画只是完成了第一步,但这也是最重要的一步。因为只要知道用什么函数画大家就都可以绘制自己的控件了,而且如果我们都用图片作自绘的话绘制代码实际上只是贴图,其代码量会大大降低。不过我还是要按钮步骤介绍一下接下来的工作,那就是区分状态。我们自绘的目的一方面是要让控件好看,另一方面就是要让控件活起来。所以区分空间的不同状态,以不同的方式绘制就显得很重要。在windows环境下,几乎所用的控件都要用鼠标去操作,而也就是鼠标使他们有了不同的状态。因此我设了一个变量m_nButtonState用来记录不同的按钮状态,在OnMouseHover、OnLButtonDown和OnLButtonUp中修改它的值,这样就使按钮活了起来。
    由于提供了源文件,我在文章里就不过多的提及程序了。如果大家发现代码有什么问题或有什么需要改进的地方希望能够提出来,我们一起讨论、共同提高。

你可能感兴趣的:(windows,工作,mfc)