在OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)中改变控件背景色.字体色时,其他都可以但按钮的改变不了请高手指点

解决方案 »

  1.   

    我试过很多好像都不行还是自己重画控件吧。drawitem
    或者到网络上找一个别人写好的控件自己在去修改吧。
      

  2.   

    按钮不能通过OnCtlColor来改变背景,继承在DrawItem()里改写把!
      

  3.   

    if((nCtlColor == CTLCOLOR_BTN) && (pWnd->GetDlgCtrlID()==IDC_BUTTON1))
    {

    HBITMAP hBitmap;
    hBitmap = (HBITMAP)::LoadImage(AfxGetApp()->m_hInstance  ,"c://bag.gif",0,0,0,0); // = CreateBitmap(8, 8, 1, 1, (LPSTR)wWeave);
    hbr = CreatePatternBrush(hBitmap);
    pDC->SetTextColor(RGB(0,0,255)); //改变字体的颜色
        hbr=(HBRUSH) m_bluebrush;
    }
      

  4.   

    自己重画控件吧...drawitem
    不过我使用的是CButtonST类,蛮好用的
    如果觉得不满意,自己还可以添加一些需要的函数
      

  5.   

    用OnCtlColor()是无法改变按钮的背景色的!
    要想改变按钮的背景色只有自己画按钮了!
    网上有很多例子,搜索一下,一大堆的!呵呵……
      

  6.   

    重载 DrawItem 函数自绘,这样的话就需要自己绘制文本和图标
    推荐使用 CButtonST 类,不用自己再写代码了
    http://www.vckbase.com/code/listcode.asp?mclsid=3&sclsid=301&page=2
      

  7.   

    映射WM_CTLCOLOR消息。当然你在ClassWizard里面找不到这个消息的,你可以这样做:
    打开ClassWizard,选择最后一个属性页ClassInfo,在本页面下半部,有一个Message Filter下拉列表框,一般默认是Dialog,你把它改成Window,然后回到第一个页面Message Maps,就能看到WM_CTLCOLOR消息了。再给你一个示范代码:
    void CChangeColorDlg::OnButtonChangecolor() 
    {
    CDC dc;
    SendMessage(WM_CTLCOLOREDIT, (WPARAM) dc.GetSafeHdc(), 0);
    GetDlgItem(IDC_EDIT_TEST)->SetFocus();
    }HBRUSH CChangeColorDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    //Generate pseudorandom number
    int R = rand()%255;
    int G = rand()%255;
    int B = rand()%255;

    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

    SetTextColor(pDC->m_hDC, RGB(R,G,B));
    return hbr;
    }
      

  8.   

    上面这个代码是我用另外一个消息WM_CTLCOLOREDIT修改编辑框里面字体的颜色的,颜色的RGB值是随机产生的,只是演示用。
      

  9.   

    http://www.powerba.com/develop/vc/article/20000725003.htm
    这里讲的也非常好
      

  10.   

    if(nCtlColor==CTLCOLOR_LISTBOX)
    {
    //pDC->SetBkMode(TRANSPARENT);
    pDC->SetTextColor(RGB(0,0,0));
    pDC->SetBkColor(RGB(233,233,220));
    HBRUSH b=CreateSolidBrush(RGB(233,233,220));
    return b;
    }
    else if(nCtlColor==CTLCOLOR_SCROLLBAR)
    {
    //pDC->SetBkMode(TRANSPARENT);
    pDC->SetTextColor(RGB(0,0,0));
    pDC->SetBkColor(RGB(233,233,220));
    HBRUSH b=CreateSolidBrush(RGB(233,233,220));
    return b;
    }
    else if(nCtlColor==CTLCOLOR_EDIT)
    {
    //pDC->SetBkMode(TRANSPARENT);
    pDC->SetTextColor(RGB(0,0,0));
    pDC->SetBkColor(RGB(233,233,220));
    HBRUSH b=CreateSolidBrush(RGB(233,233,220));
    return b;
    }
    else if(nCtlColor==CTLCOLOR_STATIC)
    {
    pDC->SetTextColor(RGB(0,0,0));
    pDC->SetBkColor(RGB(160,180,220));
    HBRUSH b=CreateSolidBrush(RGB(160,180,220));
    return b;
    }
    else if(nCtlColor==CTLCOLOR_DLG)
    {
    pDC->SetTextColor(RGB(0,0,0));
    pDC->SetBkColor(RGB(160,180,220));
    HBRUSH b=CreateSolidBrush(RGB(160,180,220));
    return b;
    }
    else if(nCtlColor == CTLCOLOR_BTN)
    {
    pDC->SetTextColor(RGB(0,0,0));
    pDC->SetBkColor(RGB(233,233,220));
    HBRUSH b=CreateSolidBrush(RGB(233,233,220));
    return b;
    }
      

  11.   

    对于具体的控件可以从CEDIT继承类,在其中重载=WM_CTLCOLOR(即REFLECT消息),再pDC->setTextColor(..),return (HBRUSH*)(m_brushBak.getsafeHwnd()),看看MSDN的反射消息,应该可以的!
      

  12.   

    楼上的各位说的真够详细的,VCKBASE
      

  13.   

    改不了按钮
    是因为没有把按钮的owner drawer勾中
    你再试一下