在网上看了些做界面的教程,跟着学做,他是这么写的
1,按钮属性 Owner Drew选上,按钮ID: IDC_BUTTON1
2,定义变量:
CBitmapButton m_button;
3,在初始化里边
m_button.LoadBitmaps(_T("IDB_BITMAP3"),_T("IDB_BITMAP4"),_T("IDB_BITMAP3"),_T("IDB_BITMAP5"));我跟着做了,按钮属性选择了Bitmap和OwnerDraw风格,也和变量关联了,其中他说的定义变量要在哪里定义阿?我先是定义的全局变量,可编译出错说,LoadBitmaps()不是成员,我定义在初始化里也不对,编译连接都没问题,运行时出错,好像是说我没有关联变量,可我明明关联了的,我忽略后,看见界面按钮位置没有预想的图片,而是白色一片,高手帮帮忙啊,不胜感谢!

解决方案 »

  1.   

    在资源视中,右键点击按钮,添加变量。选择CButton类,变量名是m_button。
    在CxxDlg.H文件中将CButton m_button;改为CBitmapButton m_button; 
      

  2.   

    4,m_button.SubclassDlgItem(IDC_BUTTON1, this);
    5,m_button.SizeToContent();
      

  3.   

    m_button.AutoLoad(IDC_BUTTON1, this);
      

  4.   

    http://hi.baidu.com/%BF%AA%D0%C4_%D0%D6%B5%DC/blog/item/2f6d3b10f85370fac2ce794a.html
      

  5.   

    CBitmapButton m_button; 要定义为成员变量,定义的方法如1楼所说
      

  6.   

    m_button.LoadBitmaps(IDB_BITMAP3,NULL,NULL,NULL);//为一个按钮加载一副图片
      

  7.   

    参看下面文章:
    http://www.joyvc.cn/GuiAndWindows/GuiAndWindows00030.html第一种:
            Button属性页里Style的Bitmap点上        CBitmap Bitmap;
            Bitmap.LoadBitmap(IDB_BITMAP1);
            HBITMAP hBitmap=(HBITMAP)Bitmap.Detach();
            CButton *pButton=(CButton*)GetDlgItem(IDCANCEL);
            pButton->SetBitmap(hBitmap);        感觉效果不是很好。因为图片不会自动拉伸。        第二种:
            可以采用CButtonST控件,挺好用的,比MFC的那些封装好用。        第三种:
            把button按钮属性设置为ower draw
            然后映射onDrawItem消息
            在ondraw函数内自己绘制就可以了
            void CUi6Dlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
            {
                    if(nIDCtl == IDC_HELLO_CFAN)
                    {
                            //绘制按钮框架
                            UINT uStyle = DFCS_BUTTONPUSH;
                            //是否按下去了?
                            if (lpDrawItemStruct->itemState & ODS_SELECTED)
                                    uStyle |= DFCS_PUSHED;
                            CDC dc;
                            dc.Attach(lpDrawItemStruct->hDC);
                            dc.DrawFrameControl(&lpDrawItemStruct->rcItem, DFC_BUTTON, uStyle);
                            //输出文字
                            dc.SelectObject(&m_Font);
                            dc.SetTextColor(RGB(0, 0, 255));
                            dc.SetBkMode(TRANSPARENT);
                            CString sText;
                            m_HelloCFan.GetWindowText(sText);
                            dc.TextOut(lpDrawItemStruct->rcItem.left + 20, lpDrawItemStruct->rcItem.top + 20, sText);
                            //是否得到焦点
                            if(lpDrawItemStruct->itemState & ODS_FOCUS)
                           {
                                    //画虚框
                                    CRect rtFocus = lpDrawItemStruct->rcItem;
                                    rtFocus.DeflateRect(3, 3);
                                    dc.DrawFocusRect(&rtFocus);
                            }
                            return;
                    }
                    CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
            }        第四种:
            1. 按钮属性 Onwer Drew选上,按钮ID: IDC_BUTTON1
            2. 定义private变量:
            CBitmapButton m_button;
            3. 在初始化里边
            m_button.LoadBitmaps(IDB_BITMAP1, IDB_BITMAP2);//IDB_BITMAP1:平时;IDB_BITMAP2:按下
            m_button.SubclassDlgItem(IDC_BUTTON1, this);
            m_button.SizeToContent();
            这种方法还可以。  
      

  8.   

    你的改变按钮图片代码是不是写在OnInitDialog()里面呢?应该不能写在PreCreateWindow()等等那些函数里面哦。
      

  9.   

    恩,是写在OnInitDialog()里面的
      

  10.   

    1,按钮属性 Owner Drew选上,按钮ID: IDC_BUTTON1 
    2,定义变量: 
    CBitmapButton m_button; 
    3,在初始化里边 
    m_button.LoadBitmaps(_T("IDB_BITMAP3"),_T("IDB_BITMAP4"),_T("IDB_BITMAP3"),_T("IDB_BITMAP5")); 
    ============================
    1,按钮属性 Owner Drew选上,按钮ID: IDC_BUTTON1 
    2,定义变量: 
    CBitmapButton m_button; 
    3、把该变量与按钮控件关联起来:DDX_Control(pDX, IDC_BUTTON1, m_button);4,在初始化里边 
    m_button.LoadBitmaps(_T("IDB_BITMAP3"),_T("IDB_BITMAP4"),_T("IDB_BITMAP3"),_T("IDB_BITMAP5"));红色部分你设置了没有。 
      

  11.   

    把该变量与按钮控件关联起来:DDX_Control(pDX, IDC_BUTTON1, m_button);
      

  12.   

    DoDataExchange(CDataExchange* pDX)里面已经关联了的,有DDX_Control(pDX, IDC_BUTTON1, m_button);这条语句了。
      

  13.   

    按你原本的思路完整给你说一遍:
    1,按钮属性 Owner Drew选上,按钮ID: IDC_BUTTON1 
    2,定义变量: 
    CBitmapButton m_button; 
    3,在初始化里边 
    m_button.AutoLoad(IDC_BUTTON1, this);
    m_button.LoadBitmaps(_T("IDB_BITMAP3"),_T("IDB_BITMAP4"),_T("IDB_BITMAP3"),_T("IDB_BITMAP5")); 这样就可以了。
      

  14.   

    还是运行时出错,说是Debug Assertion failed 是什么原因阿?
      

  15.   


    参加18楼的代码,你这个错误不应该是CBitmapButton引起,你可以把相关代码注释掉,测试下是哪部分代码引起的问题
      

  16.   

    单步运行到这一句就会出错:if (!pThread->InitInstance())
    实在 SRC 里面的WINMAIN.CPP里的。
      

  17.   

    停在这条代码上: ASSERT(m_hWnd == NULL);     // only attach once, detach on destroy
    提示是:Loaded 'C:\WINDOWS\system32\psapi.dll', no matching symbolic information found.
    Loaded 'C:\WINDOWS\system32\MSCTFIME.IME', no matching symbolic information found.
    Loaded 'C:\WINDOWS\system32\mslbui.dll', no matching symbolic information found.
      

  18.   

    谢谢大家,问题解决了,是因为子类化时不应该绑定控件,在CMyDlg::DoDataExchange(CDataExchange* pDX)中将DDX_Control(pDX, IDC_BUTTON1, m_StartBtn);注释掉就好了。收工给分,再次谢谢大家!!!