当前位置:C++技术网 > 资讯 > 在按钮上设置图片,在按钮上显示图标

在按钮上设置图片,在按钮上显示图标

更新时间:2015-06-23 15:57:32浏览次数:1+次

    有时候为了让按钮代表的功能更加容易识别,我们通常可以在按钮上设置一个小图片,通常是图标(Icon)或位图(Bitmap)两种形式。默认情况下按钮是只显示文本的。为了显示图片,我们要额外的设置。
    SetIcon和SetBitmap两个函数都能够设置按钮的图片。两者的区别就是,前者设置所需的图片是Icon资源类型,而后者则是Bitmap类型。Icon类型对应于后缀名为.ico的文件,而Bitmap则对应于后缀名为.bmp的文件。放置在按钮上的图片不要过大,否则效果就不好了。如果我们有这样的小图片文件,我们可以添加到项目中,或者直接在项目中创建一个图标文件,或者直接使用系统的默认图标。下这两个函数使用上是类似的,只是函数名和需要的资源类型不一样而已,使用上是一样的,那么下面就以Icon类型的来做讲解,可以类推到Bitmap。
    图标资源的两种获取方式如下:
    1.使用系统的图标。使用系统的图标,在加载图标时不用指定程序实例,直接使用图标的ID即可。加载图标的函数为LoadIcon,第一个参数是实例句柄,第二个参数是资源的名字。对于系统的图标,第一个参数设为NULL,表示使用系统图标。第二个参数是资源的名字。名字可以直接是字符串名字。但是默认的是数字的ID,如IDI_ICON1,这样的是一个数字。这样的ID不能传给第二个参数。我们要将这个整数的ID转换成字符串的形式,使用MAKEINTRESOURCE(IDI_ICON1)宏即可把整数的ID转换成了字符串型的资源名字。当然,还可以直接传递字符串,那么我们在给资源ID时,在资源ID属性中给一个双引号括起来的ID,如"icon1"这样的形式,然后在第二个参数就直接传递一个字符串即可。但是因为是使用系统的,所以就使用整型ID,使用MAKEINTRESOURCE来转换。
    2.手动创建一个图标资源。在资源视图中,在Icon项右击,单击【插入Icon】即可,然后就可以像平常画图一样进行绘制,绘制完毕后,保存即可。然后给这个新建的图标资源给一个ID,ID有整型和字符型的,参看第一中形式的说明。还是使用LoadIcon函数。但是此时使用和第一种情况不一样了。第二个参数是一样的使用,但是第一个参数不能为NULL了,因为这个新建的图标不是系统的,是你这个程序特定的,因此要指定程序实例来确定是你这个程序的。很多人开始不知道如何获取程序实例而感觉很难。看看接下来的介绍,你就不会觉很清楚了,记住获取程序实例的方法,以后经常用到。使用AfxGetApp()->m_hInstance这个语句,就可以获得程序实例句柄,传进第一个参数即可。AfxGetApp()是获取程序实例对象的指针,得到指针就可以获得实例对象中的成员变量的实例句柄了。
    图标获得后,LoadIcon函数返回一个HICON的句柄,这个句柄就可以传递给SetIcon作为参数了。因为SetIcon是按钮控件类的,所以如果我们使用GetDlgItem(IDC_BTN1)这样获得的是指向CWnd的窗口对象的指针,是不能调用这个函数的,否则设置图标就会失败,我们需要进行一个指针类型转换,如((CButton*)GetDlgItem(IDC_BTN1)),这样就能够将指针类型转换成指向按钮对象的指针,就可以正常调用SetIcon函数了。
    如((CButton*)GetDlgItem(IDC_BTN1))->SetIcon(::LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON1)));这个语句将几个过程都放在一起实现了按钮图片的设置。
    当然如果你想获取一个按钮的图标,然后用这个按钮设置另外一个按钮的图标,也很简单。设置时只要传递图标句柄即可,这个句柄就通过GetIcon的返回值得到。这个函数没有参数,使用按钮指针调用即可。返回的HICON句柄直接传递给SetIcon即可。
    默认情况下是同时显示图标和文字,如果你不想显示文字,可以将按钮的属性中Icon设置为True,这样就只显示图标了。
    以上的所有情况都适合于Bitmap的形式,只要把Icon替换成Bitmap即可,如使用LoadIcon的函数LoadBitmap即可用来加载位图资源了。
    以上都是基本的实现说明,请自己参照实现。如有疑问,请留言。