由于某种原因,如改变背景和设置字体颜色,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,请问为什么?
}
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,请问为什么?
}
我要的就是一个BUTTON,他的外观和普通的一样,但字体的颜色我要求是红的,你能做到吗?用自绘能绘出普通按钮的外观吗?那不太麻烦了,所以我才想到用STATIC代替BUTTON的,我想了很久,这种方法最省事了!因为让STATIC改变字体颜色太容易了,只需在父窗口的ONCTLCOLOR中处理就搞定了!
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 ;
}
大家还是帮我解决STATIC重绘的问题吧,RedrawWindow();函数也试了,都不行。
本来我说的那个方法就不错了,完全能模拟出按钮被按的效果,但它就是不重绘,我怀疑微软的计算机就是这样做的,它的按键应该不是BUTTON,而是STATIC。
只要能解决STATIC的重绘问题,然后给它换背影,换字体,换字体颜色都会很容易了,因为有WM_CTLCOLOR的支持,但却有可能达到自绘窗口的效果,所以可以说是最完美的了。
//GetDlgItem(IDC_OPEN)->Invalidate(); //这里不能使整个应用重绘,由于效率的原因!
改成
Invalidate();