创建一个MFC的对话框程序,对话框上有四个Button按钮,按钮上要贴PNG图片,按钮大小自适应PNG图片大小。当单击Button1后,PNG图片切换成另一张PNG图片。 然后当我单击Button2后,PNG图片切换成另一张PNG图片,此时Button1按钮自动切换成初始化的PNG图片。。  (要实现的是:鼠标单击后,不是鼠标放上,按下。鼠标放上,按下的效果暂不实现。如果实现了,那更好。)  当我单击Button3后,切换另一张PNG图片,其他的按钮自动切换到初始化PNG图片  其他按钮同理望,CSDN中的高手们给予解决,鼠标单击后的效果。。谢谢啊!在网上看了些,都是用GDI+ 实现。 可是没有比较完整的代码实例。。望,CSDN中的高手们给予解决,感谢啊! GDI+的初始化我都实现了stdafx.h:#include <gdiplus.h>
using namespace Gdiplus;
#pragma comment( lib, "gdiplus.lib" )
TestButtonPng.h:protected:
GdiplusStartupInput m_gdiplusStartupInput;
ULONG_PTR gdiplusToken;
public:
virtual int ExitInstance();
TestButtonPng.cpp:
BOOL CTestButtonPngApp::InitInstance()
{
        GdiplusStartupInput gdiplusStartupInput;
GdiplusStartup(&gdiplusToken,&gdiplusStartupInput,NULL);

INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// 将它设置为包括所有要在应用程序中使用的
// 公共控件类。
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls); CWinApp::InitInstance(); AfxEnableControlContainer();
}int CTestButtonPngApp::ExitInstance()
{
// TODO: 在此添加专用代码和/或调用基类
 GdiplusShutdown(gdiplusToken); return CWinApp::ExitInstance();
}
望高手们帮忙看看。

解决方案 »

  1.   

    找个png的类啊。设置按钮的图片。
      

  2.   

    http://blog.csdn.net/blackoto/article/details/4583863
      

  3.   

    http://blog.sina.com.cn/s/blog_56fd66a70100hxib.html这个不错。
      

  4.   

    用我的吧
    http://download.csdn.net/detail/mhwer99/3719771
      

  5.   

    能贴源码吗?我的CSDN没分了。或者发送到我的QQ。谢谢啦![email protected]
      

  6.   

    .h 文件:
    public:
    void OnLoadPng(void);
    public:
    CButton m_ButtonOne;  //先关联一个Button1按钮。
    .cpp 文件:
    void CTestButtonPngDlg::OnLoadPng()
    {
    Graphics graphics(m_ButtonOne.GetWindowDC()->m_hDC);
    Image image(L"imgaresed\\11.png", TRUE); //图片的路径,我把imgaresed文件夹图片放在res中
    graphics.DrawImage(&image,0,0);}我调试,运行都对。 结果没有反应。 在OnInitDialog()中调用不行,OnPaint()也不行。这个函数怎么调用。
      

  7.   

    高级界面里面,有一种button已经实现了,你只要传入不同的图片即可!
      

  8.   

    用png做按钮不难
    但要想实现透明效果会比较麻烦
      

  9.   


    一 、在stdafx.h文件中添加头文件,命名空间,库的引用,
     
    #include <gdiplus.h>
    using namespace Gdiplus;
    #pragma comment( lib, "gdiplus.lib" )
     
    二、在程序实现文件中添加全局变量
    ULONG_PTR gdiplusToken;
     
     
    三、在应用程序初始化时进行GDI+的初始化
    BOOL CXXXApp::InitInstance()
    {
         INITCOMMONCONTROLSEX InitCtrls;
         InitCtrls.dwSize = sizeof(InitCtrls);
         InitCtrls.dwICC = ICC_WIN95_CLASSES;
         InitCommonControlsEx(&InitCtrls);
         CWinApp::InitInstance();
         AfxEnableControlContainer();
        
         GdiplusStartupInput gdiplusStartupInput;
         GdiplusStartup(&gdiplusToken,&gdiplusStartupInput,NULL);
     
    //省略其他代码
         return FALSE;
    }
     
    四、重写ExitInstance函数
     
    int CXXXApp::ExitInstance()
    {
         // TODO: 在此添加专用代码和/或调用基类
        GdiplusShutdown(gdiplusToken);
         return CWinApp::ExitInstance();
    }
    五、添加两个按钮为按钮1添加控件变量
    CButton m_Button_ctlTest;
     
    添加函数OnLoadPng()
    void CXXXDlg::OnLoadPng()
    {
        
         Graphics graphics(m_Button_ctlTest.GetWindowDC()->m_hDC);
         Image image(L"picture\\test.png", TRUE);
         //picture\\test.png是png文件的路径
         graphics.DrawImage(&image,0,0);
        
    }
    在按钮2中调用OnLoadPng()函数。
     
    点击按钮2的时候,就会看到按钮1载入了png图片。 按照上面的方法编译运行是对的,可是没有效果。
      

  10.   

    要想实现这种按钮,其实不是很难,首先实现PNG图贴上去,然后就是个逻辑问题..
    我这有个自己通过自绘按钮方式实现类似于360界面按钮的按钮...看是否符合你的要求...我里面用的是位图,把位图改成PNG图片就可以了...
      

  11.   

    能否贴个代码,看看! 先谢谢啦! 或发到从位图直接改为PNG图片,好像要修改里面的代码吧!我也是按你这样的思路,现在是初始化PNG图片贴到按钮上都不行。运行的都对,没效果。
    小弟刚出,在公司实习,每天做练习跟项目相关的。
      

  12.   

    有现成的CBitmapBtn这个类,你搜索一下,没有的话,找我要
      

  13.   

    吴先生,您给我的那个编程百例,我一个个看,没有PNG的,单击按钮后就变成另一个PNG图片。 我现在初始化都没实现,下面的功能就根本不用说了。我当然想要那CBitmapBtn实例代码。  谢谢吴先生。 我去网上看看。
      

  14.   

    http://blog.csdn.net/chenlycly/article/details/5864367
      

  15.   

    吴先生,您给我的基本上都是现实Bmp图片格式的。这个我把您给我的资料都保留着。 以后用。 可是现在要实现PNG格式的图片按钮。
    创建一个MFC的对话框程序,对话框上有四个Button按钮,按钮上要贴PNG图片,按钮大小自适应PNG图片大小。当单击Button1后,PNG图片切换成另一张PNG图片。 然后当我单击Button2后,PNG图片切换成另一张PNG图片,此时Button1按钮自动切换成初始化的PNG图片。。 (要实现的是:鼠标单击后,不是鼠标放上,按下。鼠标放上,按下的效果暂不实现。如果实现了,那更好。) 当我单击Button3后,切换另一张PNG图片,其他的按钮自动切换到初始化PNG图片 其他按钮同理
      

  16.   

    这个按钮接近你的要求...只要把BMP图片改成PNG图片就行了...
    http://download.csdn.net/detail/allen_lanyuhai/3658158
      

  17.   

    强烈建议用Win32的API,不要用MFC
      

  18.   

    为什么啊! 小弟刚出来,公司实习,做些跟项目相关的练习,以后备用。 Win32只学了点点。我现在MFC都不是很熟悉,好多问题都是问CSDN里面的高手。很感谢他们。能不能介绍一些好的视频和资料,关于Win32的。。 谢谢!
      

  19.   

    .h 文件:
    public:
    CBitmapButton  m_btnOne;
    CBitmapButton  m_btnTwo;
    ......BOOL CDialogTrain::OnInitDialog()
    {
           //初始化BMP按钮图片
    m_btnOne.LoadBitmaps(IDB_BITMAP4);   
    m_btnOne.SubclassDlgItem(IDC_BUTTON_TR_ONE,this);   
    m_btnOne.SizeToContent();        //-------------------------------
            m_btnTwo.LoadBitmaps(IDB_BITMAP37);   
    m_btnTwo.SubclassDlgItem(IDC_BUTTON_TR_TWO,this);   
    m_btnTwo.SizeToContent();        return TRUE;  // return TRUE unless you set the focus to a control
    // 异常: OCX 属性页应返回 FALSE 
    }我现在要导入PNG图片:
    BOOL CTestBtnPngDlg::OnInitDialog()
    {
    //初始化PNG图片按钮-----------------------------
    m_ButtonOne.LoadBitmaps(IDB_PNG1);
    m_ButtonOne.SubclassDlgItem(IDC_BUTTON_ONE,this);
    m_ButtonOne.SizeToContent();

    //------------------------------
    m_ButtonTwo.LoadBitmaps(IDB_PNG2);
    m_ButtonTwo.SubclassDlgItem(IDC_BUTTON_TWO,this);
    m_ButtonTwo.SizeToContent(); return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
    }导入PNG图片运行的时候就崩了。 PNG图片不能直接像BMP那样用吗?
    帮忙看看!
      

  20.   

    包含了头文件:#include "atlimage.h"        CImage image;
    CBitmap bitmap;
    image.Load(_T("res//imgaresed//11.png"));
    HBITMAP hbmp = image.Detach();
    bitmap.Attach(hbmp);动态加载PNG图片到按钮上。 上面的代码我放到初始化,OnPaint(); 怎么都不行啊。编译运行都没错,就是没显示PNG图片。。  
    望,高手们帮忙看看。 怎么把这段代码跟Button关联,显示到按钮上
      

  21.   

    还没搞定么?是我的代码吗?
    要想动态加载png只要改一下这个函数就可以了
    BOOL CMyButton::LoadStpImage(LPCWSTR normal, LPCTSTR mask, LPCTSTR pType)
    {
    m_pStdImage = new CGdiPlusBitmapResource;

    bool ret = m_pStdImage->LoadFromFile(normal);//, pType);

    m_bMask.DeleteObject();

    if(mask != "")
    {
    HBITMAP hBitmap= (HBITMAP)::LoadImage(NULL,mask,IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);
    if (hBitmap == NULL)
    {
    return FALSE;
    } m_bMask.Attach(hBitmap);
    if (hClipRgn) DeleteObject(hClipRgn);
    hClipRgn = CreateRgnFromBitmap(m_bMask, RGB(255,255,255));
    if (hClipRgn)
    {
    SetWindowRgn(hClipRgn, TRUE);
    SelectClipRgn((HDC)GetDC(),hClipRgn);
    SetWindowPos(NULL,0,0,GetBitmapWidth(m_bMask),GetBitmapHeight(m_bMask),SWP_NOZORDER|SWP_NOMOVE);//设置按钮大小
    }

    }
    return ret;
    }调用的时候这样写
    CString nomp;//png图片路径
    CString headp;//bmp图片路径
    ...
    LPCWSTR pChar = 0; 
    USES_CONVERSION; 
    pChar = A2CW((LPCSTR)nomp); 
    m_MyButton->LoadStpImage(pChar, headp, _T("PNG"));
    m_MyButton->ShowWindow(SW_SHOW);
      

  22.   

    LoadStpImage()这个函数是CMyButton这个类中的。有没CMybutton类这个代码
      

  23.   

    http://download.csdn.net/detail/mhwer99/3719771
    你自己去下吧
      

  24.   

    我也碰到了,button上加载并变换png透明图片,求方法