由于某种原因,如改变背景和设置字体颜色,Static Text都优于Button,所以我决定用Static Text代替Button,我的程序如下:
void CTestButtonDlg::OnOpen() //用户点击IDC_OPEN这个Static Text时的处理函数
{
GetDlgItem(IDC_OPEN)->ModifyStyleEx(WS_EX_DLGMODALFRAME,0);
//在资源管理器中建立IDC_OPEN时选择了WS_EX_DLGMODALFRAME属性,于是它看起来和Button一样
//这个时候去掉这个属性,因为要模拟按钮被按下
GetDlgItem(IDC_OPEN)->ModifyStyle(0,SS_SUNKEN);
//加上这个使按钮下沉的属性
GetDlgItem(IDC_OPEN)->Invalidate(); //这里不能使整个应用重绘,由于效率的原因!
//这里想使上面的更改生效,可是事与愿为,它不生效,必需要把IDC_OPEN拖出屏幕或是最小化再最大化后才能看到效果
//而且效果还不正确,没有加上SS_SUNKEN,只是去掉了WS_EX_DLGMODALFRAME,请问为什么?
}

解决方案 »

  1.   

    override and rewrite the Virtual function DrawItem();
      

  2.   

    GetDlgItem(IDC_OPEN)->RedrawWindow();
      

  3.   

    如果你们真的能解决这个问题也好啊!
    我要的就是一个BUTTON,他的外观和普通的一样,但字体的颜色我要求是红的,你能做到吗?用自绘能绘出普通按钮的外观吗?那不太麻烦了,所以我才想到用STATIC代替BUTTON的,我想了很久,这种方法最省事了!因为让STATIC改变字体颜色太容易了,只需在父窗口的ONCTLCOLOR中处理就搞定了!
      

  4.   

    去CodeProject下载一个ButtonST类 一切OK
      

  5.   

    用google搜索CButtonST,下载这个类,加入工程,再把那个按钮定义为这个类的变量,看看有没有SetTextColor()之类的方法,记住在对话框的头文件中包含该类的头文件进来。
      

  6.   

    在父窗口中的WM_CTLCOLOR中写如下代码就可以了
    HBRUSH CParentWnd::OnCtlColor(CDC* pdc,CWnd* pWnd,UINT nCtlID)
    {
         HBRUSH hbr = CDialog::OnCtlColor(pdc,pWnd,nCtlID) ;
         if(nCtlID == CTLCOLOR_BTN)
         {
             pdc->SetBkMode(TRANSPARENT) ;
             pdc->SelectObject(&brush) ;//brush为要显示的背景色
         }
         return hbr ;
    }
      

  7.   

    楼上的,这个方法对于BUTTON不行啊,你试过吗?
    大家还是帮我解决STATIC重绘的问题吧,RedrawWindow();函数也试了,都不行。
    本来我说的那个方法就不错了,完全能模拟出按钮被按的效果,但它就是不重绘,我怀疑微软的计算机就是这样做的,它的按键应该不是BUTTON,而是STATIC。
    只要能解决STATIC的重绘问题,然后给它换背影,换字体,换字体颜色都会很容易了,因为有WM_CTLCOLOR的支持,但却有可能达到自绘窗口的效果,所以可以说是最完美的了。
      

  8.   

    我不知用mfc该怎么写,但用sdk的话可以处理按钮所在窗口的WM_CTLCOLORBTN消息。此消息在按钮对自己进行着色时发送到父窗口,即按钮所在窗口。基于Windows一切元素皆窗口概念,对这消息传递过来的按钮的句柄进行处理,想设置前背景色字体皆由你随心所欲。不过,Static Text是Static。似乎有些地方同非Static不同,不过我想不起来。楼主先做做看
      

  9.   

    不要使用GetDlgItem,直接用Invalidate();
    //GetDlgItem(IDC_OPEN)->Invalidate(); //这里不能使整个应用重绘,由于效率的原因!
    改成
    Invalidate();