CBitmap bitmap;
bitmap.LoadBitmap (IDB_BITMAP1);
CBrush brush(&bitmap);
CRect buttonplay;
GetDlgItem(IDC_PLAY)->GetWindowRect(&buttonplay);
CClientDC dc(this);
dc.FillRect (&buttonplay,&brush);
// CString str="RUN";
// SetDlgItemText(IDC_PLAY,str);
我建立了一个对话框,所有的button都在对话框上,上面的代码就是想改变一下按钮的颜色,请问这些代码要加在对话框类的什么地方呢,还有就是对话框与按钮之间到底是什么关系,是先画对话框,再画按钮吧?IDC_PLAY是按钮PLAY的ID.另外,FillRect函数好像不能达到预期目地,因为它虽然在对话框上画出来了一个矩形框,不过位置不对,有点乱画的感觉,但它的位置应该由buttonplay确定了的啊?

解决方案 »

  1.   

    试试在GetWindowRect后加一个ScreenToClient(&buttonplay)语句进行坐标转换
      

  2.   

    把按钮设置OwnerDraw风格,然后响应WM_DRAWITEM消息,用消息传递过来的结构中的DC来绘制。
      

  3.   

    改变对话框按钮颜色试试重载CDialog::OnCtlColor()
     
    最方便的就是去vckbase网站下载颜色按钮的类,很好用的,呵呵
      

  4.   

    对话框中按钮的颜色和背景色是不能在CDialog::OnCtlColor() 函数用改变的。首先设置按钮的OwnerDraw风格风格。
    然后将此按钮派生与CButton类在子类的DrawItem(LPDRAWITEMSTRUCT lpDIS)函数中设置,此函数为虚函数。网上有一个CButtonST类,专为实际的开发中做的Button类,功能十分强大。
      

  5.   

    void CButtonEx::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
    {
    // TODO: Add your code to draw the specified item
    CRect rc;
    GetClientRect(&rc);
    CDC dc;
    using namespace Gdiplus;//应用 GDI+前必须的设置
    Graphics graph(GetDC()->m_hDC); if(m_ResoucePath.IsEmpty())
    {
    Image image(L"E:\\图片相关\\我的作品\\GDI+BUTTON 水晶1.png");
    graph.DrawImage(&image,0,0,rc.right-rc.left,rc.bottom-rc.top);
    }

    }
      

  6.   


    不一定哦! 看看我的代码:HBRUSH CXXXDLG::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);  pDC->SelectObject(&dFon); if (pWnd->GetDlgCtrlID() == IDOK) 

    if(COLORFLAG==TRUE)
    {
    pDC->SetTextColor(RGB(255,255,255)); 
    pDC->SetBkColor(RGB(255,0,0));
    pDC->SetBkMode(TRANSPARENT);
    pDC->TextOut(54,9,"警告"); return m_hRedBrush; 
    }else{ pDC->SetTextColor(RGB(0,0,0)); 
    pDC->SetBkColor(RGB(255,0,255));
    pDC->SetBkMode(TRANSPARENT);
    pDC->TextOut(54,9,"警告");
    return m_hWitBrush;
    }
    }  return hbr;
    }我就是在Dialog的OnCtlColor来改变按钮的颜色的。
    IDOK就是按钮的ID喽。
      

  7.   

    感谢各位,我现在看过的代码中主要有两种方法来改变按钮的背景,一种是2楼所说的,另一种是4楼所提到的,好像CButtonST类不用设置按钮的OwnerDraw风格了吧?由于你们提的方法较多,我还没有一一去试验,不过我又碰上了另一个问题了.这回我改了一下按钮的风格,选上了bitmap属性,直接用一个位图来填充,
    HBITMAP m_hbmp;
    m_hbmp=::LoadBitmap (HINSTANCE(GetModuleHandle(NULL)),MAKEINTRESOURCE(IDB_BITMAP1));
    m_play.SetBitmap (m_hbmp);
    m_play是关联到play按钮的一个变量,但不知道为什么没有界面,但产生了exe文件,只要去掉关联到按钮的变量之后就一切正常.
      

  8.   

    m_play是什么类型,OnInitDialog和DoDataExchange中的代码是怎么写的?
      

  9.   

    CButtonST我这边有啊 !谁要六个 邮箱啊!免费啊
      

  10.   

    在按钮类中响应WM_ERASEBKGND消息,直接返回TRUE,不调用基类的函数。
      

  11.   

    再试试给父窗口加上WS_CLIPCHILDREN。
    也可能是你绘制的速度太慢。